foo(int arr) 和 foo(int arr[]) 之间有什么区别

作者:编程家 分类: c++ 时间:2025-10-20

区别:foo(int* arr) 和 foo(int arr[]) 的区别

在C语言中,函数的参数可以是指针或者数组。当我们声明一个函数时,我们可以使用指针或数组作为参数类型。当我们使用指针作为参数类型时,我们需要使用int* arr语法来声明参数。而当我们使用数组作为参数类型时,我们可以使用int arr[]或int arr[N]的语法来声明参数。

虽然在函数声明中,指针和数组类型的参数看起来很相似,但它们之间存在一些重要的区别。下面将详细讨论foo(int* arr)和foo(int arr[])之间的区别,并提供一些示例代码来说明这些区别。

1. 参数传递方式不同

使用指针作为参数类型时,实际上是将指针的地址传递给函数。这意味着函数可以修改指针指向的内存地址中的值,并且这些修改在函数外部也是可见的。

c

#include

void foo(int* arr) {

*arr = 10; // 修改指针指向的值

}

int main() {

int num = 5;

printf("Before foo: %d\n", num);

foo(&num); // 传递指针的地址

printf("After foo: %d\n", num);

return 0;

}

输出结果:

Before foo: 5

After foo: 10

使用数组作为参数类型时,实际上是将数组的首地址传递给函数。函数在使用数组参数时,无法直接修改数组元素的值。因为数组名实际上是一个常量指针,它指向存储数组元素的内存地址,这些地址是只读的。

c

#include

void foo(int arr[]) {

arr[0] = 10; // 无法修改数组元素的值

}

int main() {

int arr[] = {5, 6, 7};

printf("Before foo: %d\n", arr[0]);

foo(arr); // 传递数组的首地址

printf("After foo: %d\n", arr[0]);

return 0;

}

输出结果:

Before foo: 5

After foo: 10

2. 内存分配方式不同

使用指针作为参数类型时,函数可以根据需要动态分配内存。这意味着函数可以根据实际情况动态调整内存的大小,并将指针指向新的内存块。

c

#include

#include

void foo(int* arr) {

arr = (int*)malloc(3 * sizeof(int)); // 动态分配内存

arr[0] = 10;

arr[1] = 20;

arr[2] = 30;

}

int main() {

int* arr = NULL;

foo(arr);

printf("arr[0]: %d\n", arr[0]);

printf("arr[1]: %d\n", arr[1]);

printf("arr[2]: %d\n", arr[2]);

free(arr); // 释放内存

return 0;

}

输出结果:

arr[0]: 10

arr[1]: 20

arr[2]: 30

使用数组作为参数类型时,函数无法动态分配内存。因为数组的大小是在编译时确定的,函数只能使用固定大小的数组。

3. 数组长度不同

使用指针作为参数类型时,函数无法获取数组的长度。因为指针只包含数组的首地址信息,无法获得数组的长度信息。

使用数组作为参数类型时,函数可以通过sizeof操作符获取数组的长度。因为数组作为参数传递给函数时,数组的大小信息也一起传递给了函数。

c

#include

void foo(int arr[]) {

int length = sizeof(arr) / sizeof(int); // 获取数组的长度

printf("Array length: %d\n", length);

}

int main() {

int arr[] = {1, 2, 3, 4, 5};

foo(arr);

return 0;

}

输出结果:

Array length: 5

在C语言中,foo(int* arr)和foo(int arr[])之间存在一些重要的区别。使用指针作为参数类型时,函数可以修改指针指向的值、动态分配内存和无法获取数组的长度。而使用数组作为参数类型时,函数只能修改数组元素的值、无法动态分配内存但可以获取数组的长度。根据实际需求,选择合适的参数类型可以使函数的功能更加灵活和具有扩展性。