1、传递数组时
当将数组作为参数传递给函数时,实际上是将数组的 指针(即数组首元素的地址)传递给函数。因此,数组传递给函数时会发生隐式转换,传递的是指向数组的指针,而不是数组的副本。
void func(int arr[5]) { // 这里 arr 实际上是一个指向 int 的指针 arr[0] = 10; } int main() { int arr[5] = {1, 2, 3, 4, 5}; func(arr); printf("%d\n", arr[0]); // 输出 10,因为 arr[0] 被修改 return 0; }
2、传递数组指针时
如显式地传递数组指针,例如 int *arr
,它的行为是完全相同的。即函数接收到的是指向数组的指针,数组的元素可以被修改。
void func(int *arr) { arr[0] = 10; // 修改数组中的元素 } int main() { int arr[5] = {1, 2, 3, 4, 5}; func(arr); printf("%d\n", arr[0]); // 输出 10 return 0; }
3、函数参数的实际区别
无论是 int arr[5]
还是 int *arr
,传递给函数时都实际上传递的是 指针,也就是数组的首地址。函数无法知道数组的大小,除非额外传递数组的大小作为参数。
void func(int *arr, int size) { for (int i = 0; i < size; i++) { printf("%d ", arr[i]); } } int main() { int arr[5] = {1, 2, 3, 4, 5}; func(arr, 5); // 需要显式传递数组的大小 return 0; }
区别总结
#include <stdio.h> // 使用数组作为参数 void func1(int arr[5]) { arr[0] = 10; } // 使用指针作为参数 void func2(int *arr) { arr[0] = 20; } int main() { int arr[5] = {1, 2, 3, 4, 5}; func1(arr); printf("After func1: %d\n", arr[0]); // 输出 10 func2(arr); printf("After func2: %d\n", arr[0]); // 输出 20 return 0; }