| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 480 人关注过本帖
标题:这段文字有的地方不懂,请教
只看楼主 加入收藏
雪鹰独行
Rank: 2
等 级:论坛游民
帖 子:40
专家分:10
注 册:2009-7-18
结帖率:100%
收藏
已结贴  问题点数:5 回复次数:8 
这段文字有的地方不懂,请教
设有整型二维数组a[3][4]如下:
0 1 2 3
4 5 6 7
8 9 10 11
   设数组a的首地址为1000,各下标变量的首地址及其值如图所示。在第四章中介绍过,C语言允许把一个二维数组分解为多个一维数组来处理。因此数组a可分解为三个一维数组,即a[0],a[1],a[2]。每一个一维数组又含有四个元素。例如a[0]数组,含有a[0][0],a[0][1],a[0][2],a[0][3]四个元素。数组及数组元素的地址表示如下:a是二维数组名,也是二维数组0行的首地址,等于1000。a[0]是第一个一维数组的数组名和首地址,因此也为 1000。*(a+0)或*a(这两个是什么意思)是与a[0]等效的, 它表示一维数组a[0]0 号元素的首地址。也为1000。&a[0][0]是二维数组a的0行0列元素首地址,同样是1000。因此,a,a[0],*(a+0),*a?amp;a[0] [0]是相等的。同理,a+1是二维数组1行的首地址,等于1008。a[1]是第二个一维数组的数组名和首地址,因此也为1008。 &a[1][0]是二维数组a的1行0列元素地址,也是1008。因此a+1,a[1],*(a+1),&a[1][0]是等同的。由此可得出:a+i,a[i],*(a+i),&a[i][0]是等同的。此外,&a[i]和a[i]也是等同的。因为在二维数组中不能把&a[i]理解为元素a[i]的地址,不存在元素a[i]。

  C语言规定,它是一种地址计算方法,表示数组a第i行首地址。由此,我们得出:a[i],&a[i],*(a+i)和a+i也都是等同的。另外,a[0]也
可以看成是a[0]+0是一维数组a[0]的0号元素的首地址,而a[0]+1则是a[0]的1号元素首地址,由此可得出a[i]+j则是一维数组a[i]的j号元素首地址,它等于&a[i][j]。由 a[i]=*(a+i)得a[i]+j=*(a+i)+j,由于*(a+i)+j是二维数组a的i行j列元素的首地址。该元素的值等于*(* (a+i)+j)。
[Explain]#define PF "%d,%d,%d,%d,%d,\n"
main(){
static int a[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};
printf(PF,a,*a,a[0],&a[0],&a[0][0]);
printf(PF,a+1,*(a+1),a[1],&a[1],&a[1][0]);
printf(PF,a+2,*(a+2),a[2],&a[2],&a[2][0]);
printf("%d,%d\n",a[1]+1,*(a+1)+1);
printf("%d,%d\n",*(a[1]+1),*(*(a+1)+1));
}



[ 本帖最后由 雪鹰独行 于 2009-11-8 09:19 编辑 ]
搜索更多相关主题的帖子: 文字 
2009-11-08 09:14
李若斌
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:219
专家分:184
注 册:2009-9-30
收藏
得分:1 
看来你也是看到指针了 ,这里确实是有点绕弯的感觉,你看不懂这里的话 ,那你应该注意一下,C语言中规定了数组名a代表的是数组首元素的地址,现在的首元素不是一个整形元素,而是由四个整形元素所组成的一维数组,因此a代表的是首行的首地址即1000。
那么这样就能理解为什么*a是等于1000了。因为*a的意思就是指向a[0]这个一维数组的第0个元素的地址。而*(a+0)是等于*a的,都是指向一维数组第O个元素的地址。(我不知道你是怎么理解这里的,反正我是这样理解的.可能你还是不大懂。不过你还是把书上第244页的内容好好看一下吧,那里详细的说明了指向的对象关系。你应该也是看的《C程序设计(第三版本)》谭浩强老师的书吧)
如果哪位高手有更加深刻的理解话也拿出来让我借鉴一下吧,毕竟我对指针的理解也不是很好。

[ 本帖最后由 李若斌 于 2009-11-8 11:13 编辑 ]
2009-11-08 11:11
pgy
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:C
等 级:小飞侠
威 望:8
帖 子:1248
专家分:2329
注 册:2009-9-23
收藏
得分:1 
*(a+0)或*a(这两个是什么意思)是与a[0]等效的
a是数组名,也就是a[0]的地址,也是整个数组的首地址,
a+0意思是由数组a的首地址开始向后移0位(等于没移),所以还是首地址
所以取内容。*(a+0)和*a和a[0]都代表数组a的第一个元素
类似的
    *(a+1)  *(&a[1])   a[1]
    都代表数组的第二个元素

我可好玩啦...不信你玩玩^_^
2009-11-08 11:17
雪鹰独行
Rank: 2
等 级:论坛游民
帖 子:40
专家分:10
注 册:2009-7-18
收藏
得分:0 
回复 2楼 李若斌
还是有点一头雾水的感觉,我再理解一下看看。赫赫,谢了。
2009-11-08 11:19
雪鹰独行
Rank: 2
等 级:论坛游民
帖 子:40
专家分:10
注 册:2009-7-18
收藏
得分:0 
我有点明白了,写一下。
在二维数组中,a[i]表示的是第i行的首地址,a+i表示的是第i行的首地址的地址,因此,*(a+i)表示的是第i行的首地址。一般情况下直接运用就可以了。
2009-11-08 11:51
pgy
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:C
等 级:小飞侠
威 望:8
帖 子:1248
专家分:2329
注 册:2009-9-23
收藏
得分:0 
回复 5楼 雪鹰独行
error

我可好玩啦...不信你玩玩^_^
2009-11-08 11:52
雪鹰独行
Rank: 2
等 级:论坛游民
帖 子:40
专家分:10
注 册:2009-7-18
收藏
得分:0 
在这里,单独的a可以做两种解释,因此可以表示成两种形式
2009-11-08 11:52
雪鹰独行
Rank: 2
等 级:论坛游民
帖 子:40
专家分:10
注 册:2009-7-18
收藏
得分:0 
回复 6楼 pgy
为什么
2009-11-08 11:54
pgy
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:C
等 级:小飞侠
威 望:8
帖 子:1248
专家分:2329
注 册:2009-9-23
收藏
得分:0 
回复 8楼 雪鹰独行
...

[ 本帖最后由 pgy 于 2009-11-8 11:57 编辑 ]

我可好玩啦...不信你玩玩^_^
2009-11-08 11:56
快速回复:这段文字有的地方不懂,请教
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.012047 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved