社区
C语言
帖子详情
一个关于二级数组的问题
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又该如何理解呢?
在此先行感谢回答
...全文
220
19
打赏
收藏
一个关于二级数组的问题
我是大一嵌入式的新生,在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又该如何理解呢? 在此先行感谢回答
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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]
非常感谢,基础上懂了
数学VS游戏开发
2009-10-11
打赏
举报
回复
你想想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
Real Offar
2009-10-11
打赏
举报
回复
提示:
从理论或概念角度上讲,它们存在差别
从内存索引角度和实际应用角度讲,二维数组和一维数组的数组可以认为等价
wanjingwei
2009-10-11
打赏
举报
回复
给两篇文章自己看去
http://blog.csdn.net/iu_81/archive/2007/09/12/1782642.aspx
http://kenshin2008.blog.hexun.com/17925106_d.html
arong1234
2009-10-11
打赏
举报
回复
记住:二维数组不是一维数组的数组
http://blog.vckbase.com/arong/archive/2004/06/05/371.html
Real Offar
2009-10-11
打赏
举报
回复
*a等价于*(a+0) , 这个你已经理解了
&a[0]理论上可以取到a[0][0]的地址 ,因为a[0]又表示第一个一维数组的首地址,或表示第一个一维数组的首元素,所以&a[0]等价于&a[0][0]
补充完毕,明白了的话请给分
Real Offar
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]是指道地址了。
c语言
二级
题分数,计算机
二级
C语言题型和评分标准
这篇博客讨论了
一个
C语言编程
问题
,涉及全国计算机
二级
考试的大题。
问题
要求编写
一个
函数,将给定的M行N列二维
数组
的数据按列顺序存入一维
数组
。代码示例给出了如何实现这个转换,主要涉及
数组
操作和指针运用。
计算机等级
二级
c语言题型,计算机
二级
C语言题型和评分标准
这篇博客讨论了
一个
C语言编程
问题
,涉及全国计算机
二级
考试的大题。主要内容是如何编写
一个
函数,将给定的M行N列二维
数组
的数据按列顺序存入一维
数组
。代码示例给出了如何实现这个转换,同时提供了主函数调用和输出示例。
考计算机
二级
c语言题型,计算机
二级
C语言题型和评分标准
这篇博客讨论了
一个
C语言编程
问题
,涉及全国计算机
二级
考试的大题。主要内容是如何编写
一个
函数,将M行N列的二维
数组
数据按列顺序放入一维
数组
中。示例给出了
一个
3x4的二维
数组
,并展示了转换后的一维
数组
应该如何排列。博客还提供了部分源代码供参考,并在main函数中进行了测试打印。
全国计算机
二级
c语言考试分值,计算机
二级
C语言题型和评分标准
这篇博客讨论了
一个
C语言编程
问题
,涉及全国计算机
二级
考试的
一个
大题。题目要求编写
一个
函数,将M行N列的二维
数组
按列的顺序重新组织到一维
数组
中。示例给出了
一个
3x4的二维
数组
,并提供了主函数main的实现来展示二维
数组
的内容和转换后的一维
数组
。函数fun的功能是实现这个转换,但题目中提供的参考代码为空。
C++统计指定范围里的数 2023年12月c++
二级
电子学会中小学生软件编程C++等级考试
二级
真题答案解析
本篇博客解析了2023年12月C++
二级
考试中关于统计指定范围内数字的
问题
。题目要求计算
一个
数组
中位于给定区间[L, R]内的元素个数。通过遍历
数组
并判断每个元素是否符合条件,最终统计数量。文章详细介绍了算法思路、代码实现及考点分析。
C语言
70,038
社区成员
243,247
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章