如何使用new运算符在C++中动态声明二维数组

如何使用new运算符在C++中动态声明二维数组

如何使用new运算符在C++中动态声明二维数组

在 C/C++ 中,多维数组可以简单理解为数组的数组。多维数组中的数据以表格形式(按行主序)存储。下面是声明 N 维数组的一般形式:

N维数组的语法:

data_type array_name[size1][size2]….[sizeN];

data_type: 要存储在数组中的数据类型。

在这里,data_type 是有效的 C/C++数据类型。

array_name: 数组的名称

size1、size2、…、sizeN: 维度的大小

2D 数组是一维数组的数组。

2D 数组的语法:

data_type array_name[x][y];

data_type: 要存储的数据类型。有效的 C/C++ 数据类型。

下面是二维数组的图示表示:

有关多维数组和 2D 数组的更多详细信息,请参阅C++中的多维数组文章。

问题: 给定一个 2D 数组,任务是在 C++ 中使用 new 动态分配二维数组的内存。

解决方案: 使用以下值声明一个 3 行 4 列的 2D 数组:

1 2 3 4

5 6 7 8

9 10 11 12

注意: 这里 M 是行数, N 是列数。

方法一: 使用单个指针——在此方法中,分配了大小为 M*N 的内存块,然后使用指针算术访问内存块。下面是相应程序:

// C++ program to dynamically allocate

// the memory for 2D array in C++

// using new operator

#include

using namespace std;

// Driver Code

int main()

{

// Dimensions of the 2D array

int m = 3, n = 4, c = 0;

// Declare a memory block of

// size m*n

int* arr = new int[m * n];

// Traverse the 2D array

for (int i = 0; i < m; i++) {

for (int j = 0; j < n; j++) {

// Assign values to

// the memory block

*(arr + i * n + j) = ++c;

}

}

// Traverse the 2D array

for (int i = 0; i < m; i++) {

for (int j = 0; j < n; j++) {

// Print values of the

// memory block

cout << *(arr + i * n + j)

<< " ";

}

cout << endl;

}

//Delete the array created

delete[] arr;

return 0;

}

输出:

1 2 3 4

5 6 7 8

9 10 11 12

方法二: 使用指针数组:这里创建了一个指针数组,然后对每个内存块进行操作。下面是说明该概念的图示:

下面是相应的程序:

// C++ program to dynamically allocate

// the memory for 2D array in C++

// using an array of pointers

#include

using namespace std;

// Driver Code

int main()

{

// Dimensions of the 2D array

int m = 3, n = 4, c = 0;

// Create an array of pointers

// dynamically

int** arr = new int*[m];

// Traverse through each pointer

for (int i = 0; i < m; i++) {

// Allocate memory of size n with

// each pointer of array

arr[i] = new int[n];

}

// Assign values to allocated memory

for (int i = 0; i < m; i++) {

for (int j = 0; j < n; j++) {

arr[i][j] = ++c;

}

}

// Traverse through the array

for (int i = 0; i < m; i++) {

for (int j = 0; j < n; j++) {

cout << arr[i][j]

<< " ";

}

cout << endl;

}

// Delete the array of pointers

for (int i = 0; i < m; i++) {

delete[] arr[i];

}

delete[] arr;

return 0;

}

输出:

1 2 3 4

5 6 7 8

9 10 11 12

// C++程序:在C++中使用new运算符

// 动态分配二维数组的内存

#include

using namespace std;

// 主函数

int main()

{

// 数组的维度

int m = 3, n = 4, c = 0;

// 声明大小为M的内存块

int** a = new int*[m];

for (int i = 0; i < m; i++) {

// 声明大小为n的内存块

a[i] = new int[n];

}

// 遍历二维数组

for (int i = 0; i < m; i++) {

for (int j = 0; j < n; j++) {

// 为创建的内存块赋值

a[i][j] = ++c;

}

}

// 遍历二维数组

for (int i = 0; i < m; i++) {

for (int j = 0; j < n; j++) {

// 输出创建的内存块的值

cout << a[i][j] << " ";

}

cout << endl;

}

// 删除已创建的数组

for (int i = 0; i < m; i++)

// 删除内部数组

delete[] a[i];

delete[] a; // 删除包含所有内部数组指针的外部数组

return 0;

}

输出:

1 2 3 4

5 6 7 8

9 10 11 12

相关推荐

区块链概念股
365bet信誉怎么样

区块链概念股

07-25 👁️‍🗨️ 4568
数学游戏有哪些 十大必玩数学游戏推荐
365bet体育滚球

数学游戏有哪些 十大必玩数学游戏推荐

07-23 👁️‍🗨️ 699
数学游戏有哪些 十大必玩数学游戏推荐
365bet体育滚球

数学游戏有哪些 十大必玩数学游戏推荐

07-23 👁️‍🗨️ 699
世界盃2022
365bet信誉怎么样

世界盃2022

08-16 👁️‍🗨️ 8170
鳄鱼小顽皮攻略
mobile.365-588

鳄鱼小顽皮攻略

07-17 👁️‍🗨️ 8360
魔兽世界法师职业种族选择攻略:15个种族特性全解析
365bet体育滚球

魔兽世界法师职业种族选择攻略:15个种族特性全解析

08-07 👁️‍🗨️ 9403
前期第一,后期第二,换回刺客出装后,暃又起飞了?闷声发大财
171手机号码靓号敢买吗
365bet体育滚球

171手机号码靓号敢买吗

08-13 👁️‍🗨️ 2107
如何查看手机位置 ▷➡️
365bet体育滚球

如何查看手机位置 ▷➡️

08-31 👁️‍🗨️ 1536