将char数组传递给带有char指针的函数

Bru*_*Ely 3 c arrays pointers

在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)

这里发生了什么?

Som*_*ude 5

数组自然地衰减指向它们的第一个元素.所以在电话会议中foo(str)它真的是一样的foo(&str[0]).这是类型,char *所以一切都好.

现在第二个电话,即一个bar,是另一回事.当你使用时,&str你没有获得指向数组第一个元素的指针,你得到一个指向数组本身的指针.正如编译器所指出的那样,这是一种类型char (*)[12],它与(并且与之不兼容)非常不同char **.

最后,当你声明baz你说参数是类型char *[12]时,就是你有一个数组或12个指向 char的指针,而不是你有一个指向数组12的指针char.而且,由于数组衰减到指针的东西,char *[12]实际上是一样char **.

  • @BrunoEly 我刚刚告诉过你,它也是错误消息的一部分:“......将'char(*)[12]'传递给......”。使用例如 `char (*qux)[12]` 并且你有一个指向 12 个 `char` 数组的指针。然而,通常不需要像这样传递指向数组的指针,传递一个简单的 `char *` 指向第一个元素是常见的用例。 (2认同)