C 为什么我可以这样做?
为什么允许我执行C 为什么我可以这样做?,c,pointers,C,Pointers,为什么允许我执行*ptr++=66行,即使=66位似乎不起作用?当我打印*ptr时是7。有人能解释为什么吗?编译器不应该抱怨=66位没有效果吗 *ptr++=66是否基本等同于7=66?您正在增加指针。然后指向b[1]。b[0]的值可能是66。发生的情况是: b[0]被分配一个值66,因为您正在延迟ptr,即您正在执行*ptr,然后执行赋值 指针本身是递增的,即&b[0]++,它变成&b[1] ptr现在指向b[1],即7 换句话说:递增和赋值是在两个完全不同的东西上执行的。由于它是一个后缀增量
*ptr++=66
行,即使=66
位似乎不起作用?当我打印*ptr
时是7。有人能解释为什么吗?编译器不应该抱怨=66
位没有效果吗
*ptr++=66
是否基本等同于7=66
?您正在增加指针。然后指向b[1]。b[0]的值可能是66。发生的情况是:
b[0]
被分配一个值66
,因为您正在延迟ptr
,即您正在执行*ptr
,然后执行赋值&b[0]++
,它变成&b[1]
ptr
现在指向b[1]
,即7
换句话说:递增和赋值是在两个完全不同的东西上执行的。由于它是一个后缀增量,指针在其原始地址接收到一个新值后会递增。这个
ptr++
称为后增量,这意味着您首先使用ptr
的旧值(覆盖5
),然后递增ptr
,然后递增指针。如果要增加指针的值,请使用(*ptr)+
看到这个是的,我理解,但是为什么编译器让我分配*ptr++给一个数字,即使它没有效果?5?但是编译器不允许我输入5++=7;我理解*ptr++代码的作用,但是为什么我能把这个表达式赋给一个数字呢?@Sam:你正在解引用
ptr
并将66赋给它对应的任何值,但是你在增加指针本身。只是为了逗我笑:试试*(++ptr)=99代码>谢谢!因此,等效代码基本上是*ptr=66*ptr++;?这对我来说是有意义的。事实上这没有意义,因为那样的话*ptr将是67。它相当于*ptr=66;ptr++
。这意味着您增加的是指针,而不是指针指向的内容。ptr=&b[0]代码>是冗余的;您可以改用ptr=buf
。
int b[2], *ptr;
b[0] = 5;
b[1] = 7;
ptr = &b[0];
*ptr++ = 66;
printf("%d", *ptr);