使用“* []”和“[] []”和“(*)[]”传递2D数组?

时间:2015-10-26 21:29:52

标签: 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]);

    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()的每个定义是什么意思,它有什么期望以及它如何处理它接受的参数?

2 个答案:

答案 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的字符数组的指针。