关于二维数组与指针的几个搞不太清楚的地方

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 打赏 收藏 转发到动态 举报
写回复
用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是否是指针的指针了。

69,369

社区成员

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

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