社区
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又该如何理解呢?
在此先行感谢回答
...全文
187
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
作业
写回复
配置赞助广告
用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语言
二级
数组
和
二级
指针
转载博客:https://www.cnblogs.com/zou107/p/4909847.html 一、关于二维
数组
和二维
数组
区别 (1)一维
数组
在内存中是连续分布存储的,同样,二维
数组
也是在内存连续存储的。所以从内存的角度来分析,一维
数组
和二维
数组
其实没有本质区别。 (2) 二维
数组
可以使用一维
数组
来代替。但是在实际的应用中,有时候使用二维
数组
会更加直观,方便程序的编程。 (3)...
二维
数组
与
二级
指针
关于二维
数组
与
二级
指针那些你必须知道的事首先,来看
一个
例子
一个
error嗯,我是解析 首先,来看
一个
例子 #include <iostream> using namespace std; int main(void) { int **p; p=new int*[5]; for(int i=0;i<5;i++) { p[i]=new int[5]; } retu...
二级
指针(二维
数组
)
二维
数组
:逻辑存储: 物理存储: C语言中的多维
数组
基本的定义是以
数组
作为元素构成的
数组
,二维
数组
的
数组
元素是- -维
数组
, 三维
数组
的
数组
元素是
一个
=维
数组
,依此类推。也就是说,多维
数组
用的是
一个
嵌套的定义。
二级
指针: *s改变 改变了p **s改变 改变了b的值 s+1 // 相当于 p0->p1 +4byte int **(...
二维
数组
和
二级
指针传参
问题
二维
数组
作为实参,
二级
指针作为形参 part1 报错:说我给
二级
指针传了
一个
数组
指针去,
数组
指针(指向
数组
的指针), part2 给
二级
指针传
一个
数组
指针就可以解决了。 part3(总结) 把指针
数组
和
数组
指针好好区别一下!!! 指向
数组
的指针:int (*array)[3];含义是
一个
指向存放3个整型数据的
数组
的指针 存放指针的
数组
: char *array[3];含义是
一个
数组
中存放了3个...
C语言中的
二级
指针和二维
数组
问题
关于
二级
指针和二维
数组
两者差别很大,不可以直接用
二级
指针传递二维
数组
首先来看看二维
数组
在内存中是如何组织的呢? 一维
数组
T arr1 = new T[9] 二维
数组
T arr2 = new T[3][3] 实际上,不管是一维还是多维
数组
,都是内存中一块线性连续空间,因此在内存级别上,其实都只是一维。但是不同的定义使得表现形式不一样,从而有多维
数组
的概念。访问
数组
元素
C语言
70,022
社区成员
243,263
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章