在C中,为什么我能够将字符数组传递给char *作为参数的函数,但是我不能将数组的地址传递给带有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;
}
Run Code Online (Sandbox Code Playgroud)
在第二种情况下,我得到一个编译器警告:
warning: incompatible pointer types passing 'char (*)[12]' to
parameter of type 'char **' [-Wincompatible-pointer-types]
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?
数组自然地衰减指向它们的第一个元素.所以在电话会议中foo(str)它真的是一样的foo(&str[0]).这是类型,char *所以一切都好.
现在第二个电话,即一个bar,是另一回事.当你使用时,&str你没有获得指向数组第一个元素的指针,你得到一个指向数组本身的指针.正如编译器所指出的那样,这是一种类型char (*)[12],它与(并且与之不兼容)非常不同char **.
最后,当你声明baz你说参数是类型char *[12]时,就是你有一个数组或12个指向 char的指针,而不是你有一个指向数组12的指针char.而且,由于数组衰减到指针的东西,char *[12]实际上是一样的char **.