#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工作的?
答案 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
的值为1000ptr3
的价值?
表达式*++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
格式说明符。