我怎样在函数参数传递时混用静态和动态多维数组?
2014-06-06 14:20
337 查看
我怎样在函数参数传递时混用静态和动态多维数组? 没有完美的方法。假设有如下声明
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() 的形式。
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() 的形式。
相关文章推荐
- C语言中多维数组的常见动态分配方式及其在函数参数传递时的应用
- C语言技巧:怎样把数组作为参数传递给函数?
- 怎样把数组作为参数传递给函数
- (转载) C语言技巧:怎样把数组作为参数传递给函数?(值传递和指针传递)
- 多维数组 函数参数传递
- C++中将二维数组(静态的和动态的)作为函数的参数传递
- Delphi 无类型参数传递动态数组和静态数组
- C语言技巧:怎样把数组作为参数传递给函数?
- 如何将多维数组作为参数传递给函数?(以二维数组为例)
- Socket怎样传递OLEVariant的多维数组
- 一维数组的函数参数传递
- c 向函数传递多维数组
- C++ 多维数组作为函数的返回值和参数
- 函数的返回值问题(返回指针和数组的区别)静态存储区、动态数据区、栈
- c语言之函数参数传递之数组篇
- javascript写的关于静态页面获取URL传递参数的函数[原创]
- C语言多维数组参数传递问题
- C#中数组作为函数参数的传递方式
- Socket怎样传递OLEVariant的多维数组
- 数组做为参数传递给函数