gpt4 book ai didi

c - 为什么函数的 VLA 数组参数使用星号 "[*]"而不是整数?

转载 作者:太空狗 更新时间:2023-10-29 16:21:44 28 4
gpt4 key购买 nike

在函数中使用变长数组作为参数时

int sum(int n, int a[n]);

很容易理解第一个参数(n)指定第二个参数(a)的长度。但是遇到了另一个用于 VLAs 作为参数的原型(prototype)

int sum(int n, int a[*]);

真的很难理解为什么[]里面用的是*而不是n

最佳答案

[*] 语法用于声明函数原型(prototype)。这里的关键细节是在函数原型(prototype)中你不需要命名你的参数,你只需要指定每个参数的类型。

在您的示例中,如果您保留第一个参数未命名,那么显然您将无法在第二个(数组)参数声明中使用n。然而,在许多情况下,您必须告诉编译器某些参数是 VLA。这时候 [*] 语法就派上用场了。

在您的情况下,如果省略参数名称,原型(prototype)可能看起来像

int sum(int, int [*]);

但是,请务必注意,在您的 特定示例中,此语法是合法的,但并非完全必要。就像非 VLA 数组一样,int [n] 参数仍然等同于 int * 参数(即使对于非常量 n) .这意味着您可以简单地将函数原型(prototype)化为

int sum(int, int []);

或作为

int sum(int, int *);

并且原型(prototype)仍将发挥其作用,即它将正确匹配函数定义。换句话说,声明为一维数组的参数的 VLA 属性完全无关紧要,并且此类 VLA 数组并不真正需要 [*] 功能。

[*] 在类型的“变量数组”没有丢失的情况下变得很重要,就像 2D VLA(或指向 VLA 的指针)一样。例如。定义为

的函数
int sum2d(int n, int m, int a[n][m])
{
...
}

可能是以下任何一种原型(prototype)

int sum2d(int, int, int a[*][*]);
int sum2d(int n, int, int a[n][*]);
int sum2d(int, int m, int a[*][m]);
int sum2d(int n, int m, int a[n][m]);

上述所有原型(prototype)都正确匹配函数定义。

当然,如果您习惯于在函数原型(prototype)中始终命名所有参数,那么您将永远不需要这种 [*] 语法,因为您将能够在函数原型(prototype)中使用最后一个原型(prototype)上面的列表。

附言同样,与参数声明中所有数组的情况一样,第一个 [] 总是无关紧要的,并且总是衰减为指针,这意味着以下也是上述 的有效等效原型(prototype)声明sum2d

    int sum2d(int, int, int a[][*]);
int sum2d(int, int, int (*a)[*]);
int sum2d(int n, int m, int (*a)[m]);

真正重要的是第二个[],必须声明为“可变长度”。

关于c - 为什么函数的 VLA 数组参数使用星号 "[*]"而不是整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17371645/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com