C语言二维数组指针的不解

来源:百度知道 编辑:UC知道 时间:2024/06/05 16:33:09
对于二维数组指针书上说a+1,a[i],*(a+i),&a[i][0]是等同的。a+i和&a[i][0]不是地址吗?a[i],*(a+i)不是元素吗?怎么等同了?

a 中放的是数组a[][]中的首地址;

a+i 类型为地址,值为a+i
&a[i][] 类型为地址,值也为数组的i个行的数组,因C是先行后列存放,例如a[2][2]在内存中是连续存放的,顺序是:
a[0][0],a[0][1],a[1][0],a[1][1],所以,&a[1][0],和&[1]的位置相同,
*(a+i) 类型为变量,如果你老师说他和a+i相同,你直接骂他SB
&a[1][0] 类型为地址,等同于&[1]
a[i] 类型为变量,如果你老师说他和&a[i][0]相同,你直接骂他SB

数组在计算机里面首先转换成指针
a[i]就转换为*(a+i)它俩完全一样
a[i]就是这样计算的
另外,二维数组表示一个面,二维
要确定一个元素就必须给出两个坐标
当然你给出第一个元素,慢慢加也可以

恩,可能解释了不会理解深刻。

这样吧,我反过来问你,a[i],*(a+i),你说它们是元素,请问,它们分别指向哪个元素呢?

这是二维数组噢。如果是一维数组,你的说法没错,但是二维就不同了,类似于平面坐标系,需要x,y两个数据才能确定一个点。这个道理差不多。

int a[3][4];
int (*p)[4]=a;
*(*(p+2)+2)=2;
printf("%d",a[2][2]);

你测试一下这个就知道了。p[0],p[1],p[2],p[3]是分别指向a[0],a[1],a[2],a[3],因为指向的是4*4字节的空间,*(p+2)代表p[2],*(p[2]+2)也就是a[2][2]了。。

二维数组的实质其实就是一个一维数组,它的每个元素又是一个一维数组