如果我在 main 中有以下...
int i;
int *p;
i = 0;
p = &i;
printf("%x\n", *p);
for (int j = 0; j < 20; j++) {
printf("%x ", *p++);
}
puts("\n\n");
p = &i;
for (int j = 0; j < 20; j++) {
printf("%x ", ++*p);
}
...我得到了很奇怪的输出...
0 569d8a48 7fff 1 0 569d8a38 7fff 9227ce4 1 0 0 0 0 1 0 569d8b98 7fff 0 0 569d8be9
1 2 3 4 5 6 7 8 9 a b c d e f 10 11 12 13 14
请注意 i
只是一个整数 - 我想看看如果查看其他内存位置会发生什么。但是增量后/增量前的差异让我感到惊讶。
有谁知道什么会导致此类事件(即第二行怎么可能是完美的递增顺序)?
最佳答案
在 C 中,后缀运算符的优先级高于前缀运算符。所以 *p++
被解释为好像是写成 *(p++)
。也就是说,您正在递增指针。然后您取消引用以打印恰好存储在内存中该位置的整数。
但是 ++*p
被解释为 ++(*p)
,所以你递增指针指向的值(即整数 我
)。这也是++ 运算符的返回值,所以这就是您看到的打印内容。
关于循环中的 C 后/前递增指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25111059/