C参数数组声明符
在C99中有变长数组,参数数组声明符中可以有静态限定符(和类型限定符):
void f(int i, int *a); void f(int i, int a[]); void f(int i, int a[i]); void f(int i, int a[*]); // Only allowed in function prototypes. void f(int i, int a[static i]);
由于数组函数参数只是衰减到指针,以前的声明之间是否有任何实际差异,还是风格问题? 什么时候应该使用它们? 特别是, static
限定符意味着什么? 该标准没有清楚地说明每种语法的原因。
只要您只使用一维数组,上述声明都是等效的。 最后一个
void f(int i, int a[static i])
有额外的效果。 它在参数类型方面等同于先前的参数类型,但也告诉编译器它可以依赖于指向至少i
元素的数组的参数(可以在优化中使用)。
你也忘记了另一个新的宣言
void f(int i, int a[const])
即使在一维arrays的情况下,这个实际上确实具有效果。 它相当于
void f(int i, int *const a)
虽然有些人可能认为function参数的常量资格是无用的。 在使用[]
语法进行声明时,在无法对指针进行const限定之前,数组参数会“衰减”。
[]
之间的*
(以及i
)只有在多维数组声明中的第二(或更多) []
对之间使用时才开始重要。 从本质上讲,它就像它一直一样:参数声明中的数组大小始终只在第二个或另一对[]
之间起作用。 当未明确指定大小值时, *
用于VLA参数的原型声明。 例如,您可以声明
void bar(int n, int m, int a[n][m]);
并且编译器将知道a
是VLA,因为大小不是常量。 但是如果您不想在原型中命名参数,那么您如何告诉编译器a
是VLA? 那是*
帮助的时候
void bar(int, int, int a[*][*]);