二维数组声明及其作为函数参数

本文以 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

posted @ 2023-02-25 20:42  green-cnblogs  阅读(70)  评论(0编辑  收藏  举报