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

标签 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”作为参数,其类型没有错误。这是为什么?

最佳答案

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

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

您可以将诸如 restrictconst 之类的限定符放在括号内,以获得 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/

相关文章:

C++:使用 LSD 基数排序崩溃的字符串排序

java - 如何从java中的hashmap中删除字符串数组值?

javascript - 为什么 jQuery 结果看起来像一个函数?

Delphi double 到字节数组

c - 如何使用 win32 API 获取链接标签的句柄

c - C中互斥量的定义和使用

c - 虚拟鼠标和 eventX

c - STM32L0 上的 VREF 输出

c - 矩阵作为二维指针 C

c++ - 在 C++ 中删除 void 指针