我正在学习 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”作为参数,其类型没有错误。这是为什么?
最佳答案
作为函数参数,int array[]
完全等同于 int *array
。
[]
的目的是向读者传达该函数采用的 int *
指针可能应该指向一个数组,而不仅仅是一个 int
。
您可以将诸如 restrict
或 const
之类的限定符放在括号内,以获得 int *restrict
或 int * 的等效项const
,在 C11 中,你甚至可以这样做
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]);
并祈祷编译器会帮助您检查这一点(它可能不会)。
无论如何,基本且最古老的规则是参数中的数组简单地转换为指针。
关于c - C 中指向数组的指针作为函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41538342/