二维数组的指针机制:就是按照一维分布的。
如:int arr[4][3]={{1,2,3},{4,5,6},{7,8,9},{10,11,12}};
int* p = arr[0];就是说*p从1开始,*p[1]就是a[0][1],*p[2]就是a[0][2],等等,知道*p[11]就是a[3][2]
你说的那四个值一样,那是肯定的,都是计算机为这个二维数组分配内存的首地址,
1,是给二级指针再取地址,就变成三级地址。
2,3,都一样 是一级指针
4,表示去一般变量的地址。
不懂的可以再问。
数组在内存中都是按照元素一个一个存储,比如int型占4个字节,那么arr就占有连续的48个字节的内存,你想问的应该是这些打印的区别,可以看注释,以下打印都是同一个地址值
void main()
{
int arr[4][3]={{1,2,3},{4,5,6},{7,8,9},{10,11,12}};
printf("%d\n",arr); //arr是数组名,同时也代表这个数组的地址
printf("%d\n",(&arr)); //代表arr[4][3]的首地址,&arr + 1的步长是12个int(一般为4字节)
printf("%d\n",*arr); //代表的是第一列数据的地址
printf("%d\n",&arr[0]);//代表是第一行数据的地址
printf("%d\n",&arr[0][0]);//代表数据第一个元素的地址
}
首先你要知道:数组名代表数组中第一个元素的地址,所谓数组元素的指针就是数组元素的地址。上面是一个二维数组arr是其数组名,那么可以知道(&arr)就是取这个二维数组的地址,而数组的地址,就是其首元素的地址,也就是a[0][0]的地址,而数组的指针*arr也是数组的地址(一个变量的指针就是这个变量的地址,同样地,一个数组的指针也是一个数组的地址,而数组的地址就是它首元素的地址);&arr[0]意思是取第1行的地址,相当于整个数组的首地址。
所以以上四个的结果都是数组首元素的地址。
1 2 3
4 5 6
7 8 9
10 11 12
数组名就是这个数组的首地址, &arr *arr取的都是首地址的内容 1
arr[0] 是数组的第一行的首地址 &arr[0] 取得就是第一行的首地址的内容 1
arr[0][0] 数组的第一个元素的地址 即 1 &arr[0][0] 取得就是第一个元素 1
首先我说一下中,这四个结果都有第一个元素的地址,最后一个我就不说了,那个是最容易去理解的了,而其它的几个你联想到指针就不难去理解了