- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我知道用作函数参数时
char* a[]
等同于
char a[][]
。
用作函数参数时 char* a[]
等同于 char** a
。 Also 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/
我是一名优秀的程序员,十分优秀!