免费注册 查看新帖 |

Chinaunix

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

[C] *a 和 *a[0] 有区别? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-01-01 14:05 |只看该作者 |倒序浏览
解释一下
*a

*a[0]
有啥区别..程序如下
  1. #include <stdio.h>
  2. #include <string.h>
  3. int main(){
  4.   int a[10][5]={5};
  5.   printf("a的地址%p,内容是%d\na[0][0]的地址是:%p,内容是%d",a,*a,a[0],*a[0]);
  6.   getch();
  7.   return 0;
  8. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2009-01-01 14:43 |只看该作者
运行下看结果吧。

论坛徽章:
0
3 [报告]
发表于 2009-01-01 20:43 |只看该作者

  1. #include <stdio.h>
  2. #include <string.h>
  3. int main(void)
  4. {
  5.   int a[10][5] = {5};

  6.   printf("a的地址%p,内容是%p\na[0][0]的地址是:%p,内容是%d",
  7.                   a, *a, a[0], *a[0]);
  8.   getch();
  9.   return 0;
  10. }
复制代码


把你的代码中打印*a的值的时候,由%d改成%p格式打印比较清楚
*a 可以看成*(a+0)依然是一个地址
*a[0] 可以看成 *(*(a+0)) 表示的是存储在数组里的值,即 5

论坛徽章:
1
黑曼巴
日期:2020-02-27 22:54:26
4 [报告]
发表于 2009-01-01 21:02 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
5 [报告]
发表于 2009-01-02 01:25 |只看该作者
a的地址0012FE9C,内容是0012FE9C
a[0][0]的地址是:0012FE9C,内容是5

论坛徽章:
0
6 [报告]
发表于 2009-01-02 02:51 |只看该作者
a 和 *a 不是一样的吗……
a 在参与四则运算的时候可以和指针等价,但它再怎么样都是数组,求 dereference 求不出来的。



[ 本帖最后由 langue 于 2009-1-2 02:53 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2009-01-02 11:05 |只看该作者
原则1:数组变量的内容是数组首元素的地址
原则2:变量a的内容是变量b的地址时我们说变量a指向变量b;*a是变量a所指向的变量的内容,假设此时a的内容是一个地址,即a可能是一个指针变量或数组名

然后分析:

根据原则1,a是数组名,则a是数组首元素a[0]的地址,即a==(&a[0]);
*a是a所指向的变量的内容,而a是数组首元素a[0]的地址,则a指向数组首元素a[0],则*a就是a[0]的内容。因为a是二维数组,所以a[0]是一维数组(c语言的架构是这样的),故而a[0]也是一个数组名,即它的内容也是它的数组首元素的地址,而数组a的首元素的地址和数组a[0]的首元素地址是一样的,所以看起来a和*a的内容是一样的。但其实两者的级别不一样,指针跨度也不一样。a面向的是a[0],a[1]这样的一维数组,而a[0]面对的是a[0][0],a[0][1]这样的整型变量。故a==*a,但(a+1)!=(*a)+1;

论坛徽章:
0
8 [报告]
发表于 2009-01-02 11:10 |只看该作者
原帖由 wwdwwd 于 2009-1-2 11:05 发表
原则1:数组变量的内容是数组首元素的地址
原则2:变量a的内容是变量b的地址时我们说变量a指向变量b;*a是变量a所指向的变量的内容,假设此时a的内容是一个地址,即a可能是一个指针变量或数组名

然后分析: ...


分析的很详细啊

论坛徽章:
0
9 [报告]
发表于 2009-01-02 17:56 |只看该作者

回复 #7 wwdwwd 的帖子

对啊,a==&a[0]
那应该*(a)==*(&a[0])对吧
那我的输出为啥不一样呢??
  1. #include <stdio.h>
  2. #include <string.h>
  3. int main(){
  4.   int a[10][5]={5};
  5.   printf("a的地址%p,内容是%d\na[0][0]的地址是:%p,内容是%d",a,*(a),a[0],*(a[0]));
  6.   getch();
  7.   return 0;
  8. }
复制代码

论坛徽章:
0
10 [报告]
发表于 2009-01-02 18:16 |只看该作者
数组不是指针。
数组不是指针。
数组不是指针。
数组不是指针。
数组不是指针。
数组不是指针。
数组不是指针。
数组不是指针。
数组不是指针。
数组不是指针。


这段话抄十遍,明天一早交给 JohnBull 老师!



[ 本帖最后由 langue 于 2009-1-2 18:27 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP