C语言如何在子函数中对主函数中的二维数组值进行修改?二维数组已经在主函数中用动态数组分配了空间.

学习 时间:2026-04-06 19:16:22 阅读:8889
C语言如何在子函数中对主函数中的二维数组值进行修改?二维数组已经在主函数中用动态数组分配了空间.

最佳回答

洁净的唇彩

结实的鸭子

2026-04-06 19:16:22

用数组时,必须要知道二维数组的后一个维度,否则无法正确修改,比如:void modify(int a[][10]){a[1][2] = 12;a[2][5] = 25;}void main(){int a[5][10];a[1][2] = 0;a[2][5] = 0;modify(a);printf("a(1,2)=%d,a(2,5)=%d\n",12,25);} 用指针方式实现时要注意二维数组的建立过程。比如以上的int a[5][10],用指针实现相同功能的代码如下:void modify(int **a){a[1][2] = 12;a[2][5] = 25;}void main(){int **a;a = (int **) malloc( sizeof(int *) *5);for(int i=0 ; i 再问: 这样很死板,我想写个通用点的,因为我的二维数组维数在变化,尤其是最后一个维度在变化。如果在子函数的形参中固定了最后一个维度的话,就没有任何灵活性了。我给子函数传了数组的首地址,然后在子函数中用一维数组的形式赋值(我主要是想赋值),但是在主函数中调用数组时值不对,也就是说值并没有被修改,不是说二维数组在内存中也是按列排列的么?难道在子函数中这个列就不管用了? 再答:   如果用二维数组,以上用指针实现的过程中把维数设成变量就可以了,但是这样初始化时稍微有点儿麻烦。    还有一种做法,就是使用一维数组来存储二维数据的值,比如把int a[5][10]转换为int a[50],在读取时进行坐标转换,效果也是一样的,如: int getelement(int *a, int i, int j) { return a[i*10+j]; } void setelement(int *a, int i, int j, int value) { a[i*10+j] = value; } void modify(int *a) { setelement(a, 1, 2, 12); setelement(a, 2, 5, 25); } void main() { int *a; a = (int *) malloc( 5*10*sizeof(int*)); modify(a); printf("a(1,2)=%d, a(2,5)=%d\n",getelement(a,1,2),getelement(a,2,5)); }再问:  如果用二维数组,以上用指针实现的过程中把维数设成变量就可以了,但是这样初始化时稍微有点儿麻烦 ---------------------- 这点没怎么看明白,能否请您把这个说详细点?有例子更好了。谢谢! 再答: 第一、就是在前面用二维数组实现的例子中,把5和10改成二维数组的行数和列数就可以了,如: int m, n; int **a; m = 5, n = 10; a = (int **) malloc( m*sizeof(int *)); for(int i=0 ; i

最新回答共有2条回答

  • 老实的小兔子
    回复
    2026-04-06 19:16:22

    用数组时,必须要知道二维数组的后一个维度,否则无法正确修改,比如:void modify(int a[][10]){a[1][2] = 12;a[2][5] = 25;}void main(){int a[5][10];a[1][2] = 0;a[2][5] = 0;modify(a);printf("a(1,2)=%d,a(2,5)=%d\n",12,25);} 用指针方式实现时要注意二维数组的建立过程。比如以上的int a[5][10],用指针实现相同功能的代码如下:void modify(int **a){a[1][2] = 12;a[2][5] = 25;}void main(){int **a;a = (int **) malloc( sizeof(int *) *5);for(int i=0 ; i 再问: 这样很死板,我想写个通用点的,因为我的二维数组维数在变化,尤其是最后一个维度在变化。如果在子函数的形参中固定了最后一个维度的话,就没有任何灵活性了。我给子函数传了数组的首地址,然后在子函数中用一维数组的形式赋值(我主要是想赋值),但是在主函数中调用数组时值不对,也就是说值并没有被修改,不是说二维数组在内存中也是按列排列的么?难道在子函数中这个列就不管用了? 再答:   如果用二维数组,以上用指针实现的过程中把维数设成变量就可以了,但是这样初始化时稍微有点儿麻烦。    还有一种做法,就是使用一维数组来存储二维数据的值,比如把int a[5][10]转换为int a[50],在读取时进行坐标转换,效果也是一样的,如: int getelement(int *a, int i, int j) { return a[i*10+j]; } void setelement(int *a, int i, int j, int value) { a[i*10+j] = value; } void modify(int *a) { setelement(a, 1, 2, 12); setelement(a, 2, 5, 25); } void main() { int *a; a = (int *) malloc( 5*10*sizeof(int*)); modify(a); printf("a(1,2)=%d, a(2,5)=%d\n",getelement(a,1,2),getelement(a,2,5)); }再问:  如果用二维数组,以上用指针实现的过程中把维数设成变量就可以了,但是这样初始化时稍微有点儿麻烦 ---------------------- 这点没怎么看明白,能否请您把这个说详细点?有例子更好了。谢谢! 再答: 第一、就是在前面用二维数组实现的例子中,把5和10改成二维数组的行数和列数就可以了,如: int m, n; int **a; m = 5, n = 10; a = (int **) malloc( m*sizeof(int *)); for(int i=0 ; i

上一篇 大正14年是公元多少年

下一篇 怎样快速把pdf格式的文章转换成word格式?