gpt4 book ai didi

c - 使用 char* a[] 与 char a[][]

转载 作者:行者123 更新时间:2023-12-04 09:16:25 24 4
gpt4 key购买 nike

我知道用作函数参数时 char* a[] 等同于 char a[][]

用作函数参数时 char* a[] 等同于 char** aAlso known as Array to pointer conversion to some.

然而,当在 block 作用域中使用时,它们是不一样的,我很困惑什么时候我应该更喜欢一个而不是另一个,或者我是否应该跳过 char a[][ ],因为我通常倾向于在其他人的代码中看到 char* a[]

反对 char a[][] 的一个论点显然是您必须为其将包含的 C 字符串指定固定大小,但这是否会以任何方式影响性能?

我应该喜欢这个吗:

char* a[] = {"hello", "world"};

或者这个:

char a[][10] = {"hello", "world"};

最佳答案

理解函数参数看似奇怪的语法情况的关键是理解数组衰减。这完全是关于 C 中的一条规则,它说,无论何时将数组作为参数传递给函数,它都会衰减为指向该数组第一个元素的指针 (*)。

所以当你写类似的东西时

void func (int a[5]);

然后在编译时,数组被替换为指向第一个元素的指针,使得上面等于:

void func (int* a);

这个指针衰减规则递归地适用于多维数组。因此,如果将多维数组传递给函数:

void func (int a[5][3]);

它仍然衰减到指向第一个元素的指针。碰巧的是,二维数组实际上是数组的数组。因此,第一个元素是一个一维数组,在本例中大小为 3。您将获得指向该数组的数组指针,类型为int(*)[3]。使以上等同于

void func (int (*a)[3]);

这实际上就是为什么我们可以省略数组参数的最左边 维度,并且只省略该维度的原因。这样做后,我们创建了一个不完整类型的数组,您通常无法使用它:例如,您不能在函数体内编写类似 int array[]; 的代码。但在参数情况下,最左边的维度未指定并不重要,因为该维度无论如何都会“衰减”。


(*) 来源,C11 6.7.6.3/7:

A declaration of a parameter as ‘‘array of type’’ shall be adjusted to ‘‘qualified pointer to type’’, ...

关于c - 使用 char* a[] 与 char a[][],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36642964/

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