指针增量如何工作

Shu*_*ari 0 c pointers

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

输出= 5,5

为什么值为*q5它应该有一些垃圾值?

int main(void)

{

    int n1 = 2, n2 = 5;

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

    *p = *(++q);

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

    return 0;

}
Run Code Online (Sandbox Code Playgroud)

输出= 2,2

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

Cor*_*bin 6

*p = *(q++);是(或多或少)相当于*p = *q; q++;,所以p很好.q++将被评估,产生旧值q(即值预增量).您所看到的是预期的行为.

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

  • 但是当他接着`printf`的值为'*q`时,就是UB,因为`q`增加了并且没有指向任何有效的东西.@Corbin:是的,这是一个奇怪的例子. (2认同)