二维数组声明及其作为函数参数
本文以 3 行 2 列的二维数组为例,介绍了如何声明自动存储、静态存储和动态存储的二维数组,及其如何将它们作为函数参数进行传递的方式。
◆ 目的
如何声明自动存储、静态存储和动态存储的二维数组,及其将它们作为函数参数进行传递?
◆ 解法
针对自动存储或静态存储的二维数组,
- 声明,需在数组名后指定维数的大小。
- 作为函数参数,需要把行数和数组名也同时传递给函数。
针对动态存储的二维数组,
- 声明,可以考虑两种方法:(1)逐行分配内存,不保证各行间的内存连续;(2)一次分配全部内存,保证各行间的内存连续。
- 作为函数参数,需要把行数、列数和数组名传递给函数。
◆ 示例
处理自动存储或静态存储的二维数组,
...
// Assigning to auto or static array.
void assign(int row, int (*array)[2]);
// Outputting auto or static array.
void output(int (*array)[2], int row);
...
int staticarray[3][2]; // #1
int main() {
assign(3, staticarray); // #2
int autoarray[3][2]; // #1
assign(3, autoarray); // #2
...
std::printf("Outputting static array...\n");
output(staticarray, 3); // #2
std::printf("Outputting auto array...\n");
output(autoarray, 3); // #2
...
}
在声明时,在数组名后指定维数的大小(#1)。将它们传递给函数时,需要把行数和数组名传递给函数(#2)。
处理动态存储的二维数组,
...
// Assigning to dynamic array.
void assign(int row, int column, int** array);
// Outputting dynamic array.
void output(int** array, int row, int column);
...
int main() {
...
int** dynamicarray1 = new int*[3];
for (int i = 0; i < 3; ++i) dynamicarray1[i] = new int[2]; // #1
assign(3, 2, dynamicarray1); // #3
int** dynamicarray2 = new int*[3];
int* data = new int[3*2]; // #2
for (int i = 0; i < 3; ++i) dynamicarray2[i] = data + 2 * i;
assign(3, 2, dynamicarray2); // #3
std::printf("Outputting dynamic array 1...\n");
output(dynamicarray1, 3, 2); // #3
std::printf("Outputting dynamic array 2...\n");
output(dynamicarray2, 3, 2); // #3
...
}
在声明时,方法一(#1),逐行分配内存,不保证各行间的内存连续;方法二(#2),一次分配全部内存,保证各行间的内存连续。将它们传递给函数时,把行数、列数和数组名传递给函数(#3)。
◆ 验证
在命令行中编译代码(-std=c++11),运行可执行文件并检查输出结果。以下是输出结果的部分内容,
Outputting static array...
1 2
2 4
3 6
Outputting auto array...
1 2
2 4
3 6
Outputting dynamic array 1...
1 2
2 4
3 6
Outputting dynamic array 2...
1 2
2 4
3 6
◆ 最后
完整示例代码请参考 [gitee] cnblogs/17155320 。
受限于作者的水平,读者如发现有任何错误或有疑问之处,请追加评论或发邮件联系 green-pi@qq.com。作者将在收到意见后的第一时间里予以回复。 本文来自博客园,作者:green-cnblogs,转载请注明原文链接:https://www.cnblogs.com/green-cnblogs/p/17155320.html 谢谢!