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