一个关于二级数组的问题

pang123hui 2009-10-11 12:00:43
我是大一嵌入式的新生,在C语言看到二维数组时,有个问题?

书上首先定义了一个二维数组int a[3][4],然后说a,a[0],&a[0],*(a+0),*a,&a[0][0]是相等的。

这里面的a,a[0],*(a+0),&a[0][0]我都理解,但是不理解既然a[0]表示第一个一维数组的首地址,那么&a[0]又该如何理解呢?且*a又该如何理解呢?

在此先行感谢回答
...全文
177 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
pang123hui 2009-10-11
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 slowgrace 的回复:]
引用楼主 pang123hui 的回复:
书上首先定义了一个二维数组int a[3][4],然后说a,a[0],&a[0],*(a+0),*a,&a[0][0]是相等的。

这里面的a,a[0],*(a+0),&a[0][0]我都理解,但是不理解既然a[0]表示第一个一维数组的首地址,那么&a[0]又该如何理解呢?且*a又该如何理解呢?


数组标识符在不同场合下扮演不同角色:
(1)当数组标识符被用作取址(&)操作的操作数时,数组标识符代表整个数组,&array返回的是指向数组的指针,该指针的地址值等于该数组的首元素的地址。

a[0]是一个有4个元素的int数组的数组标识符,出现在&之后同样符合以上规则。&a[0]返回的是指向该一维数组的指针,该指针的地址值等于该数组的首元素的地址,也就是&a[0][0]。

(2)当数组组标识符出现在表达式中,这个标识符的类型就从“某种类型TYPE的数组”转换成一个指针。该指针的类型是TYPE*,该指针指向的类型是TYPE,也就是数组单元的类型,该指针指向的内存区就是数组第0号单元。

a是一个数组标识符,出现在表达式*a中,也要符合以上规则。a是一维数组的数组,其数组单元的类型是有4个元素的int数组;所以a出现在表达式中被转化为指针,该指针指向的类型是int [4],该指针指向它的第0个元素,也就是a[0]。*a就是把这个指针所指向的东西取出来,于是取出了a[0]。而a[0]作为一个一维数组的标识符出现在表达式(比如,printf)中会再次被转化为一个指针,该指针指向a[0][0],打印这个指针的值,就得到&a[0][0],也即a[0][0]的地址值。




[/Quote]


非常感谢,基础上懂了
  • 打赏
  • 举报
回复
你想想int a[4][4] 的地址就是一个占了四个字节的指针(32位计算机都占四个字节)吧。a,a[0],&a[0],*(a+0),*a,&a[0][0] 它们的位置是不是都在数组开头吗?
口口口
口口口口
口口口口
口口口口
且那个指针(数组中首地址)包含的信息是一样的,那肯定a,a[0],&a[0],*(a+0),*a,&a[0][0] 都是如上标的那个地址了。
lp0088 2009-10-11
  • 打赏
  • 举报
回复
多上机实验一下
printf各种取值再看一下上面的解释,应该会明白的。
slowgrace 2009-10-11
  • 打赏
  • 举报
回复
如果是一维数组,int a[3];

*a和&a就不会等价了。

你可以运用10楼的规则自己来推导一下原因。
非兔子_Logic0 2009-10-11
  • 打赏
  • 举报
回复
回帖每天回帖即可获得10分可用分!
slowgrace 2009-10-11
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 arong1234 的回复:]
记住:二维数组不是一维数组的数组
http://blog.vckbase.com/arong/archive/2004/06/05/371.html
[/Quote]

错。二维数组就是一维数组的数组。a[0]就表示一个有4个元素的整型数组。

这个帖子19楼。
slowgrace 2009-10-11
  • 打赏
  • 举报
回复
[Quote=引用楼主 pang123hui 的回复:]
书上首先定义了一个二维数组int a[3][4],然后说a,a[0],&a[0],*(a+0),*a,&a[0][0]是相等的。

这里面的a,a[0],*(a+0),&a[0][0]我都理解,但是不理解既然a[0]表示第一个一维数组的首地址,那么&a[0]又该如何理解呢?且*a又该如何理解呢?
[/Quote]

数组标识符在不同场合下扮演不同角色:
(1)当数组标识符被用作取址(&)操作的操作数时,数组标识符代表整个数组,&array返回的是指向数组的指针,该指针的地址值等于该数组的首元素的地址。

a[0]是一个有4个元素的int数组的数组标识符,出现在&之后同样符合以上规则。&a[0]返回的是指向该一维数组的指针,该指针的地址值等于该数组的首元素的地址,也就是&a[0][0]。

(2)当数组组标识符出现在表达式中,这个标识符的类型就从“某种类型TYPE的数组”转换成一个指针。该指针的类型是TYPE*,该指针指向的类型是TYPE,也就是数组单元的类型,该指针指向的内存区就是数组第0号单元。

a是一个数组标识符,出现在表达式*a中,也要符合以上规则。a是一维数组的数组,其数组单元的类型是有4个元素的int数组;所以a出现在表达式中被转化为指针,该指针指向的类型是int [4],该指针指向它的第0个元素,也就是a[0]。*a就是把这个指针所指向的东西取出来,于是取出了a[0]。而a[0]作为一个一维数组的标识符出现在表达式(比如,printf)中会再次被转化为一个指针,该指针指向a[0][0],打印这个指针的值,就得到&a[0][0],也即a[0][0]的地址值。

a[]

zbihong 2009-10-11
  • 打赏
  • 举报
回复
hah
realOffar 2009-10-11
  • 打赏
  • 举报
回复
提示:

从理论或概念角度上讲,它们存在差别

从内存索引角度和实际应用角度讲,二维数组和一维数组的数组可以认为等价

arong1234 2009-10-11
  • 打赏
  • 举报
回复
记住:二维数组不是一维数组的数组
http://blog.vckbase.com/arong/archive/2004/06/05/371.html
realOffar 2009-10-11
  • 打赏
  • 举报
回复
*a等价于*(a+0) , 这个你已经理解了

&a[0]理论上可以取到a[0][0]的地址 ,因为a[0]又表示第一个一维数组的首地址,或表示第一个一维数组的首元素,所以&a[0]等价于&a[0][0]

补充完毕,明白了的话请给分
realOffar 2009-10-11
  • 打赏
  • 举报
回复
*a等价于*(a+0) , 这个你已经理解了

&a[0]理论上可以取到a[0][0]的地址

回答结束
Z782282738 2009-10-11
  • 打赏
  • 举报
回复
&a[0]
&是地址运算符
zmmcoko 2009-10-11
  • 打赏
  • 举报
回复
简单啊,你直接printf这些东西的值出来就知道了

芒果仔 2009-10-11
  • 打赏
  • 举报
回复
这样理解比较好:

一维数组的话,如果有int *p=a,这里的a表示&a[0],这个是地址,就是数组a的第一个元素的地址,就是a[0]的地址。
那么它的元素的值是什么呢?是*a或者*(a+0),同样,如果是a[1]的话,它的地址是a+1,它的元素值是*(a+1)。

有一个二维数组a[3][4]:

11 15 27 56
56 47 59 77
25 81 78 55

其实是三个一维数组,每个一维数组还对应4个元素,在二维数组的情况下,我们再来int *p=a,这时是指0行0列的元素地址,就是a[0][0]的地址,即&a[0][0]。但是~在这个时候,a+1并不是往右移动的,即a+1并不是a[0][1]的地址,而是a[1][0]的地址,它是纵向移动的,那么我们怎么才能取到a[0][1]的地址呢?之前已经说了,a是a[0][0]的地址,那么元素值是*a或者*(a+0),既然它是第一个元素的元素值,那么它是不是和刚开始说的一维数组的数组名可以作为一维数组的首元素地址很相似呢?*(a+0)在此时又变成了二维数组第一行的首地址了,那么a[0][1]的地址就是*(a+0)+1,它的元素值就是*(*(a+0)+1)。同样,我们要表示a[2][0]呢?它的地址就是*(a+2)+0,它的元素值就是*(*(a+2)+0)了。

好吧……好像说得有点小小的复杂了,希望你能明白……
jxjszh 2009-10-11
  • 打赏
  • 举报
回复
应该也指首地址
wei832660 2009-10-11
  • 打赏
  • 举报
回复
a[0]可以看是列指针,a[0]+1指向a[0][1]位置,*a[0]取的是a[0][0]的值,
&a[0]是行指针, &a[0]+1指向a[1]的位置,*&a[0]变为列指针,*&a[0]+1 取的a[0][0]的值
陽洸膂珵 2009-10-11
  • 打赏
  • 举报
回复
的确理解起来有点费力!
我这是这样走过来的。

a,a[0],&a[0],*(a+0),*a,&a[0][0]是相等的

"但是不理解既然a[0]表示第一个一维数组的首地址,那么&a[0]又该如何理解呢?且*a又该如何理解呢? "


我是这样理解的:a 是首地址 *a 是第a个一维数组的道地址,这两个都是地址,且是同一个地址.
即a[0]==*a,有&a[0]==&(*a)==a.这时&a[0]是指道地址了。

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧