社区
C语言
帖子详情
关于二维数组与指针的几个搞不太清楚的地方
tuxyin
2010-12-02 09:46:31
int arr[5][4];
问1:
<1> arr
<2> arr[0]
<3> &arr[0][0]
<4> *arr
这几种种情况得到的是同一种结果吗?
问2:(*arr)+n 能得到二维数组所有元素地址吗?
问3:arr+n 等于 *(arr+n) 不?为啥?
问4:*arr[0] 等于 **arr 不?为啥?
...全文
109
8
打赏
收藏
关于二维数组与指针的几个搞不太清楚的地方
int arr[5][4]; 问1: arr arr[0] &arr[0][0] *arr 这几种种情况得到的是同一种结果吗? 问2:(*arr)+n 能得到二维数组所有元素地址吗? 问3:arr+n 等于 *(arr+n) 不?为啥? 问4:*arr[0] 等于 **arr 不?为啥?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
8 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
wanlongpo
2010-12-04
打赏
举报
回复
int a[4][5];
aining0809
2010-12-03
打赏
举报
回复
我是这样理解的:
首先二维数组是有行列之分的,所以
arr是数组的首地址
&arr[0]是行地址
&arr[0][0]是列地址
其实上面的地址
值
是相同的,只是所解释的含义有所不同罢了。
而[]和*与&互为逆运算,例如*存在,就有可能将(行地址)->(列地址),而&则有可能将(列地址)->(行地址)
再例如:
a[0][0]是一个变量值
&arr[0][0]就是列地址,指向第0行的第一位
*(&a[0][0]):变量值->列地址->变量值
所以,以上问题的答案是
问1:
<1> arr (数组地址)
<2> arr[0] (列地址,&arr[0]是行地址)
<3> &arr[0][0] (列地址)
<4> *arr (行地址)
问2:(*arr)+n 能得到二维数组所有元素地址吗?
虽然是二维数组,但因为物理存储时连续的,所以是可以访问所有元素地址的。
问3:arr+n 等于 *(arr+n) 不?为啥?
值是相等的,但意义不同
arr+n是行地址,*(arr+n)是列地址
问4:*arr[0] 等于 **arr 不?为啥?
完全一致!首先这里得到的是数组值,只是表达的方式不太一样而已。
由列地址arr[0]通过*求的0行0列的值
由arr+0(行地址)-> *(arr+0)(列地址)-> *(*(arr+0)) 求得0行0列的值
----------
语无伦次,希望你能理解!
ForestDB
2010-12-03
打赏
举报
回复
关键:理解“类型”这一概念(原始类型,指针类型,数组类型);
C没有多维数组,只有数组的数组,即数组的元素是数组。
int arr[5][4];
问1:
<1> arr
arr是个数组有5个元素,每个元素又是个数组,有4个int
<2> arr[0]
arr[0]是个有4个int的数组
<3> &arr[0][0]
元素a[0][0]的地址
<4> *arr
这个和<2>一样,不过是用*来解引用的
这几种种情况得到的是同一种结果吗?
“值”相同,类型不同。
问2:(*arr)+n 能得到二维数组所有元素地址吗?
可以也不可以,可以是因为内存是平坦的,数组也是平坦的(而C是不检查越界的);
说不可以是因为由上*arr得到的是第0个int[4],+n得到的就是这个int[4]中的每个元素的地址。
问3:arr+n 等于 *(arr+n) 不?为啥?
不等于,arr是int[5][4]这样的类型,arr+n得到的是第n个元素(int[4]),而*(arr+n)是对int[4]解引用了,即每个int[4]中的第0个int。
问4:*arr[0] 等于 **arr 不?为啥?
等于,两种不同的解引用的方式。
bluewanderer
2010-12-02
打赏
举报
回复
数组的特点就是参与数值运算的时候会转换成对应的指针
char [5][4] -> char (*)[4]
char [4] -> char *
bluewanderer
2010-12-02
打赏
举报
回复
问1:
<1> arr (char (*)[4])
<2> arr[0] (char *)
<3> &arr[0][0] (char *)
<4> *arr (char *)
这几种种情况得到的是同一种结果吗?
前提是参与数值运算,并且不考虑类型,值都是一样的。后三个完全一样。
问2:(*arr)+n 能得到二维数组所有元素地址吗?
能
问3:arr+n 等于 *(arr+n) 不?为啥?
还是参与数值运算的话,并且不考虑类型,值一样
问4:*arr[0] 等于 **arr 不?为啥?
C里a[b]永远等价于*(a + b)
aa1013911535
2010-12-02
打赏
举报
回复
自己试试 啊
bullbat
2010-12-02
打赏
举报
回复
写几行测试代码 在汇编下看看 就明白了
MrEdifier
2010-12-02
打赏
举报
回复
LZ可以测试下,*arr和arr[0][0]值是否相等。这样就知道arr是否是指针的指针了。
青少年C++编程NOIP/CSP竞赛通关语法-
二维数组
1、本课程为零基础C++语法专题课,是青少儿参加信息学奥赛NOIP/CSP需要学习的语法专题课; 2、本课程每节课均配有练习题以及真题,以锻炼孩子的解题能力;... 6、本课程介绍的是
二维数组
。也是历来竞赛重要考点。
二维数组
与
指针
(详解)
在这我们定义了一个
二维数组
,拥有3行3列共9个int型存储空间大小。 2.
二维数组
的行地址和各个元素地址的表示 int a[3][4]; 对于数组a,我们可以将a[3][4]分为两部分理解a[3]和[4],对于a[3],我们可以看成是一个一...
二维数组
指针
表示,C语言
指针
引用
二维数组
详解
指针
变量可以指向一维数组中的元素,当然也就可以指向
二维数组
中的元素。但是在概念和使用方法上,
二维数组
的
指针
比一维数组的
指针
要复杂一些。要理解
指针
和
二维数组
的关系首先要记住一句话:
二维数组
就是一维数组,...
二维数组
指针
传递 c语言,如何在C函数中传递指向
二维数组
的
指针
参数
如何在C函数中传递指向
二维数组
的
指针
参数前几日用C编写DSP程序时,遇到一个问题:如何向C函数中传递指向
二维数组
的
指针
参数。初接触以为很简单,直接声明一个
二维数组
,然后把数组名传进去。但是一经编译便报错。...
【C语言】
二维数组
与
指针
我们都知道一维数组,但是关于
二维数组
,我们容易
搞
蒙。有一个特殊的说法:
二维数组
就是父子数组,为了研究
清楚
地址的概念,我们把
二维数组
回归到一维数组去讲解。看这段代码: 通过对
指针
和数组的学习,...
C语言
69,369
社区成员
243,082
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章