我无法弄清楚这一点。 也许是因为凌晨2点。 无论如何,我在这里不知所措。
#include int main() { char array[] = "123456789"; char* ptr = array; printf("%cn", *(ptr++)); printf("%cn", *ptr); *ptr = array[3]; printf("%cn", *(ptr++)); printf("%cnn", *ptr); return 0; }
结果是:
1 2 4 3
那是怎么回事,第1步和第2步以及第3步和第4步是相同的,但是我得到了不同的结果?
让我们一步一步地完成代码:
第0步:
char* ptr = array;
将char指针指向数组的开头(即位置0)。
步骤1:
printf("%cn", *(ptr++));
取消引用位置0处的指针,打印驻留在那里的值( 1
),然后将指针递增到位置1
第2步:
printf("%cn", *ptr);
取消引用位置1处的指针并打印驻留在那里的值( 2
)
第3步:
*ptr = arr[3];
取消引用位置1处的指针,并使用数组位置3处的值更新指向的值。 这是值4。
第4步:
printf("%cnn", *(ptr++));
取消引用位置1处的指针,打印刚刚更新的值( 4
),然后将指针递增到位置2
第5步:
printf("%cn", *ptr);
取消引用位置2处的指针并在那里打印值( 3
)。
也许你真正想要的是拥有ptr = &arr[3];
它将指针指向一个新位置(即arr[3]
的地址)。
请注意,由于运算符优先级 ,上面ptr
周围的大括号实际上是冗余的。
对于*(ptr++)
,后增量具有比间接更高的优先级,因此它将在我们取消引用指针之前应用
*(++ptr)
也不需要大括号。 这里即使预增量和间接具有相同的优先级,它们也是从右到左进行计算的。 因此指针将在取消引用之前递增。
试试这个:
ptr = array + 3;
ptr++
是后增量运算符,因此指针在取消引用后递增(根据标准)。
此外,步骤:
*ptr = array[3];
分配给array[1]
值4,因此您打印4而不是2并增加到3。
指针分配的正确方法是:
ptr = &array[3];
要么
ptr = (array + 3);
您实际上是通过ptr
将array[3]
的值赋给值pointet。
以上就是c/c++开发分享C – 指针和不同的结果?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/560792.html