c - 将 char 数组传递给采用 char 指针的函数
问题描述
在 C 语言中,为什么我能够将字符数组传递给以 achar *
作为参数的函数,但我不能将数组的地址传递给以 a 为参数的函数char **
?
更新:有趣的是,将参数类型更改为char* qux[12]
根本不会更改编译器警告
例如:
#include <stdio.h>
void foo(char* qux) { puts(qux); }
void bar(char** qux) { puts(*qux); }
void baz(char* qux[12]) { puts(*qux); }
int main() {
char str[12] = "Hello there";
foo(str);
bar(&str); // Compiler warning
baz(&str); // Same compiler warning
return 0;
}
在第二种情况下,我收到编译器警告:
warning: incompatible pointer types passing 'char (*)[12]' to
parameter of type 'char **' [-Wincompatible-pointer-types]
这里发生了什么?
解决方案
数组自然衰减为指向其第一个元素的指针。所以在通话中foo(str)
它真的和foo(&str[0])
. 这是类型char *
,所以没关系。
现在第二个电话,一个 to bar
,是另一回事。当您使用时,&str
您不会获得指向数组第一个元素的指针,而是获得指向数组本身的指针。正如编译器所指出的,这是 type char (*)[12]
,与 非常不同(并且不兼容)char **
。
最后,当您声明baz
参数是 typechar *[12]
时,也就是说您有一个数组或 12 个指向char 的指针,而不是您有一个指向 12 数组的指针char
。此外,由于数组衰减到指针的事情,char *[12]
实际上是一样的char **
。
推荐阅读
- c++ - 分配 x 指向 y 指向的位置会导致任何内存泄漏吗?
- django - 视图中的 Django 内联表单集字段必需/非必需设置
- javascript - 如何缩短此 java 脚本代码长度并添加动画?
- android-jetpack-compose - 撰写 w Google 地图:协程中的 mapView.getMapAsync 与 mapView.awaitMap
- javascript - 如何使用 VS Code 中的 Tab 使自动完成功能正常工作?
- django - Django:将列、字段从子模型移动到父模型?
- java - 如何在 Java 中解析其元素均已命名的 JSON 列表?
- date - 在 MySQL Workbench 的 EER 中创建表时,如何在表编辑器中更改设置日期格式?
- excel - 如何在多个工作表上使用用户输入定义的范围
- pandas - 如何在多个列上进行聚合?