1、数组参数会退化为指针的原因
C语言中,数组作为参数传递给函数时实际上传递的是指向数组首元素的指针,而不是整个数组。这样设计的原因是效率:传递指针比传递整个数组要高效得多。
因此,当你在函数中定义一个数组参数时,比如 int arr[]
或 int arr[10]
,编译器将其视为 int* arr
,即一个指向 int
的指针,而不是实际的数组。由于 arr
退化为指针,调用 sizeof(arr)
会返回指针的大小,而不是数组的大小。
#include <stdio.h>
void printArraySize(int arr[]) {
printf("Size of array parameter in function: %zu bytes\n", sizeof(arr));
}
int main() {
int arr[10]; // 定义一个大小为10的数组
printf("Size of array in main: %zu bytes\n", sizeof(arr));
printArraySize(arr); // 传递数组到函数
return 0;
}
2、函数中获取数组的实际大小的方法
由于数组在传递给函数时会退化为指针,如果我们需要在函数中知道数组的实际大小,可以通过传递数组的长度信息。
#include <stdio.h>
void printArray(int arr[], size_t size) {
printf("Array size in function: %zu\n", size);
for (size_t i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
int main() {
int arr[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
size_t size = sizeof(arr) / sizeof(arr[0]); // 计算数组元素个数
printf("Array size in main: %zu\n", size);
printArray(arr, size); // 将数组和大小传递给函数
return 0;
}
3、函数中使用指针加长度的方式
使用指针加长度的方式传递数组时,我们将数组的首地址和数组的长度一同传递给函数。这样,函数可以使用指针来操作数组,并根据传入的长度来遍历数组。
#include <stdio.h>
void printArray(int *arr, int length) {
for (int i = 0; i < length; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
int main() {
int arr[] = {1, 2, 3, 4, 5};
int length = sizeof(arr) / sizeof(arr[0]); // 计算数组长度
printArray(arr, length); // 传递数组指针和长度
return 0;
}