我怎样在函数参数传递时混用静态和动态多维数组?

本文探讨了如何在函数参数中混用静态和动态多维数组,并提供了多个示例来展示不同的数组和指针如何传递给函数。通过这些示例,读者可以更好地理解C语言中的数组和指针。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我怎样在函数参数传递时混用静态和动态多维数组?
没有完美的方法。假设有如下声明
int  array[NROWS][NCOLUMNS];
int  **array1;
/*  不齐的 */
int  **array2;
/*  连续的 */
int  *array3;
/*  "变平的"  */
int  (*array4)[NCOLUMNS];
指针的初始值如问题的程序片段, 函数声明如下
void  f1a(int  a[][NCOLUMNS],  int  nrows,  int  ncolumns);
void  f1b(int  (*a)[NCOLUMNS],  int  nrows,  int  ncolumns);
void  f2(int  *aryp,  int  nrows,  int  ncolumns);
void  f3(int  **pp,  int  nrows,  int  ncolumns);
其中f1a() 和f1b() 接受传统的二维数组, f2() 接受“扁平的” 二维数组, f3() 接受指针的指针模拟的数组(参见问题6.15 和6.16), 下面的调用应该可以如愿运行:
f1a(array,  NROWS,  NCOLUMNS);
f1b(array,  NROWS,  NCOLUMNS);
f1a(array4,  nrows,  NCOLUMNS);
f1b(array4,  nrows,  NCOLUMNS);
f2(&array[0][0],  NROWS,  NCOLUMNS);
f2(*array,  NROWS,  NCOLUMNS);
f2(*array2,  nrows,  ncolumns);
f2(array3,  nrows,  ncolumns);
f2(*array4,  nrows,  NCOLUMNS);
f3(array1,  nrows,  ncolumns);
f3(array2,  nrows,  ncolumns);
下面的调用在大多数系统上可能可行, 但是有可疑的类型转换, 而且只有动态ncolumns 和静态NCOLUMNS 匹配才行:

f1a((int  (*)[NCOLUMNS])(*array2),  nrows,  ncolumns);
f1a((int  (*)[NCOLUMNS])(*array2),  nrows,  ncolumns);
f1b((int  (*)[NCOLUMNS])array3,  nrows,  ncolumns);
f1b((int  (*)[NCOLUMNS])array3,  nrows,  ncolumns);
同时必须注意向f2() 传递&array[0][0] (或者等价的*array) 并不完全符合标准; 参见问题。
如果你能理解为何上述调用可行且必须这样书写, 而未列出的组合不行, 那么你对C 语言中的数组和指针就有了很好的理解了。
为免受这些东西的困惑, 一种使用各种大小的多维数组的办法是令它们“全部” 动态分配, 如问题6.13 所述。如果没有静态多维数组—— 如果所有的数组都按问题 的array1 和array2 分配—— 那么所有的函数都可以写成f3() 的形式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值