不能将参数1从'char [20] [20]'转换为'char**'?

Cha*_*429 -2 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]);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  1. error C2664: 'print_pointer' : cannot convert parameter 1 from 'char [20][20]' to 'char ** '

  2. error C2664: 'print_array' : cannot convert parameter 1 from 'char [20][20]' to 'char *[]'

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

为什么print_arrayprint_pointer功能不能同时工作print_array2,并print_array3能正常工作?

Mik*_*olf 7

是的,这就是一个数组可以像指针一样对待的想法.

"char [20] [20]"表示一个包含400个字符的数组,以20x20的方式排列.它不是一个包含20个指针的数组,每个指针包含20个字符的数组.因此将char [20] [20]转换为char**是不正确的(如果你明确地这样做,你会得到垃圾结果).

出于同样的原因(char [20] [20]不是指针数组),你不能转换为char*[20].

一个数组数组,这是你为print_array2和print_array3声明的数组.