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*
的指针。