代码之家  ›  专栏  ›  技术社区  ›  alecov

C参数数组声明符[重复]

  •  15
  • alecov  · 技术社区  · 14 年前

    在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 回复  |  直到 14 年前
        1
  •  24
  •   AnT stands with Russia    14 年前

    只要您只使用一维数组,上面的声明都是等效的。不过最后一个

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

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

    你也忘记了另一个新的声明

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

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

    void f(int i, int *const a)
    

    尽管有些人可能会说,对函数参数的常量限定是无用的。在无法对指针进行常量限定之前,当使用 [] 声明的语法。

    这个 * 以及 之间 [] 只有当它在 [] 在多维数组声明中。本质上,它和以前一样:参数声明中的数组大小总是只在 [] . 这个 * 当大小值未显式命名时,在VLA参数的原型声明中使用。例如,您可以声明

    void bar(int n, int m, int a[n][m]);
    

    编译器会知道 是VLA,因为大小不是常量。但是,如果您不喜欢在原型中命名参数,您将如何告诉编译器 是VLA吗?那是时候 * 帮助

    void bar(int, int, int a[*][*]);