广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++ 使用 new 创建二维数组实例
  • 740
分享到

C++ 使用 new 创建二维数组实例

摘要

目录1. 直接创建2. 借助指针数组3. 借助 std::vector1. 直接创建 c++ 使用 new 创建二维数组最直接的方法就是 new T[M][N]。返回的指针

1. 直接创建

c++ 使用 new 创建二维数组最直接的方法就是 new T[M][N]。返回的指针类型是 T (*)[N],它是指向数组的指针,可以直接使用数组下标形式访问元素。释放内存直接使用delete[]。示例代码:

#include <iOStream>

class A
{
public:
    A()
    {
        std::cout << "A::A" << std::endl;
    }
    ~A()
    {
        std::cout << "A::~A" << std::endl;
    }

    int x;
};

int main()
{
    A (*p)[3] = new A[2][3];
    delete[] p;
}

执行结果:

A::A
A::A
A::A
A::A
A::A
A::A
A::~A
A::~A
A::~A
A::~A
A::~A
A::~A

可以看到 A 的构造函数和析构函数正常执行。如果觉得 T (*)[N] 繁琐,可以直接使用 auto p = new T[M][N]。三维数组甚至更高维数组都可以使用这种方法。例如,三维数组使用 new T[M][N][O] 进行创建,依旧使用 delete[] p 进行释放。

为什么可以这样写?因为这种多维数组和普通的多维数组都是通过一维数组实现的。例如,int a[6][8],实际上编译器会转化为 int b[6 * 8] 一维数组。然后每次访问二维数组 a[i][j] 相当于访问 b[i * 8 + j]。从二维、三维数组的转化过程中可以发现一些规律。

T a[M][N] 	 --> T b[M * N],  	 a[i][j]    --> b[i * N + j]
T a[M][N][O] --> T b[M * N * O], b[i][j][k] --> b[i * N * O + j * O + k]

编译器进行下标转换时,并没有用到第 0 维的大小,而其它维的大小都是必须的。这也就是为什么下面代码能正确执行。

int a[2][3];
int (*p)[3] = a;

由于多维数组本质上是一维数组,所以释放内存都是 delete[] p,而没有奇怪的 delete[][] 语法。

2. 借助指针数组

还有一种方法就是先 new T*[M] 创建一个指针数组,其每个元素保存每一行的首个元素的地址,再使用 new T[N] 创建每一行。示例代码如下:

A** p = new A*[2];
for (int i = 0; i < 2; ++i) {
    p[i] = new A[3];
}

for (int i = 0; i < 2; ++i) {
    delete[] p[i];
}
delete[] p;

这种方法非常繁琐,首先 new T*[M] 不能写成 new (T(*)[M]),因为它是指针数组而不是数组指针。其次,需要对每一行调用 new T[N]。释放内存时,要先使用 delete[] 释放每一行,再调用 delete[] 释放数组指针。这几个步骤一步都不能错,不然就出现野指针或者内存泄漏。这段代码我也是用 Address Sanitizer 和 Leak Sanitizer 检查一遍才写对。

这种方法唯一的好处就是可以创建交错数组(Jagged Array),也就是每一行的大小不一样。例如:

A **p = new A *[2];
p[0] = new A[3];
p[1] = new A[4];

for (int i = 0; i < 2; ++i)
{
    delete[] p[i];
}
delete[] p;

3. 借助 std::vector

可以用 std::vector 对上面这种方法进行包装,使其更加易用。示例代码如下:

std::vector<std::vector<int>> v{ std::vector<int>(3), std::vector<int>(4) };
std::cout << v[0].size() << " " << v[1].size() << std::endl;

这段代码创建了一个二维数组,第 0 行有 3 个元素,第 1 行有 4 个元素。这种方法既能创建交错数组,也不需要手动释放内存。

到此这篇关于C++ 使用 new 创建二维数组实例的文章就介绍到这了,更多相关C++ 使用 new 创建二维数组内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++ 使用 new 创建二维数组实例

本文链接: https://www.lsjlt.com/news/177449.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++ 使用 new 创建二维数组实例
    目录1. 直接创建2. 借助指针数组3. 借助 std::vector1. 直接创建 C++ 使用 new 创建二维数组最直接的方法就是 new T[M][N]。返回的指针...
    99+
    2023-01-12
    c++用new创建二维数组 C++使用new语句生成二维数组 c++ new二维数组
  • Python 用NumPy创建二维数组的案例
    前言 上位机实战开发先放一放,今天来学习一个新的内容—NumPy的使用 1 一维数组 例:用普通方法生成一维数组 num = [0 for i in range(1,5)] # ...
    99+
    2022-11-11
  • Python创建二维数组与初始化的实践举例
    目录一、Python用什么表达二维数组二、如何初始化一个二维数组2.1 利用list自身进行构造2.2 利用传统的list的append方法,通过迭代构造2.3利用numpy包构建二...
    99+
    2022-12-10
    python创建二维数组并赋值 python如何定义二维数组 python二维数组创建
  • Python创建二维数组实例(关于list的一个小坑)
    0.目录 1.遇到的问题 2.创建二维数组的办法 •3.1 直接创建法 •3.2 列表生成式法 •3.3 使用模块numpy创建 1.遇到的问题 今天写Python代码的...
    99+
    2022-06-04
    数组 实例 Python
  • C#二维数组与多维数组如何使用
    这篇文章主要介绍“C#二维数组与多维数组如何使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C#二维数组与多维数组如何使用”文章能帮助大家解决问题。C# 中同样支持多维数组(也可称为矩形数组),它...
    99+
    2023-07-05
  • c++利用vector创建二维数组的几种方法总结
    目录用vector创建二维数组的几种方法方法一方法二:一维扩充法 vector定义二维数组的输入和输出用vector创建二维数组的几种方法 方法一 #include <...
    99+
    2022-11-13
    c++ vector vector创建二维数组 c++二维数组
  • C语言如何实现二维数组的创建和初始化
    这篇文章给大家分享的是有关C语言如何实现二维数组的创建和初始化的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。二维数组的创建和初始化1二维数组的创建int arr[3][...
    99+
    2022-10-19
  • python中怎么用numpy创建二维数组
    你可以使用numpy的`array`函数来创建二维数组。以下是一个使用numpy创建二维数组的示例代码:```pythonimpor...
    99+
    2023-08-31
    python numpy
  • C#二维数组与多维数组的具体使用
    目录1、二维数组2、初始化二维数组3、访问二维数组种的元素C# 中同样支持多维数组(也可称为矩形数组),它可以是二维的,也可以是三维的,多维数组中的数据以类似表格(行、列)的形式存储...
    99+
    2023-05-15
    C#二维数组与多维数组 C#二维数组 C#多维数组
  • C++中如何使用二维数组
    C++中如何使用二维数组,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。C++二维数组new应用方式一:A (*ga)[n] = new&nbs...
    99+
    2023-06-17
  • C语言中一、二维数组如何创建和初始化
    这篇文章将为大家详细讲解有关C语言中一、二维数组如何创建和初始化 ,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。(壹)  一维数组的创建和初始化 1.1  数组的创...
    99+
    2023-06-29
  • PHP开发技术:如何使用二维码生成器创建二维码数组?
    随着移动互联网的飞速发展,二维码已经成为一种非常方便的信息传递方式,因为它可以存储大量的信息,并且可以在移动设备上方便地扫描和识别。在PHP开发中,我们可以使用二维码生成器来创建二维码数组,本文将介绍如何使用PHP二维码生成器来创建二维码...
    99+
    2023-06-02
    开发技术 二维码 数组
  • 如何使用C++数组指针和二维数组
    这篇文章主要介绍“如何使用C++数组指针和二维数组”,在日常操作中,相信很多人在如何使用C++数组指针和二维数组问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何使用C++数组指针和二维数组”的疑惑有所帮助!...
    99+
    2023-06-25
  • Java 如何用二维数组创建空心菱形
    目录如何用二维数组创建空心菱形题目:用“*”创建一个菱形空心使用数组打印实心菱形二维数组的输出(其中一种方法)正式代码如何用二维数组创建空心菱形 提供一个我自...
    99+
    2022-11-13
  • Java怎么用二维数组创建空心菱形
    本文小编为大家详细介绍“Java怎么用二维数组创建空心菱形”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java怎么用二维数组创建空心菱形”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。如何用二维数组创建空心菱形...
    99+
    2023-06-29
  • C语言二维数组应用实现扫雷游戏
    本文实例为大家分享了C语言二维数组应用实现扫雷游戏的具体代码,供大家参考,具体内容如下 游戏简介: 电脑随机设置10个雷,用户输入坐标,若坐标下是雷则结束游戏,不是则该位置显示周围的...
    99+
    2022-11-13
  • C语言二维数组运用实现扫雷游戏
    作为80后、90后的老年人,想必对扫雷游戏都不陌生。扫雷,是微软在win8版本之前系统自带的一款游戏——现在已经被下架了,童年的回忆,很难受。游戏操作很简单,...
    99+
    2022-11-13
  • C语言二维数组指针的概念及使用
    目录二维数组指针数组和二维数组指针的区别二维数组 二维数组在概念上是二维的,有行和列,但在内存中所有的数组元素都是连续排列的,它们之间没有“缝隙”。以下面的二...
    99+
    2023-02-11
    C语言二维数组指针 C语言二维数组
  • C语言如何实现一维数组的创建和初始化
    小编给大家分享一下C语言如何实现一维数组的创建和初始化,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一维数组的创建和初始化1数组...
    99+
    2022-10-19
  • 使用PHP开发技术创建二维码数组:有哪些技巧和窍门?
    二维码是一种矩阵条形码,可以储存大量信息。在现代生活中,二维码已经广泛应用于各种场景,例如支付、扫码登录、商品信息等等。在本文中,我们将介绍如何使用PHP开发技术创建二维码数组,并分享一些技巧和窍门。 一、使用PHP QR Code库 P...
    99+
    2023-06-02
    开发技术 二维码 数组
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作