如果通过像下面这样一般的方法来声明数组,则在程序编译的时候为其分配内存,不管程序最终是否用到这个数组,数组都在那里并占用内存,即静态联编。但是如果使用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来创建任意自定义数据类型
参考资料:文章来源:https://www.toymoban.com/news/detail-483555.html
C++:34---动态数组(new)_董哥的黑板报的博客-CSDN博客_c++动态数组 new文章来源地址https://www.toymoban.com/news/detail-483555.html
到了这里,关于C++用new创建动态数组的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!