编程论坛
注册
登录
编程论坛
→
VC++/MFC
问个简单的指针问题
一坨热翔
发布于 2013-12-23 11:37, 524 次点击
数组a[6]={1,2,3,4,5,6},int *k, k=a
在这种情况下,*(a++)和*a++表示的意思一样么?
5 回复
#2
yuccn
2013-12-23 12:05
++优先级高于*,所以他们是一样的。
不过你这样用是错误的,因为a 是数组首地址不允许++操作,你想问的是*(k++)和*k++ 吧
#3
一坨热翔
2013-12-23 14:41
想问的的确是k。。。
那为什么这两个输出结果都是1呢?如果先运算++的话,k指针不是应该先向右移动一位,这样输出结果不应该是2么?
以下是引用
yuccn
在2013-12-23 12:05:38的发言:
++优先级高于*,所以他们是一样的。
不过你这样用是错误的,因为a 是数组首地址不允许++操作,你想问的是*(k++)和*k++ 吧
#4
yuccn
2013-12-23 20:33
*(k++)和*k++ 是等价的
#5
一坨热翔
2013-12-24 04:43
为什么输出的是1而不是2?
以下是引用
yuccn
在2013-12-23 20:33:19的发言:
*(k++)和*k++ 是等价的
#6
yuccn
2013-12-24 08:42
用这段代码来给你说明吧
int a[6]={1,2,3,4,5,6};
int *k=a;
int x = *(k++);
printf("%d",x,);
反汇编
int x = *(k++);
00811698 mov eax,dword ptr [ebp-2Ch]
0081169B mov ecx,dword ptr [eax]
0081169D mov dword ptr [ebp-38h],ecx // 先把*k的值赋值给x(也就是ptr [ebp-38h])
008116A0 mov edx,dword ptr [ebp-2Ch]
008116A3 add edx,4 // k++
008116A6 mov dword ptr [ebp-2Ch],edx
printf("%d",x);
008116A9 mov esi,esp
008116AB mov eax,dword ptr [ebp-38h] 输出x(ptr [ebp-38h])
008116AE push eax
可以看到 ,int x = *(k++); 被编译器处理成了 x = *k;k++;
这个是vs2010反汇编的结果,
优先级++高于*,并不是说 *(k++)就先执行++ 后执行*。
而是说++ 这个运算符 归属k ,还是归属(*k)
如果++归属k,那么就是k指针指向下一个k的地址 ,也就是k=k+1,等价于k = &a【1】
如果++归属(*k),那么就是k的指向内容递增1 ,也就是 *(k) = *(k)+1 ,等价于a【0】 = a【0】+1;
[
本帖最后由 yuccn 于 2013-12-24 09:23 编辑
]
1