开发者社区> 问答> 正文

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

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

展开
收起
游客56pszsvgthciu 2022-03-29 02:26:52 420 0
1 条回答
写回答
取消 提交回答
  • 没有完美的方法。假设有如下声明 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() 的形式。

    2022-03-29 02:27:19
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
继承与功能组合 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载