在 C 中将多维数组作为参数传递给函数
Passing multidimensional arrays as arguments in functions in C
我目前正在做 CS50 问题集 3 中的十五个练习。但是,我一直在弄清楚将多维数组作为参数传递给函数的语法。例如,以下代码(打印出数组中的一些数字)可以编译并运行:
#include <stdio.h>
void func(int array[], int size);
int main()
{
int size = 3;
int array[3] = {1,2,3};
func(array,size);
printf("Done\n");
}
void func(int array[], int size)
{
printf("%i %i %i\n", array[0],array[1], array[2]);
}
但事实并非如此:
#include <stdio.h>
void func(int array[][], int size);
int main()
{
int size = 3;
int array[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
func(array,size);
printf("Done");
}
void func(int array[][], int size)
{
printf("%i %i %i\n", array[0][0],array[1][1], array[2][2]);
}
这是clang提供的错误:
test.c:3:20: error: array has incomplete element type 'int []'
void func(int array[][], int size);
^
test.c:13:20: error: array has incomplete element type 'int []'
void func(int array[][], int size)
任何人都可以向我解释我的语法有什么问题吗?我不太明白clang给我的错误信息。
函数 func()
需要一个指向 int 的 指针,但您传递的是一个指向数组 的 指针。因此,错误。
这是因为当您将数组传递给函数时,它会转换为指向其第一个元素的指针。
您可以更改函数原型和定义以接收指向数组的指针:
void func(int (*array)[3], int size);
int main()
{
int size = 3;
int array[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
func(array,size);
printf("Done");
}
void func(int (*array)[3], int size) {
...
}
请注意,您的数组已初始化为 3x3 大小。所以数组大小至少要3x3。
C99 允许您传递维度。所以你也可以这样写:
void func(int x, int y, int a[x][y]);
int main()
{
int size = 3;
int array[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
func(3, 3, array);
printf("Done");
}
void func(int x, int y, int array[x][y])
{
printf("%i %i %i\n", array[0][0],array[1][1], array[2][2]);
}
声明原型和定义函数 时,您需要指定数组的大小。现在是不完整的类型。
试试这个 -
void func(int array[][3], int size)
像 int a[][]
这样的声明是不明智的,因为编译器必须知道所有维度(最外层除外)的大小才能计算访问时的内存地址。
即如果数组声明为
int array[][a][b];
访问的内存地址
array[2][1][3];
由
计算
base_address + (2*a*b + 1*b + 3) * sizeof int
如果不知道 a and/or b,这个计算是不可能的。
简单地告诉函数期待一个multi-dimensional数组:
void func (int array[3][3], int size);
或者如果您希望函数完全灵活:
void func (int x, int y, int array[x][y]);
数组不是 C 中的类型!在内部,它总是作为指针处理,因此,指向数组的指针作为参数传递,而不是数组本身。
如果您打算将数组作为参数(而不仅仅是指针)传递,您应该重新考虑您的设计!
如果您仍然需要这样做,请将数组包装成一个结构并传递该结构。
struct astruct
{
int size;
int array[3];
};
我目前正在做 CS50 问题集 3 中的十五个练习。但是,我一直在弄清楚将多维数组作为参数传递给函数的语法。例如,以下代码(打印出数组中的一些数字)可以编译并运行:
#include <stdio.h>
void func(int array[], int size);
int main()
{
int size = 3;
int array[3] = {1,2,3};
func(array,size);
printf("Done\n");
}
void func(int array[], int size)
{
printf("%i %i %i\n", array[0],array[1], array[2]);
}
但事实并非如此:
#include <stdio.h>
void func(int array[][], int size);
int main()
{
int size = 3;
int array[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
func(array,size);
printf("Done");
}
void func(int array[][], int size)
{
printf("%i %i %i\n", array[0][0],array[1][1], array[2][2]);
}
这是clang提供的错误:
test.c:3:20: error: array has incomplete element type 'int []'
void func(int array[][], int size);
^
test.c:13:20: error: array has incomplete element type 'int []'
void func(int array[][], int size)
任何人都可以向我解释我的语法有什么问题吗?我不太明白clang给我的错误信息。
函数 func()
需要一个指向 int 的 指针,但您传递的是一个指向数组 的 指针。因此,错误。
这是因为当您将数组传递给函数时,它会转换为指向其第一个元素的指针。
您可以更改函数原型和定义以接收指向数组的指针:
void func(int (*array)[3], int size);
int main()
{
int size = 3;
int array[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
func(array,size);
printf("Done");
}
void func(int (*array)[3], int size) {
...
}
请注意,您的数组已初始化为 3x3 大小。所以数组大小至少要3x3。
C99 允许您传递维度。所以你也可以这样写:
void func(int x, int y, int a[x][y]);
int main()
{
int size = 3;
int array[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
func(3, 3, array);
printf("Done");
}
void func(int x, int y, int array[x][y])
{
printf("%i %i %i\n", array[0][0],array[1][1], array[2][2]);
}
声明原型和定义函数 时,您需要指定数组的大小。现在是不完整的类型。
试试这个 -
void func(int array[][3], int size)
像 int a[][]
这样的声明是不明智的,因为编译器必须知道所有维度(最外层除外)的大小才能计算访问时的内存地址。
即如果数组声明为
int array[][a][b];
访问的内存地址
array[2][1][3];
由
计算base_address + (2*a*b + 1*b + 3) * sizeof int
如果不知道 a and/or b,这个计算是不可能的。
简单地告诉函数期待一个multi-dimensional数组:
void func (int array[3][3], int size);
或者如果您希望函数完全灵活:
void func (int x, int y, int array[x][y]);
数组不是 C 中的类型!在内部,它总是作为指针处理,因此,指向数组的指针作为参数传递,而不是数组本身。
如果您打算将数组作为参数(而不仅仅是指针)传递,您应该重新考虑您的设计!
如果您仍然需要这样做,请将数组包装成一个结构并传递该结构。
struct astruct
{
int size;
int array[3];
};