C语言二维数组和指针的问题
C语言二维数组和指针的问题二维数组a[][],为什么a+1的值和*(a+1)是相等的...
C语言二维数组和指针的问题二维数组a[ ] [ ] , 为什么a + 1的值和*(a + 1)是相等的
展开
2个回答
展开全部
两位的问答快给我看晕了。。不看书好多年了,不知道自己说的还对不对,供参考
定理是酱紫的:数组的地址 等于 数组首元素的地址。括弧(相等的只是地址!!!
如上所述,a+1肯定是不等于*(a+1)的,原因如下:
类型都不一致怎么比(印象中老版本编译器可以)
(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是数组移动数组一个元素的大小。具体原因我也不知道。在一本书上看的。这个问题弄得我头疼
展开全部
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[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 ) 是数组的列地址,行地址和列地址在交叉部分是相等的,只是地址的计算不同,行地址加一计算是加数组一整行的长度,列地址加一只加一个元素的长度。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询