当二维数组和多维数组作为C语言的函数参数时

ims*_*rch 1 c multidimensional-array

可能重复:
如何在C++中使用数组?

一维数组作为函数参数:

#include <stdio.h>
#include <string.h>

int func(int a[], int n)
{
    int i;
    for(i = 0; i < n; i++)
        printf("%d ", a[i][j]);
}

int main(void)
{   
    int a[2] = {1,2};
    func(a, 2);
}
Run Code Online (Sandbox Code Playgroud)

它编译并正确运行.

但是当二维数组作为函数参数时:

#include <stdio.h>
#include <string.h>

int func(int a[][], int n)
{
    int i, j;
    for(i = 0; i < n; i++)
        for(j = 0 ; j < n; j++)
            printf("%d ", a[i][j]);
        printf("\n");
}

int main(void)
{   
    int a[2][2] = {{1,2}, {3,4}};
    func(a, 2);
}
Run Code Online (Sandbox Code Playgroud)

它无法正确编译.我必须修改这样的代码:

#include <stdio.h>
#include <string.h>

int func(int a[][2], int n)
{
    int i, j;
    for(i = 0; i < n; i++)
        for(j = 0 ; j < n; j++)
            printf("%d ", a[i][j]);
        printf("\n");
}

int main(void)
{   
    int a[2][2] = {{1,2}, {3,4}};
    func(a, 2);
}
Run Code Online (Sandbox Code Playgroud)

我不知道为什么?任何人都可以解释它是如何工作的?非常感谢.

Sto*_*ica 7

c中的数组(包括一维和多维)驻留在连续的内存块中.这意味着当你定义时char a[3],数组就像这样布局在内存中(原谅我可怕的ascii艺术技巧):

| a[0] | a[1] | a[2] |
Run Code Online (Sandbox Code Playgroud)

对于二维数组char a[2][3],布局如下:

| a[0][0] | a[0][1] | a[0][2] | a[1][0] | a[1][1] | a[1][2] |  
                              ^
                              +--- first row ends here
Run Code Online (Sandbox Code Playgroud)

因此,当您索引到二维数组时a[i][j],编译器会生成与此等效的代码:

*(a + i*3 + j)
Run Code Online (Sandbox Code Playgroud)

其中可以读作"跳过i行并在该行中获取单元格j".为此,编译器必须知道行的长度(这是第二个维度).这意味着第二个维度是类型定义的一部分!

因此,当您希望将2d数组传递给函数时,必须为类型定义指定所需的维度.