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; }