免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1380 | 回复: 5
打印 上一主题 下一主题

轻轻的问一句:指针搞不懂的问题,大家帮我看看。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-08-17 16:11 |只看该作者 |倒序浏览
同样的一段程序,加上了地址,但数值就完全不一样了,这个是为什么?
tc2.0
#include"stdio.h"
int data[2]={100,200};
int moredata[2]={300,400};
int main(void)
{
   int *p1, *p2, *p3;

   p1=p2=data;
   p3=moredata;
   printf("*p1=%d, *p2=%d, *p3=%d\n", *p1, *p2, *p3);

   printf("*p1++=%d, *++p2=%d, (*p3)++=%d\n", *p1++, *++p2, (*p3)++);

   printf("*p1=%d, *p2=%d, *p3=%d\n", *p1, *p2, *p3);

   
   return 0;

   }

*p1=100, *p2=100, *p3=300
*p1++=100, *++p2=200, (*p3)++=300
*p1=200, *p2=200, *p3=301


*****************************************************

#include"stdio.h"
int data[2]={100,200};
int moredata[2]={300,400};
int main(void)
{
   int *p1, *p2, *p3;

   p1=p2=data;
   p3=moredata;
   printf("*p1=%d, *p2=%d, *p3=%d, *p1=%p, *p2=%p, *p3=%p\n",
           *p1, *p2, *p3,*p1, *p2, *p3);

   printf("*p1++=%d, *++p2=%d, (*p3)++=%d,*p1++=%p, *++p2=%p, (*p3)++=%p\n",
           *p1++, *++p2, (*p3)++,*p1++, *++p2, (*p3)++);

   printf("*p1=%d, *p2=%d, *p3=%d,*p1=%p, *p2=%p, *p3=%p\n",
           *p1, *p2, *p3,*p1, *p2, *p3);

   
   return 0;

   }

*p1=100, *p2=100, *p3=300, *p1=0064, *p2=0064, *p3=012C
*p1++=200, *++p2=302, (*p3)++=301,*p1++=0064, *++p2=00C8, (*p3)++=012C
*p1=302, *p2=302, *p3=302,*p1=012E, *p2=012E, *p3=012E

论坛徽章:
0
2 [报告]
发表于 2005-08-17 17:28 |只看该作者

轻轻的问一句:指针搞不懂的问题,大家帮我看看。

因为编译器是从一条语句的后面向前执行:
printf("*p1++=%d, *++p2=%d, (*p3)++=%d,*p1++=%p, *++p2=%p, (*p3)++=%p\n",
          *p1++, *++p2, (*p3)++,*p1++, *++p2, (*p3)++);
     (*p3)++后*p3=301打印值300,
     *++p2后p2指向data+sizeof(int)后打印值200,
     *p1++后p1也指data+sizeof(int)先打印值100
     (*p3)++打印301,p3值302;*++p2,
     p2指向data+8(可能地址正好到moredata,你看一下),打印就为302
     *p1++打印时值为200,++后地址加4,指向p3
     
     后面大家都指向p3为302

论坛徽章:
0
3 [报告]
发表于 2005-08-17 17:30 |只看该作者

轻轻的问一句:指针搞不懂的问题,大家帮我看看。

执行结果正确得很!
你的问题是什么呢?
1、++和*的优先级相同,结合顺序为从右向左。
2、%p是打印地址的,打出结果为十六进制。
3、注意你的程序中++是对地址加还是对值加。

论坛徽章:
0
4 [报告]
发表于 2005-08-17 17:47 |只看该作者

轻轻的问一句:指针搞不懂的问题,大家帮我看看。

原帖由 "kernelxu" 发表:
执行结果正确得很!
你的问题是什么呢?

3、注意你的程序中++是对地址加还是对值加。


在这里我倒是有一个疑问,对指针+1结果是对该指针增加1个储存单元
对数组而言,地址会增加到下一个元素的地址。那该如何理解这句话?

论坛徽章:
0
5 [报告]
发表于 2005-08-17 17:54 |只看该作者

轻轻的问一句:指针搞不懂的问题,大家帮我看看。

好好看看书吧,在弄几个程序理解一下.和写程序的习惯,不加扩hoade 时候肯定是地址+1

论坛徽章:
0
6 [报告]
发表于 2005-08-21 11:10 |只看该作者

轻轻的问一句:指针搞不懂的问题,大家帮我看看。

原帖由 "wbo811" 发表:
因为编译器是从一条语句的后面向前执行:
printf("*p1++=%d, *++p2=%d, (*p3)++=%d,*p1++=%p, *++p2=%p, (*p3)++=%p\n",
          *p1++, *++p2, (*p3)++,*p1++, *++p2, (*p3)++);
     (*p3)++后*p3=301打印?.........


右结合,根据编译器不同而不同。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP