int b[2], *ptr;
b[0] = 5;
b[1] = 7;
ptr = &b[0];
*ptr++ = 66;
printf("%d", *ptr);
为什么我被允许做*ptr++ = 66
一行,即使= 66
位似乎什么都不做?当我打印*ptr
它是7.任何人都可以解释为什么?编译器不应该抱怨= 66
位没有效果吗?C - 为什么我允许这样做?
是不是*ptr++ = 66
基本上相当于7 = 66
?
int b[2], *ptr;
b[0] = 5;
b[1] = 7;
ptr = &b[0];
*ptr++ = 66;
printf("%d", *ptr);
为什么我被允许做*ptr++ = 66
一行,即使= 66
位似乎什么都不做?当我打印*ptr
它是7.任何人都可以解释为什么?编译器不应该抱怨= 66
位没有效果吗?C - 为什么我允许这样做?
是不是*ptr++ = 66
基本上相当于7 = 66
?
发生了什么事是这样的:
b[0]
因为你deferencing ptr
分配的66
一个值,即你正在做*ptr
,然后进行分配
指针本身被递增,即&b[0]++
,成为&b[1]
ptr
现在指向b[1]
,这是7
换一种方式:在两个完全不同的事情进行的增量和分配。并且由于它是后缀增量,所以在其原始地址接收新值之后,指针增加。
的ptr++
被称为后递增,这意味着你第一使用的ptr
旧值(覆盖5
),然后增加ptr
。
谢谢!所以等价的代码基本上是* ptr = 66; * PTR ++ ;?这对我有意义。 – Sam 2011-04-10 06:27:20
其实这是没有道理的,那么* ptr就是67. – Sam 2011-04-10 06:27:46
它相当于'* ptr = 66; PTR ++'。这意味着你增加了*指针*,而不是它指向的内容。 – Lindydancer 2011-04-10 06:35:01
您增加指针。如果你想增加指针的值,使用(*ptr)++
。
'的ptr = &b[0];'是多余的;你可以使用'ptr = buf'来代替。 – dawg 2011-04-12 04:22:13