(这个答案是对 C 说的。)
对于int
size的数组,[]
编译器没有区别,因为 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) { … }
.