C参数数组声明符

时间:2010-09-12 01:54:03

标签: c arrays function syntax parameters

在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限定符意味着什么?该标准没有清楚地说明每种语法的原因。

1 个答案:

答案 0 :(得分:24)

只要您只使用一维数组,上述声明都是等效的。最后一个虽然

void f(int i, int a[static i])

有额外的效果。它在参数类型方面等同于以前的参数类型,但也告诉编译器它可以依赖指向至少a元素的数组的i参数(可以在优化中使用) )。

您还忘记了另一个新声明

void f(int i, int a[const])

即使在一维数组的情况下,这个实际上确实有效。它相当于

void f(int i, int *const a)

虽然有些人可能认为对函数参数的const限定是无用的。在使用[]语法进行声明时,无法对指针进行const限定之前,数组参数会“衰减”。

*之间的i(以及[])仅在多个[]中的[]对之间使用时才开始重要 - 维数组声明。本质上,它就像它一直一样:参数声明中的数组大小始终只在第二对或另一对*之间起作用。当未明确命名大小值时,void bar(int n, int m, int a[n][m]); 用于VLA参数的原型声明。例如,您可以声明

a

并且编译器将知道a是VLA,因为大小不是常量。但是如果您不想在原型中命名参数,那么您如何告诉编译器*是VLA?那是void bar(int, int, int a[*][*]); 帮助

的时候
{{1}}