首页 > 解决方案 > 将 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]

这里发生了什么?

标签: carrayspointers

解决方案


数组自然衰减为指向其第一个元素的指针。所以在通话中foo(str)它真的和foo(&str[0]). 这是类型char *,所以没关系。

现在第二个电话,一个 to bar,是另一回事。当您使用时,&str您不会获得指向数组第一个元素的指针,而是获得指向数组本身的指针。正如编译器所指出的,这是 type char (*)[12],与 非常不同(并且不兼容)char **

最后,当您声明baz参数是 typechar *[12]时,也就是说您有一个数组或 12 个指向char 的指针,而不是您有一个指向 12 数组的指针char。此外,由于数组衰减到指针的事情,char *[12]实际上是一样char **


推荐阅读