C++用new创建动态数组

如果通过像下面这样一般的方法来声明数组,则在程序编译的时候为其分配内存,不管程序最终是否用到这个数组,数组都在那里并占用内存,即静态联编。但是如果使用new,则在运行阶段需要它才进行创建,不需要则不创建,这叫动态联编,这种创建的数组叫做动态数组。并且静态联编必须在写程序时就声明数组长度,而动态联编在运行时才确定数组的长度。

int arr[5];

用new创建动态数组:

double *p3 = new double[3];

上述代码使得声明一个长为3,类型为double的动态数组。

delete动态数组:

delete []p3;

 使用new和delete时应遵守的规则:

声明完动态数组,我们可以通过下面的方式进行初始化:

  • 默认情况下,new分配的对象都有默认初始化
int *p1=new int[10];   //10个未初始化的int
int *p2=new int[10](); //10个初始化为0的int
string *p3=new string[10];  //10个空的string
string *p4=new string[10]();//10个空的string
  • C++11标准:花括号初始化器初始化
int *p1=new int[5]{0,1,2,3,4};
string *p3=new string[3]{"a","the",string(3,'x')};
  • bad_array_new_length异常:当初始化数目大于元素数目时,new表达式失败,抛出此异常。此异常定义在new头文件中

并且动态分配一个空数组是合法的!

  • 动态分配一个数组是合法的,new返回一个合法的非空指针,此指针保证与new返回的其它任何指针都不相同。但是不能对此指针解引用
  • 普通数组定义一个空数组是不允许的
int arr[0];  //错误
int *p = new int[0];  //正确

动态数组的访问:

我们创建了一个动态数组指针p3后,我们可以通过p3[i]来直接访问数组中的第i个元素。请注意!这与我们一般使用*(p3 + i)来访问不同!

 可以看到,上述代码将指针p3当作数组名使用 。


下面不妨让我们再了解下new一下其他数据结构的操作吧:

  •  比如我们Leetcode中的常客:单链表,其数据结构定义如下
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */

 这时我们可以用new来新建一个链表节点:

ListNode *p1 = new ListNode(-1);
  • 我们还可以用new来创建任意自定义数据类型 

 参考资料:

C++:34---动态数组(new)_董哥的黑板报的博客-CSDN博客_c++动态数组 new

  • 6
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值