鱼C论坛

 找回密码
 立即注册
查看: 5343|回复: 4

数组指针变量和数组名的区别

[复制链接]
发表于 2013-6-4 17:23:20 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 tsembrace 于 2013-6-4 17:25 编辑

第一个问题:
看到谭浩强C指针这章时,对于:
int a[10],*p;
p=a;
这样的定义。数组名表示的是数组的首地址,p=a就是把数组首地址赋给p,这个理解没问题。
对于表示数组元素a[0]等价于*p;a[1]等价于*(p+1);甚至第i个元素可以用p[i],也可以用*(a+i)表示;那么看到这里,问题是:p和a有差别么?除了定义时候理解的p为指向数组的指针变量和a为数组首地址外,他俩有什么差别?在应用方面可以相互替换吗?

第二个问题:

  1. void main()
  2. {
  3. int a[3],i=0,*p;
  4. p=a;
  5. printf("input 3 numbers:\n");
  6. for(;i<3;i++) scanf("%d",&a[i]);
  7. printf("a[0]=%d;a[1]=%d;a[2]=%d;\n",*p,*(p+1),*(p+2));        //--->可以实现依次输出
  8. p=a;
  9. printf("a[0]=%d;a[1]=%d;a[2]=%d;\n",*p++,*p++,*p);       //--->为何不行?
  10. p=a;
  11. printf("a[0]=%d;a[1]=%d;a[2]=%d;\n",*p,*(++p),*(++p));       //--->为何不行?
  12. }
复制代码

TC3下运行结果如下图:
2.jpg

引申:用问题二来测试问题一(把printf中的参数换成a),运行如下,显示Lvalue required错误提示。那说明a和p是有区别的,区别在哪里呢?



1.jpg
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-6-4 18:25:55 | 显示全部楼层
a是数据a的首地址,p是指针变量,它存放这一个地址。第一个中,p存放的a的地址,通过+1,+2进行偏移,完全不存在问题。但是第2个和第3个,初始时,p存放的a的地址,这里都没有问题。问题在于函数传参顺序,有的函数是顺序压入栈中,你的这个应该默认是逆序入栈的。拿第2个来说吧,先*p入栈,值为a[0],然后,*p++,任为a[0],接着,*p++,此时为a[1],然后对应的输出为3,1,1。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-6-4 18:28:57 | 显示全部楼层
还有,写程序的时候,千万不要像这样使用++/--,不利于阅读。另外,不同的编译器对这个的处理方式也可能不同,造成的结果就可想而知了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-6-4 18:53:02 | 显示全部楼层
嗯,谢谢。
按你的说法是可以理解了,但对于函数的什么传参顺序之类还没有概念,慢慢再往后看吧~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-6-4 19:26:01 | 显示全部楼层
对于问题1:很多情况下两者都可以通用,但是两者并不是相等的。
        首先,分配的空间不同,你输出sizeof(a)和sizeof(p)可以看到一个为12,一个为4;
        其次,a是常量,不能进行a++之类的操作。p是变量,可以改变p的值。
对于问题2:结果与编译器相关,vc6下我输入1 2 3输出为
1 2 3
1 1 1
3 3 2

对于vc6  语句printf("a[0]=%d;a[1]=%d;a[2]=%d;\n",*p++,*p++,*p);   从右往左压栈,大致为:
push (*p);  相当于push a[0]
push (*p); 相当于push a[0]
push (*p); 相当于push a[0]
push "a[0]=%d;a[1]=%d;a[2]=%d;\n";
所有的p++操作都是在压栈完后,调用printf之前进行的,因此,输出都为1。

语句printf("a[0]=%d;a[1]=%d;a[2]=%d;\n",*p,*(++p),*(++p)); 的压栈操作大致为:
push (*(++p));  因为带了括号,所以++p压栈之前就执行了,相当于push a[1]
push (*(++p));  相当于push a[2]
push (*p);        相当于push a[2]
push "a[0]=%d;a[1]=%d;a[2]=%d;\n";
所以输出为3 3 2

lz最好不要写这样的代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-7-26 14:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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