指向数组的指针作为C中的函数参数

时间:2017-01-08 21:56:59

标签: c arrays pointers

我正在学习C,我在理解整数数组和指向它的指针之间的区别时遇到了问题。更具体地说,

int *array;
int size = atoi(argv[1]);
array = malloc(sizeof(int)*(size));

int len = read_array_from_file(array, atoi(argv[1]), filename);

merge_sort(array, 0, len-1);

令我困惑的是,函数的定义是

int read_array_from_file(int array[], size_t size, char *filename);
void merge_sort(int* array, int first, int last);

并且两者都可以正常使用'array'作为参数,其类型没有错误。那是为什么?

2 个答案:

答案 0 :(得分:2)

作为函数参数,int array[]完全等同于int *array

[]的目的是向读者传达函数所采用的int *指针应该指向一个数组,而不仅仅是一个int

您可以在括号内放置restrictconst等限定符,以获得int *restrict或int *const的等效值,在C11中,您甚至可以< / p>

int array[static MINIMUMS_SIZE] 

传达数组参数应该至少有MINIMUM SIZE成员。 (clang检查这个,gcc没有(我上次检查))。

int foo(int array[static 1])

(也是C11)应该有效地等同于

int foo(int *array) __attribute__((__nonnull__));
//== please help me check I don't pass a NULL pointer

你甚至可以这样做:

int foo(int n_items, int array[n_items]);

并祈祷编译器将帮助您检查(它可能赢了)。

在任何情况下,基本和最早的规则是参数中的数组只是转换为指针。

答案 1 :(得分:0)

其原因是所谓的&#34;指针衰减&#34;。函数的类型实际上是:

int read_array_from_file(int *array, size_t size, char *filename);
//                           ^ array changed to pointer

这是C标准规定的,特别适用于函数参数。