-2

我的代码如下:

#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. 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 *[]'

我的问题是这四个功能之间的实际区别是什么?

为什么print_arrayprint_pointer功能不能工作,print_array2print_array3可以正常工作?

4

2 回答 2

7

是的,这就是可以将数组视为指针的想法崩溃的地方。

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

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

一个数组数组,也就是您为 print_array2 和 print_array3 声明的内容。

于 2013-06-14T06:02:14.073 回答
4

char**是指向指针的指针。

你想要一个指向数组的指针(提示:它不是char* [],因为这是一个与上面等效的指针数组)。

你需要char (*)[size](注意括号)。这将愉快地接受 type 的输入char[20][20]。为了完整起见char [][size]也是等价的(在这两种情况下,您都需要指定第二个数组的大小)。

于 2013-06-14T06:02:37.750 回答