如何在C中的函数中传递二维数组(矩阵)?

如何在C中的函数中传递二维数组(矩阵)?

我需要这样做来保持矩阵上的操作。这是否意味着它需要以参考的方式通过?

这样就够了吗?

void operate_on_matrix(char matrix[][20]);


慕盖茨4494581
浏览 905回答 3
3回答

饮歌长啸

C实际上没有多维数组,但是有几种方法来模拟它们.将这些数组传递给函数的方式取决于用于模拟多维的方式:1)使用数组。这只能在您的数组边界在编译时完全确定或编译器支持的情况下才能使用。VLA‘s:#define&nbsp;ROWS&nbsp;4#define&nbsp;COLS&nbsp;5void&nbsp;func(int&nbsp;array[ROWS][COLS]){ &nbsp;&nbsp;int&nbsp;i,&nbsp;j; &nbsp;&nbsp;for&nbsp;(i=0;&nbsp;i<ROWS;&nbsp;i++) &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(j=0;&nbsp;j<COLS;&nbsp;j++) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array[i][j]&nbsp;=&nbsp;i*j; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;}}void&nbsp;func_vla(int&nbsp;rows,&nbsp;int&nbsp;cols,&nbsp;int&nbsp;array[rows][cols]){ &nbsp;&nbsp;int&nbsp;i,&nbsp;j; &nbsp;&nbsp;for&nbsp;(i=0;&nbsp;i<rows;&nbsp;i++) &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(j=0;&nbsp;j<cols;&nbsp;j++) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array[i][j]&nbsp;=&nbsp;i*j; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;}}int&nbsp;main(){ &nbsp;&nbsp;int&nbsp;x[ROWS][COLS]; &nbsp;&nbsp;func(x); &nbsp;&nbsp;func_vla(ROWS,&nbsp;COLS,&nbsp;x);}2)使用指向(动态分配)数组的指针数组。这主要是在运行时才知道数组边界时使用的。void&nbsp;func(int**&nbsp;array,&nbsp;int&nbsp;rows,&nbsp;int&nbsp;cols){ &nbsp;&nbsp;int&nbsp;i,&nbsp;j; &nbsp;&nbsp;for&nbsp;(i=0;&nbsp;i<rows;&nbsp;i++) &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(j=0;&nbsp;j<cols;&nbsp;j++) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array[i][j]&nbsp;=&nbsp;i*j; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;}}int&nbsp;main(){ &nbsp;&nbsp;int&nbsp;rows,&nbsp;cols,&nbsp;i; &nbsp;&nbsp;int&nbsp;**x; &nbsp;&nbsp;/*&nbsp;obtain&nbsp;values&nbsp;for&nbsp;rows&nbsp;&&nbsp;cols&nbsp;*/ &nbsp;&nbsp;/*&nbsp;allocate&nbsp;the&nbsp;array&nbsp;*/ &nbsp;&nbsp;x&nbsp;=&nbsp;malloc(rows&nbsp;*&nbsp;sizeof&nbsp;*x); &nbsp;&nbsp;for&nbsp;(i=0;&nbsp;i<rows;&nbsp;i++) &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;x[i]&nbsp;=&nbsp;malloc(cols&nbsp;*&nbsp;sizeof&nbsp;*x[i]); &nbsp;&nbsp;} &nbsp;&nbsp;/*&nbsp;use&nbsp;the&nbsp;array&nbsp;*/ &nbsp;&nbsp;func(x,&nbsp;rows,&nbsp;cols); &nbsp;&nbsp;/*&nbsp;deallocate&nbsp;the&nbsp;array&nbsp;*/ &nbsp;&nbsp;for&nbsp;(i=0;&nbsp;i<rows;&nbsp;i++) &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;free(x[i]); &nbsp;&nbsp;} &nbsp;&nbsp;free(x);}(3)使用一维数组,并固定索引。这可以用于静态分配(固定大小)和动态分配的数组:void&nbsp;func(int*&nbsp;array,&nbsp;int&nbsp;rows,&nbsp;int&nbsp;cols){ &nbsp;&nbsp;int&nbsp;i,&nbsp;j; &nbsp;&nbsp;for&nbsp;(i=0;&nbsp;i<rows;&nbsp;i++) &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(j=0;&nbsp;j<cols;&nbsp;j++) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array[i*cols+j]=i*j; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;}}int&nbsp;main(){ &nbsp;&nbsp;int&nbsp;rows,&nbsp;cols; &nbsp;&nbsp;int&nbsp;*x; &nbsp;&nbsp;/*&nbsp;obtain&nbsp;values&nbsp;for&nbsp;rows&nbsp;&&nbsp;cols&nbsp;*/ &nbsp;&nbsp;/*&nbsp;allocate&nbsp;the&nbsp;array&nbsp;*/ &nbsp;&nbsp;x&nbsp;=&nbsp;malloc(rows&nbsp;*&nbsp;cols&nbsp;*&nbsp;sizeof&nbsp;*x); &nbsp;&nbsp;/*&nbsp;use&nbsp;the&nbsp;array&nbsp;*/ &nbsp;&nbsp;func(x,&nbsp;rows,&nbsp;cols); &nbsp;&nbsp;/*&nbsp;deallocate&nbsp;the&nbsp;array&nbsp;*/ &nbsp;&nbsp;free(x);}4)使用动态分配的VLA。与选项2相比,它的一个优点是只有一个内存分配;另一个优点是不需要指针数组,因此需要更少的内存。#include&nbsp;<stdio.h>#include&nbsp;<stdlib.h>#include&nbsp;<time.h>extern&nbsp;void&nbsp;func_vla(int&nbsp;rows,&nbsp;int&nbsp;cols,&nbsp;int&nbsp;array[rows][cols]);extern&nbsp;void&nbsp;get_rows_cols(int&nbsp;*rows,&nbsp;int&nbsp;*cols);extern&nbsp;void&nbsp;dump_array(const&nbsp;char&nbsp;*tag,&nbsp;int&nbsp;rows,&nbsp;int&nbsp;cols,&nbsp;int&nbsp;array[rows][cols]);void&nbsp;func_vla(int&nbsp;rows,&nbsp;int&nbsp;cols,&nbsp;int&nbsp;array[rows][cols]){ &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;rows;&nbsp;i++) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;j&nbsp;=&nbsp;0;&nbsp;j&nbsp;<&nbsp;cols;&nbsp;j++) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array[i][j]&nbsp;=&nbsp;(i&nbsp;+&nbsp;1)&nbsp;*&nbsp;(j&nbsp;+&nbsp;1); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;}}int&nbsp;main(void){ &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;rows,&nbsp;cols; &nbsp;&nbsp;&nbsp;&nbsp;get_rows_cols(&rows,&nbsp;&cols); &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;(*array)[cols]&nbsp;=&nbsp;malloc(rows&nbsp;*&nbsp;cols&nbsp;*&nbsp;sizeof(array[0][0])); &nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;error&nbsp;check&nbsp;omitted&nbsp;*/ &nbsp;&nbsp;&nbsp;&nbsp;func_vla(rows,&nbsp;cols,&nbsp;array); &nbsp;&nbsp;&nbsp;&nbsp;dump_array("After&nbsp;initialization",&nbsp;rows,&nbsp;cols,&nbsp;array); &nbsp;&nbsp;&nbsp;&nbsp;free(array); &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;}void&nbsp;dump_array(const&nbsp;char&nbsp;*tag,&nbsp;int&nbsp;rows,&nbsp;int&nbsp;cols,&nbsp;int&nbsp;array[rows][cols]){ &nbsp;&nbsp;&nbsp;&nbsp;printf("%s&nbsp;(%dx%d):\n",&nbsp;tag,&nbsp;rows,&nbsp;cols); &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;rows;&nbsp;i++) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;j&nbsp;=&nbsp;0;&nbsp;j&nbsp;<&nbsp;cols;&nbsp;j++) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%4d",&nbsp;array[i][j]); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;putchar('\n'); &nbsp;&nbsp;&nbsp;&nbsp;}}void&nbsp;get_rows_cols(int&nbsp;*rows,&nbsp;int&nbsp;*cols){ &nbsp;&nbsp;&nbsp;&nbsp;srand(time(0));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Only&nbsp;acceptable&nbsp;because&nbsp;it&nbsp;is&nbsp;called&nbsp;once &nbsp;&nbsp;&nbsp;&nbsp;*rows&nbsp;=&nbsp;5&nbsp;+&nbsp;rand()&nbsp;%&nbsp;10; &nbsp;&nbsp;&nbsp;&nbsp;*cols&nbsp;=&nbsp;3&nbsp;+&nbsp;rand()&nbsp;%&nbsp;12;}(见srand()-为什么只叫一次?.)

慕容708150

我不知道你所说的“数据不会丢失”是什么意思。下面是如何将普通的2D数组传递给函数:void&nbsp;myfunc(int&nbsp;arr[M][N])&nbsp;{&nbsp;//&nbsp;M&nbsp;is&nbsp;optional,&nbsp;but&nbsp;N&nbsp;is&nbsp;required &nbsp;&nbsp;..}int&nbsp;main()&nbsp;{ &nbsp;&nbsp;int&nbsp;somearr[M][N]; &nbsp;&nbsp;... &nbsp;&nbsp;myfunc(somearr); &nbsp;&nbsp;...}

LEATH

最简单的方法:传递可变长度的二维阵列C&C+最简洁的技术是:像一维数组一样传递2D数组,然后在函数内部作为2D使用。void&nbsp;func(int&nbsp;row,&nbsp;int&nbsp;col,&nbsp;int*&nbsp;matrix){ &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;i,&nbsp;j; &nbsp;&nbsp;&nbsp;&nbsp;for(i=0;&nbsp;i<row;&nbsp;i++){ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(j=0;&nbsp;j<col;&nbsp;j++){ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%d&nbsp;",&nbsp;*(matrix&nbsp;+&nbsp;i*col&nbsp;+&nbsp;j));&nbsp;//&nbsp;or&nbsp;better:&nbsp;printf("%d&nbsp;",&nbsp;*matrix++); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("\n"); &nbsp;&nbsp;&nbsp;&nbsp;}}int&nbsp;main(){ &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;matrix[2][3]&nbsp;=&nbsp;{&nbsp;{1,&nbsp;2,&nbsp;3},&nbsp;{7,&nbsp;8,&nbsp;9}&nbsp;}; &nbsp;&nbsp;&nbsp;&nbsp;func(2,&nbsp;3,&nbsp;matrix[0]); &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;}
打开App,查看更多内容
随时随地看视频慕课网APP