在这段代码中,如果我写“* p ++ = * q”而不是“* p ++”则没有任何变化。为什么呢?
int a[10]={1,2,3,4,5,6,7,8,9,10};
int *p=a, *q=&a[8];
*p++;
printf("%d \n", *p);
printf("%d \n", *q);
printf("%d \n", p);
printf("%d \n", q);
答案 0 :(得分:3)
p
表示
*p++=*q;
并在递增之前获取其值 p
表示
q
并在递增之前获取其值p[-1]
(评估的实际顺序未指定且可能不同)
更改它会发生变化。您没有观察到更改,因为您没有检查p
中存储的值(递增后printf("%d \n", p);
printf("%d \n", q);
是值)。
注意行
printf
通过将具有错误值的数据传递给printf("%p \n", (void*)p);
printf("%p \n", (void*)q);
来调用未定义的行为。这些行应该是
%p
使用void*
说明符并将指针投射到printf
以通过OutOfMemoryException
打印指针。
答案 1 :(得分:0)
你的问题是错的。你声称“没有任何变化”,并问为什么。
现实是某事已经改变。但不是你正在看的任何东西。去弄清楚改变了什么。
最重要的是,使用%d修饰符打印p和q是未定义的行为。
我的钱包里有5英镑。我把10英镑放在袜子里。我检查了我的钱包,钱包里还有5英镑。没有改变。为什么?