无法将参数1从 'char [20][20]'转换为 'char ** '?

标签 c arrays string pointers

我的代码如下:

#include <stdio.h>

void print_pointer(char **str);
void print_array(char *str[20]);
void print_array2(char str[20][20]);
void print_array3(char str[][20]);

int main(int argc, char *argv[])
{
    char str[20][20] = {"test1", "test2", "test3"};

    print_pointer(str);
    print_array(str);
    print_array2(str);
    print_array3(str);

    return 0;
}

void print_pointer(char **str)
{
    int i = 0;
    for(; i < 20; i++)
    {
        printf("%s", str[i]);
    }
}
void print_array(char *str[20])
{
    int i = 0;
    for(; i < 20; i++)
    {
        printf("%s", str[i]);
    }
}
void print_array2(char str[20][20])
{
    int i = 0;
    for(; i < 20; i++)
    {
        printf("%s", str[i]);
    }
}

void print_array3(char str[][20])
{
    int i = 0;
    for(; i < 20; i++)
    {
        printf("%s", str[i]);
    }
}

当我编译此代码时,遇到两个编译错误:

  1. 错误 C2664:“print_pointer”:无法将参数 1 从“char [20][20]”转换为“char **”

  2. 错误 C2664:“print_array”:无法将参数 1 从“char [20][20]”转换为“char *[]”

我的问题是这 4 个函数之间的实际区别是什么?

为什么print_arrayprint_pointer函数无法工作,而print_array2print_array3可以正常工作?

最佳答案

是的,这就是数组可以像指针一样对待的想法崩溃的地方。

“char[20][20]”表示 400 个字符的数组,以 20x20 的方式布局。它不是一个由 20 个指针组成的数组,每个指针指向 20 个字符的数组。因此,将 char[20][20] 转换为 char** 是不正确的(如果你明确这样做,你会得到垃圾结果)。

出于同样的原因(char[20][20] 不是指针数组),您无法转换为 char *[20]。

它是一个数组的数组,这是您为 print_array2 和 print_array3 声明的数组。

关于无法将参数1从 'char [20][20]'转换为 'char ** '?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17101925/

相关文章:

javascript - Node.js 中的数组,如何使用它

c# - 从字符串中读取坐标

Python - collections.OrderedDict() 未正确排序字典

在 printf 之后调用 Opendir 时 C 程序崩溃

c - 将寄存器转储到堆栈中以进行保守的堆栈扫描

c - 关于C中 "goto"的问题

c - C语言中这个符号**是什么意思

arrays - 如何矢量化此代码?

javascript - 将 for 循环变成静态数组?

c# - 使用 COM 将字符串从 C# 传递到 cpp