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

时间:2014-08-04 02:34:18

标签: c pointers

如果我在主要内容中有以下内容......

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只是一个整数 - 我想看看如果我查看其他内存位置会发生什么。但后期/增加前的差异让我感到意外。

是否有人知道可能导致此类事件的原因(即第二行如何以完美递增的顺序)?

2 个答案:

答案 0 :(得分:7)

在C中,后缀运算符的优先级高于前缀运算符。因此*p++被解释为好像是*(p++)。也就是说,你正在递增指针。然后,您将取消引用以打印恰好存储在内存中该位置的整数。

但是++*p被解释为++(*p),所以你正在递增指针所指向的值(即整数i)。这也是++运算符的返回值,所以这就是你看到的。

答案 1 :(得分:4)

++和一元*运算符的优先级相同。关联性是从右到左。

因此,在第一个示例中,*p++等同于*(p++)(这是未定义的行为)。在第二个示例中,++*p相当于++(*p)