将数组作为 int A[] 而不是 int *A 传递有什么好处吗?

Ama*_*tti 3 c arrays pointers function

假设我将一个传递数组的函数声明为指针:

void fun(int *A, int n);

如果我改用数组特定的指针,即

void fun(int A[], int n);

它有什么特别的优势吗?

Eri*_*hil 6

(这个答案是对 C 说的。)

对于intsize的数组,[]编译器没有区别,因为 C 2018 6.7.6.3 7 说:

将参数声明为“类型数组”应调整为“指向类型的限定指针”,其中类型限定符(如果有)是在数组类型派生的[]中指定的那些……

但是,对于T一般的某些类型,存在差异。根据 C 2018 6.7.6.2 1,在声明数组时,元素类型必须完整,即使数组稍后会调整为指针:

… 元素类型不应是不完整或函数类型…

考虑typedef int T[];,它定义T为 的别名int [],它是一个int元素数量未知的的数组。这种类型是不完整的,因为元素的数量是未知的。所以我们不能声明一个T. 相反,指针可能指向不完整的类型。所以void fun(T *A, int n);是允许的,但void fun(T A[], int n);不允许,因为它违反了 6.7.6.2 1。

另一个区别是大小是否已指定并且是可变的。然后可以在调用函数时对其进行评估。(C 标准对此并不明确,但 Clang 和 GCC 会对其进行评估。)例如,给定一个函数定义void fun(int A[printf("Hello, world.\n")], int n) { … },当fun被调用时,“Hello, world”。将被打印。这当然不会发生在void fun(int *A, int n) { … }.