注册 登录
编程论坛 C++教室

一个指针的问题,帮忙解答一下

luguolian 发布于 2013-08-17 18:32, 529 次点击
int i=10, j=20, k=30, a, b, c, *p;
   p=&i;   a=(*p)++; b=*(p++); c=*p;
  printf("%5d,%5d,%5d,%5d\n",i,a,b,c);
结果为什么是   11  10  11  1245120  

4 回复
#2
yuccn2013-08-17 21:49

这个你的了解堆栈内存结构才行

p=&i;  
 a=(*p)++; 这个等价于  a=(*p);(*p)++; ,也就是a = 10;(*p) = 11了,也就是i = 11;
b=*(p++);等价于  b = *p; p++;  也就是b = 11;p指向上一个内存单元。这个内存单元不是你分配的,所以里面的数据为未知了。
所以c=*p; c的值是一个不确定的。

也就是i = 11,a=10,b=11,c=不确定

我这边反汇编是
    int i=10, j=20, k=30, a, b, c, *p;
00413D8E  mov         dword ptr [i],0Ah
00413D95  mov         dword ptr [j],14h
00413D9C  mov         dword ptr [k],1Eh
    p=&i;  
00413DA3  lea         eax,[i]
00413DA6  mov         dword ptr [p],eax
    a=(*p)++;
00413DA9  mov         eax,dword ptr [p]
00413DAC  mov         ecx,dword ptr [eax]
00413DAE  mov         dword ptr [a],ecx
00413DB1  mov         edx,dword ptr [p]
00413DB4  mov         eax,dword ptr [edx]
00413DB6  add         eax,1
00413DB9  mov         ecx,dword ptr [p]
00413DBC  mov         dword ptr [ecx],eax
    b=*(p++);
00413DBE  mov         eax,dword ptr [p]
00413DC1  mov         ecx,dword ptr [eax]
00413DC3  mov         dword ptr [b],ecx
00413DC6  mov         edx,dword ptr [p]
00413DC9  add         edx,4
00413DCC  mov         dword ptr [p],edx
    c=*p;
00413DCF  mov         eax,dword ptr [p]
00413DD2  mov         ecx,dword ptr [eax]
00413DD4  mov         dword ptr [c],ecx

查看各值
只有本站会员才能查看附件,请 登录

 
#3
liu1224309502013-08-17 21:50
p是指向i的指针,
*p  是对p的解引用即p的值是10 ,是因为i++是先赋值再对i加1,所以i=11,a=10,p仍指向i;
同理b的值是*p,即b=11,之后指针p加1,而非指针指向的对象加1,即指针移动了不指向i了,所以b=11,p不指向i了
而c的值是对p的解引用,所以值是个不确定数。

#4
luguolian2013-08-21 09:29
回复 2楼 yuccn
你的解答好详细,谢谢你。以后我会常去你的博客看看的
#5
yuccn2013-08-21 12:16
回复 4楼 luguolian
1