指针增量如何工作

时间:2015-09-06 20:22:27

标签: c pointers

int main(void)
{
    int n1 = 2, n2 = 5;
    int *p = &n1, *q = &n2;
    *p = *(q++);
    printf("%d,%d", *p, *q);
    return 0;
}

输出= 5,5

为什么*q的值为5,它应该有一些垃圾值?

int main(void)

{

    int n1 = 2, n2 = 5;

    int *p = &n1, *q = &n2;

    *p = *(++q);

    printf("%d,%d", *p, *q);

    return 0;

}

输出= 2,2

这是怎么回事? 任何人都可以解释优先规则如何在指针中工作?

2 个答案:

答案 0 :(得分:6)

*p = *(q++);(或多或少)等同于*p = *q; q++;,因此p很好。将评估q++,产生q的旧值(即值预增量)。您所看到的是预期的行为。

q调用中printf的尊重中确实存在未定义的行为,因为q不再指向您此时拥有的内存。一百万个不同的东西可能导致这种情况(例如,上次分配内存,可能是5,编译器太漂亮并试图帮助你等),但你不能也不应该依赖这种行为。这样做很危险,这个程序可能会在许多编译器/操作系统/硬件上崩溃或输出废话。

答案 1 :(得分:1)

  

为什么* q的值为5,它应该有一些垃圾值?

这是由于*p中的后缀增量,它在指针取消引用和赋值给*q之后起作用。

因此,*p指向的地址的当前值已分配给5,5,然后q将递增为&#34;垃圾值&#34; < / em>。

打印sudo service apache2 restart 中的这个奇怪结果是未定义的行为。