二维数组,相当于两层指针
也就是说,是指向指针的指针
a,a[0],&a[0][0]都是首地址的地址内容,但是意义很不相同
a表示整个数组的首地址,
a[0]是第一行这个数组的首地址
&a[0][0]这个表示第一个元素的地址
如a[0],这个表示第一行的所有元素。而不是一个元素
可以把它看做一个数组,那么a[0]就是一个数组名,一般表示这个数组的首地址
这么说来,a+i是i行的首地址,也可以说是a[i]这个数组的数组名,是一个地址
那么*(a+i)还是一个指向第i行的第一个元素的指针,他是一个地址
*(*(a+i)+j)这样才是第i行第j个元素的内容
C语言在这点上是很混扰人的。C语言形式逻辑不成立。所以一个星,两个星的,烦人呢。
a[3][4]; 是2维数组,两个星 才是 内容!
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
printf("%d", *(*(a+1)+1)); // 打印出 6.
*(a+1)+1 是 a[1][1] 的地址。
a[0]+1 -- 印错了,是地址 a[1]+1, 打印出 6.
已经调试通过,修改地方加了注释,望采纳!!! #include
*(a+1)+1无条件等价于a[0]+1,什么,你不知道为什么? 我给你讲讲:
*(a+1)如果是要表示内容的话,a应该是个指针变量,或者是一维的数组名,那你说a是指针变量吗?a是一维数组名吗? 呵呵!都不是,那你凭什么说*(a+1)是内容?
这样你能明白吗?
希望能帮到你,祝你学习进步!