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

标签 c arrays pointers char

我知道用作函数参数时 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/

相关文章:

c - 指针类型转换为不同的数据类型

c - 未初始化指针的奇怪行为

javascript - 使用map方法创建多维数组: javascript

c++ - 数组之间的特征行叉积

c - 将函数舍入 1 - C

c++ - 是否有用于 C(C99 或其他)的标准化和常用库,因为 STL 用于 C++?

java - 在 setText Textview 中显示 String 数组元素时 Android 应用程序崩溃

C++ 使用指针创建数组

c - 验证电子邮件域的更好方法?

c - AVR 中断的变量在 main 中更新