首先我们都知道数组在传参的时候,传的是数组的首元素地址,但是也有例外。
一,一维数组中
在一维数组中数组名确实能表示首元素地址,但是有两个例外。
1.sizeof(数组名),这里的数组名表示的是整个数组,计算的是整个数组的大小,单位是字节。
2.&数组名,这里的数组名表示整个数,取地址的是整个数组的地址。
以下代码可以自己动手写一下,易于加深理解。
#include<stdio.h>
int main()
{
int arr[10]={0};
printf("p",arr);//arr就是首元素地址
printf("p",arr+1);//首元素地址加一,就是第二个元素的地址。
printf("-------------\n");
printf("p",&arr[0])//&arr[0]就是首元素地址
printf("p",&arr[0]+1)//和arr+1一样。
printf("-------------\n");
printf("p",&arr)//&arr表示整个数组的地址
printf("p",&arr+1)//表示跳过整个数组的地址,是数组最后一个地址加一的地址。
return 0;
}
注意:在构造函数中形参为数组名时,在该函数中使用sizeof(数组名)计算的是数组首元素地址的大小,而不是整个数组的大小,因为数组在传参的时候,传递的是地址。
二,二维数组中
二维数组也符合上面一维数组的两个例外。
二维数组中的数组名(arr)也代表首元素的地址,只不过在二维数组中,该地址代表的是第一行整个的地址。
#include<stdio.h>
int main()
{
int arr[3][4] = { 0 };
printf("p",arr);//arr代表的是数组arr的第一行整行的地址
printf("---------------\n");
printf("p", arr + 1);//arr+1代表的是数组arr的第二行整行的地址
//根据这个知识点,可以计算二维数组中的行和列的大小。
//计算行的大小
printf("%d", sizeof(arr) / sizeof(arr[0]));//sizeof(arr)代表的是整个二维数组的大小,sizeof(arr[0])代表的是第一行数组的大小。
//计算列的大小
printf("%d", sizeof(arr[0]) / arr[0][0]);//sizeof(arr[0])表示数组第一行的大小,sizeof(arr[0][0])代表的是第一个元素的大小。
return 0;
}
通过上面的例子,我们能够清晰的理解二维数组名代表的含义。