我正在学习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'作为参数,其类型没有错误。那是为什么?
答案 0 :(得分:2)
作为函数参数,int array[]
完全等同于int *array
。
[]
的目的是向读者传达函数所采用的int *
指针应该指向一个数组,而不仅仅是一个int
。
您可以在括号内放置restrict
或const
等限定符,以获得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标准规定的,特别适用于函数参数。