在 C 中,为什么我能够将字符数组传递给以 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 *
类型,所以没问题。
现在第二个调用,对 bar
的调用,是另一回事了。当您使用 &str
时,您得到的不是指向数组第一个元素的指针,而是指向数组本身 的指针。正如编译器所指出的,这是 char (*)[12]
类型,它与 char **
非常不同(并且不兼容)。
最后,当您声明 baz
时,您说参数是 char *[12]
类型,也就是说您有一个数组或 12 个指针 到 char,而不是你有一个指向 12 个 char
数组的指针。此外,由于数组衰减为指针,char *[12]
实际上与 char **
相同。
关于c - 将 char 数组传递给采用 char 指针的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50055465/