繁体   English   中英

将多维数组作为 C 函数中的参数传递

[英]Passing multidimensional arrays as arguments in functions in C

我目前正在做 CS50 的习题集 3 中的第 15 个练习。但是,我一直在想办法将多维数组作为参数传递给函数。 例如,以下代码(打印出数组中的一些数字)可以编译并运行:

#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指针,但您传递的是一个指向 array指针 因此,错误。 这是因为当您将数组传递给函数时,它会被转换为指向其第一个元素的指针。

您可以更改函数原型和定义以接收指向数组的指针:

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]);
}

数组不是 C 中的类型! 在内部,它总是作为指针处理,因此,指向数组的指针作为参数传递,而不是数组本身。

如果您打算将数组作为参数(而不仅仅是指针)传递,您应该重新考虑您的设计!

如果您仍然需要这样做,请将数组包装成一个结构并传递该结构。

struct astruct
{
   int size;
   int array[3];
};

您需要在声明原型和定义函数时指定数组的大小。 现在它是不完整的类型。

试试这个 -

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 和/或 b,就不可能进行这种计算。

简单地告诉函数期待一个多维数组:

void func (int array[3][3], int size);

或者,如果您希望该功能完全灵活:

void func (int x, int y, int array[x][y]);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM