C 使用“传递2D数组”*[……”是;及;[…]“;及;(*)[…”是什么;?

C 使用“传递2D数组”*[……”是;及;[…]“;及;(*)[…”是什么;?,c,arrays,C,Arrays,请参阅以下代码段: void foo(char str[][MAX_SIZE]) { strcpy(str[0], "Hi"); strcpy(str[1], "Hey"); } int main(void) { int V = 2; char str[V][MAX_SIZE]; foo(str); int i; for(i = 0; i < V; ++i) printf("%s\n", str[i]);

请参阅以下代码段:

void foo(char str[][MAX_SIZE])
{
    strcpy(str[0], "Hi");
    strcpy(str[1], "Hey");
}

int main(void) {
    int V = 2;
    char str[V][MAX_SIZE];

    foo(str);

    int i;
    for(i = 0; i < V; ++i)
        printf("%s\n", str[i]);

    return 0;
}
当foo的定义更改为:

void foo(char *str[MAX_SIZE]) { ... } <------------- Runtime error
我想我对将2D数组传递给方法的不同方法感到困惑

您能否帮助我理解foo()的每个定义的含义,它期望什么,以及它如何处理它接受的参数?

当您使用:

void foo(char *str[MAX_SIZE]) { ... }
void foo(char (*str)[MAX_SIZE]) { ... }
这意味着
str
char*
类型的指针数组。相当于

void foo(char** str) { ... }
void foo(char **str);
使用时:

void foo(char *str[MAX_SIZE]) { ... }
void foo(char (*str)[MAX_SIZE]) { ... }


这意味着
str
是指向大小为
MAX_size

的字符数组的指针,这两个字符具有相同的签名,并且是等效的函数声明(在参数调整后):

在这两种情况下,
str
都是指向
MAX\u SIZE
chars
数组的指针。这个,

void foo(char *str[MAX_SIZE]);
但是,是一个函数,其参数在调整后是指向
char
的指针,即等效于

void foo(char** str) { ... }
void foo(char **str);

使用
void foo(char*str[MAX_SIZE]){…}
代码是非法的。你的编译器应该告诉你这一点;请注意编译器消息。即使某些东西只说“警告”,除非你真的确定它是正确的(本例中不是这样)。请检查:@M.M:我在ideone.com上试验过这些东西,但它没有compalin,而是闪现了运行时错误。我在其他编译器上工作过,他们总是抱怨,如果像这样的错误发生在doneideone上,那真的不是很好,正是因为这个原因,然而,这是一个函数,它的参数是指向char的MAX_SIZE指针数组。应该提到的是,这里的参数也被调整为指针类型。@ouah Edited。谢谢你指出这个遗漏。我之前所做的是最具误导性的。当你使用
char*str[MAX\u SIZE]
作为函数参数时,它意味着
str
是指向
char*
的指针。