c - 将 char 数组传递给采用 char 指针的函数

标签 c arrays pointers

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

相关文章:

c - 如何让我的时钟应用程序运行

c++ - 调用父虚函数

困惑 : Dynamic Allocation of 2D array, C

c - 如何获得每个骨骼的绝对矩阵?

c - 设置 2 字节寄存器的函数

Java:按钮数组 - 获取源代码

javascript - 重命名对象的不定嵌套数组中的属性

java - 蛮力基础256乘法

c++ - 删除指向小部件 Qt C++ 的指针

c - 对上半部分和下半部分排序的数组进行排序