C语言二维数组和指针的问题

C语言二维数组和指针的问题二维数组a[][],为什么a+1的值和*(a+1)是相等的... C语言二维数组和指针的问题二维数组a[ ] [ ] , 为什么a + 1的值和*(a + 1)是相等的 展开
 我来答
百度网友da134f4
2018-09-04 · TA获得超过183个赞
知道小有建树答主
回答量:214
采纳率:60%
帮助的人:126万
展开全部

两位的问答快给我看晕了。。不看书好多年了,不知道自己说的还对不对,供参考

定理是酱紫的:数组的地址 等于 数组首元素的地址。括弧(相等的只是地址!!!

如上所述,a+1肯定是不等于*(a+1)的,原因如下:

  1. 类型都不一致怎么比(印象中老版本编译器可以)

  2. (a+1)+1是绝不可能等于*(a+1)+1的。

要说等于的话是这样等于(int)(a+1)==(int)*(a+1)或者这样(int*)(a+1)==(int*)*(a+1)这样(int**)(a+1)==(int**)*(a+1)

总而言之是它们的地址相等,也就是说a+1和*(a+1)表示的是同一个地址,都是a[1][0]的地址,相等的必要条件是a[1]的类型必须是指针,同理:a[1]和&a[1]表示的也是同一个地址(这根本就是定理本身....)

追问
只是值相等,但是意义是不一样的,a , a+ 1, a + i等等都是指向了二维数组的一行,它的加1是整行整行的移动,而*(a + 1)+1是数组移动数组一个元素的大小。具体原因我也不知道。在一本书上看的。这个问题弄得我头疼
金色潜鸟
2018-09-04 · TA获得超过3.2万个赞
知道大有可为答主
回答量:1.3万
采纳率:89%
帮助的人:5697万
展开全部
a是2维数组的首地址。a+0 是二维数组第0行的首地址&a[0][0],a+1是二维数组第1行的首地址&a[1][0]。
方括号是运算符: a[i] = *(a+i)
套用上面公式,有:
a[1][0] =(a[1])[0] = *(a[1]+0) = *(a[1]);
对两边 取地址:
&a[1][0] = & ( *(a[1]) ); &* 对消, &a[1][0] =a[1];
a[1] 等于二维数组第1行的首地址&a[1][0]。
所以,二维数组, a + 1的值 和 *(a + 1)是相等的。都等于二维数组第1行的首地址。
追问
牛逼,不过我已经懂了,a + 1是二维数组第一行的地址,即a [ 1],这个a[1]在内存中实际是不存在的,只是一种地址计算方法,它是数组的行地址, 而* (a + 1 )  是数组的列地址,行地址和列地址在交叉部分是相等的,只是地址的计算不同,行地址加一计算是加数组一整行的长度,列地址加一只加一个元素的长度。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式