* p ++和* p ++ = * q之间的差异

时间:2016-06-05 14:50:35

标签: c

在这段代码中,如果我写“* 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);

2 个答案:

答案 0 :(得分:3)

p表示

  1. 递增*p++=*q;并在递增之前获取其值
  2. 取消引用该值
  3. 抛出结果
  4. p表示

    1. 递增q并在递增之前获取其值
    2. 取消引用该值以了解存储位置
    3. 取消引用p[-1]
    4. 存储读取的数据
    5. (评估的实际顺序未指定且可能不同)

      更改它会发生变化。您没有观察到更改,因为您没有检查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英镑。没有改变。为什么?

相关问题