请参阅以下代码段:
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;
}
输出符合预期:
Hi
Hey
当foo的定义改为:
void foo(char *str[MAX_SIZE]) { ... } <------------- Runtime error
闪烁Runtime error
但是,将指针包装在括号中可以正常工作:
void foo(char (*str)[MAX_SIZE]) { ... } <-------------- Works fine
我想我对将2D数组传递给方法的不同方法感到困惑。
你能帮我理解foo()的每个定义是什么意思,它有什么期望以及它如何处理它接受的参数?
答案 0 :(得分:5)
这两个具有相同的签名,并且是等效的函数声明(在参数调整之后):
void foo(char str[][MAX_SIZE]);
void foo(char (*str)[MAX_SIZE]);
两者中,str
是指向MAX_SIZE
chars
数组的指针。这个,
void foo(char *str[MAX_SIZE]);
但是,是一个函数,其参数在调整后是指向char
的指针,即等效于
void foo(char **str);
答案 1 :(得分:1)
使用时:
void foo(char *str[MAX_SIZE]) { ... }
这意味着str
是一个类型为char*
的指针数组。它相当于
void foo(char** str) { ... }
使用时:
void foo(char (*str)[MAX_SIZE]) { ... }
或
void foo(char str[][MAX_SIZE]) { ... }
这意味着str
是指向大小为MAX_SIZE
的字符数组的指针。