【C++】动态数组

简介: 那啥时候我们需要定义动态数组呢?

一、动态数组

回顾计算机内存中按照用途被划分的5个区域:

//存储在栈
int x=0;
int *p=NULL; 
//存储在堆区,注意这里的数组名为p,而不是int(关键字int)
int *p=new int[20];
//全局区
存储全局变量和静态变量
//常量区
string str="hello";
//代码区
存储逻辑代码的二进制

那啥时候我们需要定义动态数组呢?

【答】很多情况下,在预编译过程阶段,数组的长度是不能预先知道的,必须在程序运行时动态的给出

但是问题是,c++要求定义数组时,必须明确给定数组的大小,要不然编译通不过。

如: int Array[5];正确

int i=5;
int Array[i]; 
//错误 因为在编译阶段,编译器并不知道 i 的值是多少

所以为了解决定义长度未知的数组,我们需要new 动态定义数组。

二、小栗子

下面栗子创建了一个长度为n的动态数组,并且返回这个数组的首地址给p,p就指向了这个动态数组(的首地址),可以通过指针p来操作数组。

#include<iostream>
using namespace std;
int main()
{
   int n;   //输入数组长度
   cin>>n;
   int *p;  //声明一个指针
   p=new int[n]; /*创建了一个长度为n的动态数组,并且返回这个数组的首地址给p,p就指向了这个动态数组,可以通过指针p
                 来操作数组,因为创建的动态数组并没有名字,只返回了首地址给p,所以可以把p看作是这个动态数组的名字 */
   for(int i=0;i<n;i++)
       cin>>p[i];
   for(int i=0;i<n;i++)
       cout<<p[i]<<" ";
   delete []p;  //释放这个一维的动态数组,而不是释放指针p。用完以后要记得释放掉
   cout<<endl<<p;    //输出指针p的地址
   system("pause");
   return 0;
}

如上面代码栗子的结果如下,我们往动态数组中存入3个元素值并打印出来:

image.png

三、注意事项

(1)注意用完这个动态数组后,我们是用delete []p释放了这个动态数组,而不是释放指针p(后面指针就还能用,如上面栗子中我们输出了指针p的地址)。

(2)如果是释放指针p操作delete p,即将p指针所占的内存空间释放了,那后面打印指针p的地址就会报错(不过也看编译器,,在vs2015上好像木有报错。。)。

相关文章
|
2月前
|
存储 网络协议 C++
C++ Vector容器详解:一站式指南,掌握动态数组的高效使用
C++ Vector容器详解:一站式指南,掌握动态数组的高效使用
156 2
|
11月前
|
程序员 C++
7.1 C/C++ 实现动态数组
动态数组相比于静态数组具有更大的灵活性,因为其大小可以在运行时根据程序的需要动态地进行分配和调整,而不需要在编译时就确定数组的大小。这使得动态数组非常适合于需要动态添加或删除元素的情况,因为它们可以在不浪费空间的情况下根据需要动态增加或减少存储空间。
52 0
|
12月前
|
C++
C++数据结构--01数组二次封装成动态数组 2021-04-23
C++数据结构--01数组二次封装成动态数组 2021-04-23
|
存储 程序员 编译器
C++使用指针,动态数组,指针做参数需要注意的问题等总结
C++使用指针,动态数组,指针做参数需要注意的问题等总结
C++使用指针,动态数组,指针做参数需要注意的问题等总结
|
C++ Python
c++入门教程:c++中的动态数组
c++入门教程:c++中的动态数组
|
机器学习/深度学习 关系型数据库 C++
【C/C++学院】0815-函数包装器/CPP类型转换/函数模块/动态数组
&lt;p&gt;&lt;/p&gt; &lt;h2&gt; &lt;span style=&quot;font-family:宋体; font-size:16pt&quot;&gt;函数包装器管理内嵌函数&lt;/span&gt;&lt;span style=&quot;font-family:宋体; font-size:16pt&quot;&gt;&lt;/span&gt; &lt;/h2&gt; &lt;pre name=&quot;code&quot; class=&quot;cpp&quot;&gt;#include&lt;iostream&gt; #incl
1454 0
|
C++
2014秋C++第16周 项目4参考 为动态数组扩容
课程主页在http://blog.csdn.net/sxhelijian/article/details/39152703,课程资源在云学堂“贺老师课堂”同步展示,使用的帐号请到课程主页中查看。  【项目4-为动态数组扩容】  下面的程序,利用动态数组保存学生的成绩。当再有一批学生成绩需要保存时,要为之扩容(和吃自助一样,用多少,取多少,这好),请补充完整下面的程序,实现如图所示的功能。 i
1106 0
|
C++
关于C++动态数组的若干问题
#include using namespace std; int f(int n) { char x[n]; x[0] = 'a'; //测验了下长度为sizeof(类型)*n cout
714 0