Q如何编写接受二维数组的函数,但其宽度在编译时未知?
A这并不总是容易的。一种方法是传递一个指向[0][0]元素的指针,以及两个维度,并“手动”模拟数组下标。
void f2(int *aryp, int nrows, int ncolumns) { ... array[i][j] is accessed as aryp[i * ncolumns + j] ... }请注意,手动下标的正确表达式涉及ncolumns(每行的“宽度”),而不是nrows(行数);这很容易弄反。
此函数可以与问题 6.18 中的array一起调用,如下所示:
f2(&array[0][0], NROWS, NCOLUMNS);
但是必须指出的是,以这种方式“手动”执行多维数组下标的程序并不严格符合 ANSI C 标准;根据官方解释,访问(&array[0][0])[x]对于x >= NCOLUMNS.
行为未定义。C99 允许可变长度数组(VLA),一旦接受 C99 扩展的编译器变得普及,VLA 可能会成为首选解决方案。(gcc早已支持可变大小数组。)
当你想让一个函数能够处理各种大小的多维数组时,一种解决方案是动态模拟所有数组,如问题 6.16 所示。
参考文献:ISO Sec. 6.3.6
C9X Sec. 6.5.5.2