循环中的 C 后/前递增指针

标签 c pointers

如果我在 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/

相关文章:

C 段错误(核心转储)

c - 查找指向字符数组的指针的索引

c++ - 指针 vector 的运算符<<重载抛出错误

无法将字符添加到分配给 ""的字符指针

c - wait4 和 waitpid 没有返回正确的状态

c - C 中的第一类标签?

C编程: Creating substring

c++ 使用 const char* 参数类型调用函数的最佳方法

C编程: Segmentation fault (core dumped)

c - allOddBits 返回 1