前言
在C语言中经常要用到数组,数组是一类同类型元素的集合。数组的定义很简单,但在实际应用中数组名在不同的情况下含义不同。
一、数组名是什么?
在我们学习C语言的时候,我们都知道数组名就是数组首元素的地址。
int arr[10] = { 0 };
printf("%p\n", arr);
printf("%p\n", &arr[0]);
运行结果
这说明数组名就是数组首元素的地址
如果数组名就是数组首元素的地址,那么下面代码的运行结果应该是8(64位的情况下)。
int arr[10] = { 0 };
printf("%d\n", sizeof(arr));
但实际的运行结果为40并不是8,这说明数组名在某些情况下并不是数组首元素的地址。
总结:大多数情况下数组名就是数组首元素的地址,以下情况例外
- sizeof(数组名),计算整个数组的大小,sizeof内部单独放一个数组名,数组名表示整个数组。
- &数组名,取出的是数组的地址。&数组名,数组名表示整个数组
二、用法
它们在使用方面略有区别
int arr[10] = { 0 };
printf("%p\n", arr);
printf("%p\n", arr + 1);
printf("%p\n", &arr);
printf("%p\n", &arr + 1);
运行结果
总结
arr与arr+1相差4个字节,这说明arr+1跳过一个元素,而&arr与&arr+1在十六进制下相差28,转换为十进制为40字节,这说明&arr+1跳过整个数组。
三、数组函数的参数进行传参
函数在定义时,形参可以写成两种形式。
1.数组形式
2.指针形式
int arr1[10]= {0};
char ch[3][5] = {0};
test(arr);
test2(ch);
下面这两种形式都可以作为数组传递时函数形参的表示
1.数组表示
void test(int arr[10])//一维数组定义时,可以不指定大小,int arr[]也可以
{
}
void test2(char arr[3][5])//二维数组定义时,可以不指定行,但必须指定列,char arr[][5]也可以
2.指针表示
void test(int *arr)
{
}
总结
数组名是数组首元素的地址,本质上是一种指针,数组作为参数进行传递时,函数的形参形式上可以写成数组的形式,但其本质还是指针。