如何将数组中的数组传递给 C 中的函数?

How can I pass an array inside an array to a function in C?

下面是显示我正在尝试做的事情的基本思想的代码:

#include <stdio.h>

void thisFunc(int arr){
  int firstValofBob = arr[0][0];
  int secondValofBob = arr[0][1];
}
 
int main()
{
  int bob[2] = {12, 13};
  int jim[2] = {20, 50};
  int arr[2] = {bob, jim};

  thisFunc(arr);
}

我想将一个本身包含多个数组(bob[] 和 jim[])的数组 (arr[]) 传递给一个函数,这样我就可以访问 bob[] 和 jim[ 中的值].

我知道这里的代码不起作用,我可能需要以某种方式使用指针。关于执行此操作的好方法的建议?

要存储 bob 和 jim 的值,您需要创建一个数组来存储整数数组,然后将其传递给函数。我的实现是:

#include <stdio.h>

void thisFunc(int** arr){
    int firstValofBob = arr[0][0];
    int secondValofBob = arr[0][1];
}

int main()
{
    int bob[2] = {12, 13};
    int jim[2] = {20, 50};
    int* arr[2] = {bob, jim};

    thisFunc(arr);
}

将多维数组传递给函数时,函数必须知道数组所有维度的大小,最外层维度除外。否则,如果不知道这些大小,那么编译器就不知道如何计算数组元素的内存地址。

例如,如果在函数thisFunc中写arr[3][5],那么编译器不需要知道外层数组的大小,但需要知道外层数组的大小内部数组。例如,如果它知道最内层数组的大小是 8,那么它就会知道您要访问数组的第 30th 个元素(3*8+5==29, 对应于基于0的索引中的索引29和基于1的索引中的索引30)。

在这种情况下,您似乎希望内部数组的大小为 2,因此您应该更改行

void thisFunc(int arr){

至:

void thisFunc(int arr[][2]){

另一个问题是行

int arr[2] = {bob, jim};

将不起作用,原因有二:

  1. 数组的类型应该是 int arr[2][2] 而不是 int arr[2] 如果你想让它包含两个 sub-arrays 每个两个元素。

  2. 你不能像这样复制一个数组。但是,您可以使用函数 memcpy.

    复制数组

这里是一个使用memcpy复制数组的例子:

int bob[2] = {12, 13};
int jim[2] = {20, 50};

int arr[2][2];

memcpy( arr[0], bob, sizeof arr[0] );
memcpy( arr[1], jim, sizeof arr[1] );

也可以直接初始化数组内容,比如这样:

int arr[2][2] = {
    { 12, 13 }, //bob
    { 20, 50 }  //jim
};

这样,您就不需要额外的数组 bobjim,也不需要使用 memcpy.

整个代码如下所示,假设内部数组的大小固定为 2 个元素:

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

void thisFunc( int arr[][2] )
{
    int firstValOfBob = arr[0][0];
    int secondValOfBob = arr[0][1];

    printf( "firstValOfBob: %d\n", firstValOfBob );
    printf( "secondValOfBob: %d\n", secondValOfBob );
}
 
int main()
{
    int arr[2][2] = {
        { 12, 13 }, //bob
        { 20, 50 }  //jim
    };

    thisFunc(arr);
}

这个程序有以下输出:

firstValOfBob: 12
secondValOfBob: 13