间接和增量运算符评估

时间:2014-09-13 05:37:38

标签: c pointers

#include <stdio.h>

int main() {
    int op9=9;
    int op99=99;
    int op999=999;
    int op9999=9999;

    int *ptr1=&op9,*ptr2=&op99,*ptr3=&op999,*ptr4=&op9999;

    *ptr1++;
    ++*ptr2;
    (*ptr3)++;
    *++ptr4;

    printf("%d=ptr1 \t %d=ptr2 \t %d=ptr3 \t %d=ptr4",ptr1,ptr2,ptr3,ptr4);

    printf("\n %d = *ptr++ \n %d = ++*ptr \n %d = (*ptr)++ \n %d = *++ptr",*ptr1,*ptr2,*ptr3,*ptr4);

    printf("\n \n  %d=ptr1 \t %d=ptr2 \t %d=ptr3 \t %d=ptr4",ptr1,ptr2,ptr3,ptr4);

    return 0;
}

这是我得到的输出

-

    209002336=ptr1   -209002344=ptr2     -209002348=ptr3     -209002348=ptr4

-209002348 = *ptr++ 
     100 = ++*ptr 
     1000 = (*ptr)++ 
     1000 = *++ptr4

      -209002336=ptr1    -209002344=ptr2     -209002348=ptr3     -209002348=ptr4

为什么* ptr ++是ptr1指向ptr3&#39的地址? 为什么* ++ ptr4的值为1000,这是ptr3的值?

我认为* ptr1 ++将指向下一个地址,因为它不属于我的程序,我预计程序会崩溃。类似地,* ++ ptr4也应该这样做,因为它被评估为*(++ ptr4)。

那么增量和间接算子究竟是如何为* ptr ++和* ++ ptr工作的?

3 个答案:

答案 0 :(得分:2)

解释1000 = *++ptr4

形式上,这是未定义的行为。

实际上,局部变量在堆栈中连续且按相反的顺序分配:

int op9;    // SP+3
int op99;   // SP+2
int op999;  // SP+1
int op9999; // SP+0

因此,通过指向op9999并递增它,它最终指向op999

请记住,根据C语言标准,它仍然是未定义的行为。

这实际上意味着在使用不同的编译器时可能会得到不同的结果。

答案 1 :(得分:1)

你问:

  

为什么*ptr++ ptr1指向ptr3的地址?

首先,

*ptr++;

相同
 *(ptr++)

表达式的副作用是ptr递增,指针被解除引用,并且取消引用的值被丢弃。在ptr递增后取消引用它本身就是未定义行为的原因。在此之后你得到的任何东西都可能不可靠。

至于为什么ptr指向ptr3的地址,我不确定你为什么这么认为。您的输出似乎并不表示。

你也问过,

  

为什么*++ptr4的值为1000 ptr3的价值?

表达式*++ptr4遇到同样的问题。您正在递增ptr4,并取消引用递增的指针。从解除引用指针得到的结果是未定义的行为,因此是不可预测的。

根据堆栈的组织方式,ptr4很可能在递增后ptr3指向与{{1}}相同的地址。但是,不要指望这种巧合行为。

答案 2 :(得分:0)

代码中int的相对内存顺序未定义。使用数组按顺序将它们放在一起:

int op[] = {9, 99, 999, 9999};
int *ptr1 = &op[0], *ptr2 = &op[1], *ptr3 = &op[2], *ptr4 = &op[3];

要打印指针,请使用%p格式说明符。