|
发表于 2013-5-16 08:22:21
|
显示全部楼层
本帖最后由 格式天下 于 2013-5-16 08:24 编辑
City_of_the_sky 发表于 2013-5-16 02:54
算了吧,我太纠结了,我想了一下。觉的是相对于printf这个函数而言,*p++只是一个参数,应该算是一个运算吧 ... - #include <stdio.h>
- main()
- {
- int a[5] = {5,3,7,6,9}, *p , temp;
- p = &a;
- temp = *p++;//此时temp 为5 , 因为*p++ 实际上是 *(p++) ,而你的问题就应该在p++的理解上
- printf ("%d\n", temp);
- printf ("%d\n", *p);
- }*/
- #include <stdio.h>
- main()
- {
- int a[5] = {5,3,7,6,9}, *p , temp;
- p = &a;
- temp = *++p; //再来看此处,此处为 *(++p) , 而temp = 3,个中原因想必楼主应该明了了吧
- printf ("%d\n", temp);
- printf ("%d\n", *p);
- }
复制代码 首先,你先把这两个程序运行一下,看下结果
下边我从汇编的角度看看帮你区分下++p 和 p++
---------------------------------------------------------------------
说明:mov 指令相当于赋值,add就是相加啦,这些[ebp - Xh]均是代表数据在内存中存放的地址
dword ptr [ebp-14h],5
dword ptr [ebp-10h],3
dword ptr [ebp-0Ch],7
dword ptr [ebp-8],6
dword ptr [ebp-4],9
以上便是数组元素存放位置
dword ptr [ebp-18h]这个地址就是你定义的指针的位置,好了,看程序
temp = *++p;
0040FAD1 mov ecx,dword ptr [ebp-18h] //将ebp-18h这个地址给了 ecx
0040FAD4 add ecx,4 // 这里是ecx = ecx +4 也就是指针移动到下一个位置,也就是元素3的位置
0040FAD7 mov dword ptr [ebp-18h],ecx //再将地址赋值回去到 [ebp - 18h]
0040FADA mov edx,dword ptr [ebp-18h] //此时的[ebp-18h]已经发生变化,他指向了数组的下一个元素的地址,这里就是把这个地址给了edx
0040FADD mov eax,dword ptr [edx] //edx是地址嘛,所以 [edx]代表了取值,也就是 *运算的意思, 也就是此时存放的是其所指的值为3
0040FADF mov dword ptr [ebp-1Ch],eax //将eax的值给了[ebp-1ch]这个单元
--------------------------------------------------
printf ("%d\n", temp);//一下就是打印[ebp-1ch]的内容,即:3
0040FAE2 mov ecx,dword ptr [ebp-1Ch]
0040FAE5 push ecx
0040FAE6 push offset string "a[%d, %d] = %d\n" (0042501c)
0040FAEB call printf (00401200)
0040FAF0 add esp,8
============================================================================
temp = *p++;
0040FAD1 mov ecx,dword ptr [ebp-18h]//同上
0040FAD4 mov edx,dword ptr [ecx]//这里就是把ecx所代表的地址 中存放的数据给了edx,当然也就是5啦,因为你程序中 p = &a就说明了[ebp - 18h]中存的是5
0040FAD6 mov dword ptr [ebp-1Ch],edx//这里把edx中存的东西(也就是5)给了地址[ebp - 1ch],也就是[ebp - 1ch]中存放了5
0040FAD9 mov eax,dword ptr [ebp-18h]//此时再将原来的[ebp - 18h]地址给了eax,注意此时[ebp - 18h]中的内容还是第一个元素5
0040FADC add eax,4//地址加4,想想为什么加4?
0040FADF mov dword ptr [ebp-18h],eax//[ebp - 18h]被更新了,此时它指向的是数组中的第二个元素3
----------------------------------------------------
printf ("%d\n", temp);//以下打印[ebp-1ch]中的内容,也就是5啦
0040FAE2 mov ecx,dword ptr [ebp-1Ch]
0040FAE5 push ecx
0040FAE6 push offset string "a[%d, %d] = %d\n" (0042501c)
0040FAEB call printf (00401200)
0040FAF0 add esp,8
看完分析相信你的第一反应是头大,不过从汇编的角度很容易对++p和 p++这两个进行区分的,所以我用汇编……不要介意,不懂的话再问我
|
|