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

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

Passing multidimensional arrays as function arguments in C

当我不知道数组的尺寸是多少时,可以在C中将多维数组作为单个参数传递给函数吗?

此外,我的多维数组可能包含字符串以外的类型。


将显式指针传递给第一个元素,并以数组维度作为单独的参数。例如,要处理任意大小的int二维数组:

1
2
3
4
5
6
void func_2d(int *p, size_t M, size_t N)
{
  size_t i, j;
  ...
  p[i*N+j] = ...;
}

这将被称为

1
2
3
4
5
6
...
int arr1[10][20];
int arr2[5][80];
...
func_2d(&arr1[0][0], 10, 20);
func_2d(&arr2[0][0], 5, 80);

相同原则适用于高维数组:

1
2
3
4
5
6
7
8
9
10
11
func_3d(int *p, size_t X, size_t Y, size_t Z)
{
  size_t i, j, k;
  ...
  p[i*Y*Z+j*Z+k] = ...;
  ...
}
...
arr2[10][20][30];
...
func_3d(&arr[0][0][0], 10, 20, 30);

您可以使用任何数据类型执行此操作。只需使其成为指针到指针即可:

1
2
3
4
5
6
typedef struct {
  int myint;
  char* mystring;
} data;

data** array;

但是不要忘记,您仍然必须malloc该变量,它确实变得有点复杂:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//initialize
int x,y,w,h;
w = 10; //width of array
h = 20; //height of array

//malloc the 'y' dimension
array = malloc(sizeof(data*) * h);

//iterate over 'y' dimension
for(y=0;y<h;y++){
  //malloc the 'x' dimension
  array[y] = malloc(sizeof(data) * w);

  //iterate over the 'x' dimension
  for(x=0;x<w;x++){
    //malloc the string in the data structure
    array[y][x].mystring = malloc(50); //50 chars

    //initialize
    array[y][x].myint = 6;
    strcpy(array[y][x].mystring,"w00t");
  }
}

取消分配结构的代码看起来很相似-不要忘记对已分配的所有对象调用free()! (此外,在健壮的应用程序中,您应该检查malloc()的返回。)

现在,假设您要将其传递给函数。您仍然可以使用双指针,因为您可能想对数据结构进行操作,而不是对数据结构的指针进行操作:

1
2
3
int whatsMyInt(data** arrayPtr, int x, int y){
  return arrayPtr[y][x].myint;
}

使用以下命令调用此函数:

1
2
printf("My int is %d.\
"
, whatsMyInt(array, 2, 4));

输出:

1
My int is 6.

您可以将函数声明为:

1
f(int size, int data[][size]) {...}

然后,编译器将为您执行所有指针运算。

请注意,尺寸大小必须出现在数组本身之前。

GNU C允许参数声明转发(以防万一,您确实需要在数组后传递维):

1
f(int size; int data[][size], int size) {...}

第一维,尽管您也可以作为参数传递,但对于C编译器来说是没有用的(即使对于sizeof运算符,当将其应用于作为参数传递的数组时,始终会将其视为指向第一个元素的指针)。


In C can I pass a multidimensional array to a function as a single argument when I don't know what the dimensions of the array are going to be?

没有

如果用"单个参数"表示只传递数组而不传递数组维数,那是不能的。至少不是真正的多维数组。

您可以将维与数组一起放入结构中,并声明您要传递"单个参数",但这实际上只是将多个值包装到单个容器中,并将该容器称为"一个参数"。

您可以通过传递尺寸本身和如下数组来传递已知类型和尺寸数量但未知尺寸的数组:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
void print2dIntArray( size_t x, size_t y, int array[ x ][ y ] )
{
    for ( size_t ii = 0, ii < x; ii++ )
    {
        char *sep ="";
        for ( size_t jj = 0; jj < y; jj++ )
        {
            printf("%s%d", sep, array[ ii ][ jj ] );
            sep =",";
        }
        printf("\
"
);
    }
}

您将这样调用该函数:

1
2
3
4
5
6
7
8
9
10
int a[ 4 ][ 5 ];
int b[ 255 ][ 16 ];

...

print2dIntArray( 4, 5, a );

....

printt2dIntArray( 255, 16, b );

类似地,例如struct pixel的3维数组:

1
2
3
4
void print3dPixelArray( size_t x, size_t y, size_t z, struct pixel pixelArray[ x ][ y ][ z ] )
{
    ...
}

或一维double数组:

1
2
3
4
void print1dDoubleArray( size_t x, double doubleArray[ x ] )
{
    ...
}

但...

但是,有可能将"指针数组传递给... <类型为X的数组的指针的数组"结构,只要基本类型< x2>具有一个哨兵值,可用于指示类型为X的最终的最低级别的单维数组的结尾。

例如,传递给main()char **argv值是指向char的指针数组的指针。 char *指针的初始数组以NULL标记值结尾,而char *指针的数组引用的每个char数组以'\\0'字符值结尾。

例如,如果您可以使用NAN作为标记值,??因为实际数据永远不会是NAN,则可以打印如下的double **

1
2
3
4
5
6
7
8
9
10
11
12
13
14
void printDoubles( double **notAnArray )
{
    while ( *notAnArray )
    {
        char *sep ="";
        for ( size_t ii = 0;  ( *notAnArray )[ ii ] != NAN; ii++ )
        {
            printf("%s%f", sep, ( *notAnArray )[ ii ] );
            sep =",";
        }

        notAnArray++;
    }
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int matmax(int **p, int dim) // p- matrix , dim- dimension of the matrix
{
    return p[0][0];  
}

int main()
{
   int *u[5]; // will be a 5x5 matrix

   for(int i = 0; i < 5; i++)
       u[i] = new int[5];

   u[0][0] = 1; // initialize u[0][0] - not mandatory

   // put data in u[][]

   printf("%d", matmax(u, 0)); //call to function
   getche(); // just to see the result
}


推荐阅读

    excel怎么用乘法函数

    excel怎么用乘法函数,乘法,函数,哪个,excel乘法函数怎么用?1、首先用鼠标选中要计算的单元格。2、然后选中单元格后点击左上方工具栏的fx公

    excel中乘法函数是什么?

    excel中乘法函数是什么?,乘法,函数,什么,打开表格,在C1单元格中输入“=A1*B1”乘法公式。以此类推到多个单元。1、A1*B1=C1的Excel乘法公式

    标准差excel用什么函数?

    标准差excel用什么函数?,函数,标准,什么,在数据单元格的下方输入l标准差公式函数公式“=STDEVPA(C2:C6)”。按下回车,求出标准公差值。详细

    公共CPU接口类型的详细描述

    公共CPU接口类型的详细描述,,我们知道CPU是电脑的大脑, CPU的处理速度直接决定电脑的性能, 那你知道CPU发展到现在, 都那些CPU接口类型吗.

    主板类型百科全书(基于芯片分类)

    主板类型百科全书(基于芯片分类),,电脑维修基础之主板型号熟悉,主板芯片型号区分,涵盖nVIDIA系列intel系列AMD系列主板型号,主板型号大全内容较

    excel常用函数都有哪些?

    excel常用函数都有哪些?,函数,哪些,常用,1、SUM函数:SUM函数的作用是求和。函数公式为=sum()例如:统计一个单元格区域:=sum(A1:A10)  统计多个

    C上的引导检查文件系统:文件的类型

    C上的引导检查文件系统:文件的类型,,故障现象:系统检查启动检查文件 每一次你启动一台计算机,都会是这样的。 在d上检查文件系统: 该文件

    电脑硬盘接|电脑硬盘接口类型怎么看

    电脑硬盘接|电脑硬盘接口类型怎么看,,电脑硬盘接口类型怎么看方法如下:1、在计算机上点击右键,选择设备管理器;2、点开磁盘驱动器就可以看到