2012-01-27 114 views
11

这是交易。我有一个大字符数组,并试图操纵它。下面是一些代码,我使用来测试这个想法:C指针故障

#include <stdio.h> 

char r[65536],*e=r; 

main() { 
    e+=8; 
    while(*e) { 
     *e+=1; 
     e+=5; 
     *e-=1; 
     e-=1; 
    } 
    *e+=1; 
    printf("%i",*e); 
    printf(" %c",e); 
} 

什么它应该做的是:

  1. 设置为8
  2. 的第一个元素之后,而目前的元素不为零,
    1. 移动到下一个单元格
    2. 添加5〜它
    3. 回迁
    4. 减去一个。 (此重复8次,因为同时测试将失败时,它已经减去最后一个)
  3. 显示指针
  4. 显示阵列,该指针指向(希望)的内容的位置

作用:

1 Φ 

,而不是

40 ( 

^^ 8 x 5 = 40,这就是它应该显示的内容。

任何提示/建议/批评接受。

+0

你几乎可以得到它,但是当你用* e定义一个指针时,你不需要把它称为* e只是e,并且给你指针的内存地址。当你再次像* e + = 8一样时,你正在解引用它,并在ASCII值char中加上8,这使得它有一些其他的字符。 – L7ColWinters 2012-01-27 14:01:10

+3

请注意,'main'应该返回一个'int'(通常为0)。 – 2012-01-27 14:38:23

+0

你也应该初始化你的数组。在* e + = 8之后不能保证* e是8;' – user606723 2012-01-27 17:31:04

回答

10

你提领究竟,你应该,反之亦然。你的意思做的是:

*e+=8; 
while(*e) { 
    e+=1; 
    *e+=5; 
    e-=1; 
    *e-=1; 
} 
*e+=1; 
printf("%d",e - r); //index 
printf(" %p",e); //pointer value  
printf(" %c",*e); //pointee value 

*检索值的指针指向。

+3

不是“完全”。 'while'的控制条件是正确的。 – 2012-01-27 14:31:37

7

“的第一个元素设置为8” 将是

*e = 8; 

“移动到下一个小区” 将是

e += 1; 

等。

With e您正在访问指针,地址。递增/递减它会使指针前后移动。

With *e您可以访问它指向的值(取消引用它)。

您在大多数时间都是以相反的方式使用它。

备注:请注意,在e声明你必须写char *e = r;初始化指针(不是值)。这里*指定e的类型。声明如下:e是指向char,其值为(的地址)e ---它与char *r; r = e;类似。

+0

那么,'* e'而不是'e'?我很困惑。 *部分是指价值或位置?编辑:它的工作原理,我用'e's把所有'*'换掉,反之亦然。谢谢! – itdoesntwork 2012-01-27 14:02:58

+3

'e'是位置。 '* e'是价值。 – asaelr 2012-01-27 14:04:42

6

*edereferences指针;也就是说,它操纵指向的值。操纵指针本身意味着直接操作e

当你做e+=5时,如果你做的是*e+=5,那么你将指针向前移动5个空格,然后给指针指向的值加5。

2

您误解了指针算术和解引用。

*e用于访问哪些e点,所以*e += 1增加什么e点的价值,而不是进入到下一个地址。另外,e += 8增加了实际指针,并且e现在将指向数组中的第九个条目。

2

你混淆了你的取消引用。调用指针时,运算符会给出存储在该位置的数据。没有它给你的地址。

0
#include <stdio.h> 

char r[65536], *e=r; 

int main() 
{ 
    *e = 8; 
    while (*e) { 
     e++; 
     *e += 5; 
     e--; 
     *e -= 1; 
    } 
    e++; 
    printf("%p %c\n", e, *e); 
    return 0; 
} 
1

可能的解决办法:

#include <stdio.h> 

char r[65536]; 
char* e = r; 

main() { 
    *e = 8; 
    while(*e) { 
     e++; 
     *e+=5; 
     e--; 
     *e-=1; 
    } 
    e++; 
    printf("position : %i\n",e-r); 
    printf("value : %c\n",*e); 
} 

您只需混合*和&。

如果P是一个指针,那么* P是指针指向的值。 如果V是一个值,则& V是存储值的地址。