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)
我不知道为什么?任何人都可以解释它是如何工作的?非常感谢.
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数组传递给函数时,必须为类型定义指定所需的维度.
| 归档时间: |
|
| 查看次数: |
5488 次 |
| 最近记录: |