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

没有完美的方法。

假设有如下声明

int array[NROWS][NCOLUMNS];

int **array1; /* 不齐的*/

int **array2; /* 连续的*/

int *array3; /* "变平的" */

int (*array4)[NCOLUMNS];

指针的初始值如问题6.13 的程序片段, 函数声明如下

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) 并不完全符合标准; 参见问题6.16。

如果你能理解为何上述调用可行且必须这样书写, 而未列出的组合不行, 那么你对C 语言中的数组和指针就有了很好的理解了。

为免受这些东西的困惑, 一种使用各种大小的多维数组的办法是令它们“全部” 动态分配, 如问题6.13 所述。

如果没有静态多维数组—— 如果所有的数组都按问题6.13 的array1 和array2 分配—— 那么所有的函数都可以写成f3() 的形式。

永不止步步 发表于01-14 10:44 浏览65535次
分享到:

已有0条评论

暂时还没有回复哟,快来抢沙发吧

添加一条新评论

只有登录用户才能评论,请先登录注册哦!

话题作者

永不止步步
金币:67410个|学分:308217个
立即注册
畅学电子网,带你进入电子开发学习世界
专业电子工程技术学习交流社区,加入畅学一起充电加油吧!

x

畅学电子网订阅号