C – 传递一个2d数组作为函数参数?

人们可以很容易地定义一个接受像这样的1d array参数的函数:

 int MyFunction( const float arr[] ) { // do something here, then return... return 1 } 

虽然一个定义如: int MyFunction( const float* arr )也可以。

如何定义一个接受2d array参数的函数呢?

我知道这是有效的: int MyFunction( const float** arr ) – 但是,有可能使用[]的第一个变体?

在C99中,您可以在传递之前提供数组的维度:

  void array_function(int m, int n, float a[m][n]) { for (int i = 0; i < m; i++) for (int j = 0; j < n; j++) a[i][j] = 0.0; } void another_function(void) { float a1[10][20]; float a2[15][15]; array_function(10, 20, a1); array_function(15, 15, a2); } 

尝试这样的事情:

 int MyFunction(size_t ncols, const float arr[][ncols]) { // ... } 

当我们将二维数组作为parameter passing给函数时,可以指定最左边的维度。这里的关键点是当调用的函数中所做的任何更改反映在调用函数中时,因为当我们传递二维数组作为参数意味着实际上函数接收指向一维数组的指针。 和大小是列数。 例子

1 – int funct(int (*a) [4]);

这里是一个指向整型数组的指针。 我们也可以简单地通过这样的

2- void funct(int a[][4]);

正如我刚才所说的,最左边的总是可选的。 在第一个例子中,a的大小是4,因为它通常只是指针。 而* a的大小将是16,因为我们有4列,每列有4个字节,所以4 * 4 = 16字节。

但最好的方法是总是使用dynamic内存分配。

我希望你清楚

骇客的方法是传递第一个元素并手动进行数组计算。

这个较长的示例使用macros来半自动地提取数组维以在调用中使用。

 struct font { int disp, trig; }; struct font font3[3][3]; #define dim(x) (sizeof(x)/sizeof*(x)) #define font_and_dims(x) (struct font *)x, dim(x), dim(*x) int print(char *s, struct font *font, int dimy, int dimx) { ... } main(){ ... print(*av, font_and_dims(font3)); ... } 

被调用函数难以访问数组。

 print(){ ... font[row*dimx+col] ... } 

不要害怕向下滚动:好东西在底部! 顶部的这种丑陋,迂腐的function提供了最终的字符集可移植性; 但我承认,这一个眼神。

 #include <stdio.h> #include <string.h> int ao(int c) { switch(c) { case '0':return 0; case '1':return 1; case '2':return 2; case '3':return 3; case '4':return 4; case '5':return 5; case '6':return 6; case '7':return 7; case '8':return 8; case '9':return 9; case 'A':case 'a':return 10; case 'B':case 'b':return 11; case 'C':case 'c':return 12; case 'D':case 'd':return 13; case 'E':case 'e':return 14; case 'F':case 'f':return 15; default:return -1; } } enum { A = 1 << 0, B = 1 << 1, C = 1 << 2, D = 1 << 3, E = 1 << 4, F = 1 << 5, G = 1 << 6, H = 1 << 7 }; int seg[] = { /*0*/ A|B|C|D|E|F, /*1*/ B|C, /*2*/ A|B| D|E| G, /*3*/ A|B|C|D| G, /*4*/ B|C| F|G, /*5*/ A| C|D| F|G, /*6*/ A| C|D|E|F|G, /*7*/ A|B|C, /*8*/ A|B|C|D|E|F|G, /*9*/ A|B|C| F|G, /*A*/ A|B|C|D|E| G, /*A|B|C| E|F|G,*/ /*b*/ C|D|E|F|G, /*C*/ D|E| G, /*A| D|E|F,*/ /*d*/ B|C|D|E| G, /*E*/ A|B| D|E|F|G, /*A| D|E|F|G,*/ /*F*/ A| E|F|G, }; struct font { int disp, trig; }; /* _ |_| |_| */ struct font font3[3][3] = { { { 0,0}, {'_',A}, { 0,0} }, { {'|',F}, {'_',G}, {'|',B} }, { {'|',E}, {'_',D}, {'|',C} }, }; /* ___ | | |___| | | |___| */ struct font font5[5][5] = { { { 0,0}, {'_',A}, {'_',A}, {'_',A}, { 0,0} }, { {'|',F}, { 0,0}, { 0,0}, { 0,0}, {'|',B} }, { {'|',F}, {'_',G}, {'_',G}, {'_',G}, {'|',B} }, { {'|',E}, { 0,0}, { 0,0}, { 0,0}, {'|',C} }, { {'|',E}, {'_',D}, {'_',D}, {'_',D}, {'|',C} } }; /* ____ | | | | | | |____| | | | | | | |____| */ struct font font9[9][7] = { { { 0,0}, {'_',A}, {'_',A}, {'_',A}, {'_',A}, { 0,0}, {0,0} }, { {'|',F}, { 0,0}, { 0,0}, { 0,0}, { 0,0}, {'|',B}, {0,0} }, { {'|',F}, { 0,0}, { 0,0}, { 0,0}, { 0,0}, {'|',B}, {0,0} }, { {'|',F}, { 0,0}, { 0,0}, { 0,0}, { 0,0}, {'|',B}, {0,0} }, { {'|',F}, {'_',G}, {'_',G}, {'_',G}, {'_',G}, {'|',B}, {0,0} }, { {'|',E}, { 0,0}, { 0,0}, { 0,0}, { 0,0}, {'|',C}, {0,0} }, { {'|',E}, { 0,0}, { 0,0}, { 0,0}, { 0,0}, {'|',C}, {0,0} }, { {'|',E}, { 0,0}, { 0,0}, { 0,0}, { 0,0}, {'|',C}, {0,0} }, { {'|',E}, {'_',D}, {'_',D}, {'_',D}, {'_',D}, {'|',C}, {0,0} }, }; #define dim(x) (sizeof(x)/sizeof*(x)) #define font_and_dims(x) (struct font *)x, dim(x), dim(*x) int print(char *s, struct font *font, int dimy, int dimx) { int row, col; char *sp; for (row = 0; row < dimy; row++) { for (sp = s; *sp; sp++) { for (col = 0; col < dimx; col++) { putchar( seg[ao(*sp)] & font[row*dimx+col].trig ? font[row*dimx+col].disp : ' '); } } putchar('\n'); } } int main(int ac, char **av) { enum { F1, F2, F3 } fz = F1; for (++av,--ac;ac;ac--,av++) { if (av[0][0] == '-') { switch (av[0][1]) { case '1': fz=F1; continue; case '2': fz=F2; continue; case '3': fz=F3; continue; default: fprintf(stderr, "Unrecognized Option!\n"); } } if (strspn(*av, "0123456789abcdefABCDEF") != strlen(*av)) fprintf(stderr, "Hex only!\n"); else switch(fz) { case F1: print(*av, font_and_dims(font3)); break; case F2: print(*av, font_and_dims(font5)); break; case F3: print(*av, font_and_dims(font9)); break; default: fprintf(stderr, "Invalid Font!\n"); } } return 0; } 

在C89中,你可以使用

 typedef float OneRow[2]; void func(OneRow *arr) { printf("%f",arr[1][0]); } ... OneRow arr[] = {{1,2},{3,4},{5,6}}; func(arr); ... 

一个select是你可以有一个像这样的struct

 typedef struct Array2d_t { void** pArray; size_t nRows; size_t nCols; } Array2d; 

然后在函数中可以传递Array2D的指针:

int YourFunction( Array2D* const pArray2D ) {}

GLib GArray也是这样做的。