鱼C论坛

 找回密码
 立即注册
12
返回列表 发新帖
楼主: City_of_the_sky

第一次发贴求解!

  [复制链接]
 楼主| 发表于 2013-5-16 02:54:58 | 显示全部楼层
算了吧,我太纠结了,我想了一下。觉的是相对于printf这个函数而言,*p++只是一个参数,应该算是一个运算吧。。。
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-5-16 08:22:21 | 显示全部楼层
本帖最后由 格式天下 于 2013-5-16 08:24 编辑
  1. #include <stdio.h>
  2. main()
  3. {
  4.         int a[5] = {5,3,7,6,9}, *p , temp;
  5.         p = &a;
  6.         temp = *p++;//此时temp 为5 , 因为*p++ 实际上是  *(p++) ,而你的问题就应该在p++的理解上
  7.         printf ("%d\n", temp);
  8.         printf ("%d\n", *p);
  9. }*/

  10. #include <stdio.h>
  11. main()
  12. {
  13.         int a[5] = {5,3,7,6,9}, *p , temp;
  14.         p = &a;
  15.         temp = *++p; //再来看此处,此处为 *(++p) , 而temp = 3,个中原因想必楼主应该明了了吧
  16.         printf ("%d\n", temp);
  17.         printf ("%d\n", *p);
  18. }
复制代码
首先,你先把这两个程序运行一下,看下结果
下边我从汇编的角度看看帮你区分下++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++这两个进行区分的,所以我用汇编……不要介意,不懂的话再问我
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-5-16 09:46:40 | 显示全部楼层
printf ("%d\n", *p++);          //重點是這句!

QQ图片20130516094622.jpg 看圖……右下角的ecx是add ecx,4之後的,ecx就是*p的地址,ecx-4就等於add之前。意思很清楚了。他是先把*p賦值給printf的%d之後,再*p++,
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-5-16 09:47:56 | 显示全部楼层
格式天下 发表于 2013-5-16 08:22
首先,你先把这两个程序运行一下,看下结果
下边我从汇编的角度看看帮你区分下++p 和 p++
------------ ...

這位朋友的解析很詳細了~回覆了才看到。早知道不去開vc浪費時間了,呵呵
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-5-16 11:28:17 | 显示全部楼层
后面两位回答得好详细。。
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2013-5-16 15:52:50 | 显示全部楼层
谢谢了,我再回去反世编printf看看。。。:lol
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-5-16 15:55:33 | 显示全部楼层

o(≧v≦)o鱼C开学季!
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-5-16 16:14:43 | 显示全部楼层
o(≧v≦)o鱼C开学季!
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-5-16 16:18:26 | 显示全部楼层
o(≧v≦)o鱼C开学季!
小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-28 14:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表