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[*][*]);