When two-dimensional array and multidimensional array as function parameters in C language
0
一维数组作为函数参数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #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); } |
它编译并正确运行。
但当二维数组作为函数参数时:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
它不能正确编译。我必须这样修改代码:
2我不知道为什么?有人能解释它的工作原理吗?多谢。
C中的数组(一维和多维)驻留在连续的内存块中。这意味着,当您定义
1 | | a[0] | a[1] | a[2] | |
对于二维数组
因此,当索引到二维数组
1 | *(a + i*3 + j) |
这可以理解为"跳过i行并在该行中取单元格j"。为此,编译器必须知道行的长度(第二个维度)。这意味着第二个维度是类型定义的一部分!
因此,如果要将二维数组传递给函数,则必须为类型定义指定所需的维度。
最近的(例如,c211和c99)c标准启用了可变长度数组,因此以下函数可以工作
1 2 3 4 5 6 7 8 9 | int sum (int n, int t[n][n]) { int s = 0; for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) s += t[i][j]; return s; } |
这是在没有警告的情况下用
至于
C中的数组非常"弱",通常在运行时仅由指向第一个元素的指针表示。当您声明类似于
如果您可以使用
您可以编写一个像
如果没有数组的第二个维度,编译器就不知道如何对其进行索引。这是因为编译器用一个指针做了一些算术运算,以找出在内存中查找值的位置。
以下是一个很好的解释:http://www.eskimo.com/~scs/cclass/int/sx9a.html