面试题答案
一键面试在C语言中,当一维数组名作为函数参数时,它会被自动转换为指向数组首元素的指针,二者在这种情况下是等效的。以下是实现计算一维数组所有元素和的两个函数,一个以数组形式声明参数,另一个以指针形式声明参数:
// 以数组形式声明参数
int sumWithArray(int arr[], int size) {
int sum = 0;
for (int i = 0; i < size; i++) {
sum += arr[i];
}
return sum;
}
// 以指针形式声明参数
int sumWithPointer(int *ptr, int size) {
int sum = 0;
for (int i = 0; i < size; i++) {
sum += *(ptr + i);
}
return sum;
}
联系
- 本质相同:在函数参数传递中,数组名和指针在处理方式上本质是一样的,都指向数组首元素的地址。编译器对
arr[i]
和*(ptr + i)
的处理方式相同,都是通过地址偏移来访问数组元素。 - 内存访问:无论是以数组形式还是指针形式,对数组元素的内存访问方式是一致的,都是基于首地址和元素偏移量来获取数据。
区别
- 语法表示:数组形式声明参数更直观地表示这是一个数组,而指针形式更强调是一个指向数组首元素的指针。例如
int arr[]
和int *ptr
声明方式不同。 - 含义不同:在函数外部,数组名代表整个数组,有自己的地址和占用空间大小;而指针只是一个变量,存放地址。但在函数参数中,数组名失去了这种含义,退化为指针。
- sizeof操作:在函数内部,对以数组形式声明的参数使用
sizeof
,得到的是指针的大小(通常是4字节或8字节,取决于系统架构),而不是数组实际占用的内存大小。例如sizeof(arr)
在函数内部得到的是指针大小,而不是数组所有元素占用空间之和。这与在函数外部对数组名使用sizeof
得到数组总大小不同。