c++动态数组

c++动态数组注意 静态数组是在堆栈上 不需要自行释放空间 创建 动态数组是在堆上创建 需要自行释放空间 涉及内容 堆 heap 自由存储区 freestore C 语言 malloc 和 freec 语言 new 和 delete1 动态数组定义 见后面 2 初始化动态数组分配 string p string newstring 10 默认的构造函数初始化 Dog p

注意:静态数组是在堆栈上(不需要自行释放空间)创建,动态数组是在堆上创建(需要自行释放空间)

涉及内容:

堆(heap)-自由存储区(free store)

C语言:malloc和free

c++语言:new和delete

1.动态数组定义(见后面)

2.初始化动态数组分配

string *p_string = new string[10]; //默认的构造函数初始化

Dog *p_dog = new Dog[10];//调用默认构造函数的初始化

//动态创建的内置类型数组初始化就要加上一个小括号

int *pp2 = new int[10]();//使用内置类型的默认值进行初始化

3.const对象的动态数组

const指针,这个指针创建了后就不得修改,所以必须首先对其进行初始化操作

const int *p_const = new const int[100]();

4.允许动态分配空数组

5.动态空间的释放

动态空间的new和delete是成对出现,因此,有了new后就必须进行释放。

6.动态数组的使用

动态数组定义:

为什么需要动态定义数组?

很多情况下,在预编译过程阶段,数组的长度是不能预先知道的,必须在程序运行时动态的给出,但是问题是,c++要求定义数组时,必须明确给定数组的大小,要不然编译通不过

  如: int Array[5]; 正确

       int i=5;

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

   那么,我们该如何解决定义长度未知的数组呢?

   答案是:new 动态定义数组 

   因为new 就是用来动态开辟空间的,所以当然可以用来开辟一个数组空间

   这样,下面的语句:

    int size=50;

    int *p=new int[size]; 是正确的

 

但是二维动态数组能不能也这样定义呢

  int size=50,Column=50;

  int (*p)[Column]=new int [size][Column]

  这样的语句,编译器通不过,为什么呢?

  首先 new int[size][Column] 就是动态生成时确定的,所以它没有错

  那么就是 int(*p)[Column],这句有问题了,这句为什么不对呢, 那是因为,这是一个定义语句,而定义语句先经过编译器进行编译,当编译器运行到此处时,发现Column 不是常数,因此不能通过编译。 而之所以编译器认为Column 不是常数,是因为编译阶段,编译器起的作用是查语法错误,和预分配空间,它并不执行程序,因此,没有执行那个赋值语句(只是对这个语句检查错误,和分配空间),因此编译阶段,它将认为column 是个变量。所以上面的二维数组定义是错误的, 它不能通过编译。

 

  改成这样:

  int size=50

  int (*p)[50]=new int [size][50]

  便正确了。

new关键字的过程:

它实际上做了三件事:

1、获得一块内存空间

2、调用构造函数

3、返回正确的指针。

string *p_string = new string[10]; //默认的构造函数初始化

Dog *p_dog = new Dog[10];//调用默认构造函数的初始化

//动态创建的内置类型数组初始化就要加上一个小括号

int *pp2 = new int[10]();//使用内置类型的默认值进行初始化

实例:

#include

using namespace std;

int main()

{

int a[10];//静态数组,在堆栈上创建

int n;

 

cout << "你想要多大的数组:" << endl;

cin >> n;

//C语言的malloc函数进行书写

int *p = (int *)malloc(n * sizeof(int));

if(p != NULL)

{

cout << "c语言 malloc创建动态数组成功!" << endl;

 

}

//c++创建动态数组

int *pp = new int[n];//创建新的数组

if(pp != NULL)

{

cout << "c++创建动态数组成功" << endl;

}

 

free(p);//c语言创建的数组释放

delete[] pp;//c++创建的数组进行释放

 

cout << "hdd";

}

 

 

#include

#include

using namespace std;

class Dog

{

 

};

int main()

{

int a[10];//静态数组,在堆栈上创建

int n;

int *pp_int = new int[10];//创建新的数组,没有初始化,一般内置的类型比如int,double都不会初始化

string *p_string = new string[10]; //默认的构造函数初始化

Dog *p_dog = new Dog[10];//调用默认构造函数的初始化

//动态创建的内置类型数组初始化就要加上一个小括号

int *pp2 = new int[10]();//使用内置类型的默认值进行初始化

cout << *(pp2+2) << endl;

 

//参数赋值

*pp_int = 9;

*(pp_int +1) = 10;

*(pp2+1) = 15;

*(pp2+4) = 12;

 

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

{

cout << *(pp2 + i) << endl;

}

 

//动态数组的初始化

for(int *ppp = pp_int;ppp != pp_int + 10;ppp++)//针对地址++进行值得后移

{

*ppp = 11;

}

//遍历(指针遍历)

for(int *pppp = pp_int;pppp != pp_int + 10;pppp++)

{

cout << *pppp << endl;

}

//普通循环

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

{

cout << *(pp_int + i) << endl;

}

 

//const指针,这个指针创建了后就不得修改,所以必须首先对其进行初始化操作

const int *p_const = new const int[100]();

//防止内存泄漏

delete[] p_const;

delete[] pp_int;

delete[] p_string;

delete[] p_dog;

 

//双引号代表申请了一个空间,存储字符串,const char *pc意思就是开辟一个指针变量

//相当于pc = &字符串;即获取字符串的地址。

//c语言的方式

const char *pc = “a very long literal string”;

cout << pc << endl;

const size_t len = strlen(pc);

 

for(size_t ix = 0;ix != 100; ++ix)

{

char *pc2 = new char[len+1];

strcpy(pc2,pc);

cout << pc2 << endl;

delete[] pc2;

}

 

//c++语言的方式

string str(“a very long literal string”);

//for(int i = 0;i != 100;i++)

//{

string str2 = str;

cout << "c++" << str2 << endl;

/*}*/

 

 

 

}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/200503.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月20日 上午10:42
下一篇 2026年3月20日 上午10:42


相关推荐

  • eigen库的使用_vcg库

    eigen库的使用_vcg库Eigen矩阵定义#includeMatrixdouble,3,3>A;//Fixedrowsandcols.SameasMatrix3d.Matrixdouble,3,Dynamic>B;//Fixedrows,dynamiccols.Matrixdouble,Dynamic,Dynam

    2022年10月7日
    5
  • 学电脑必知的电脑配置

    学电脑必知的电脑配置电脑的配置,主要看CPU、显卡、主板、内存、硬盘、显示器等,而笔记本的话就看它的品牌就行了。国外的有HP、apple、松下、东芝等,不过顾客口碑和质量比较硬的是DELL和HP这两个品牌;国产的有:宏基、清华紫光、清华同方、神州、海尔、联想、八亿时空等。评价标准1、CPU,这个主要取决于频率和二级缓存,频越高、二级缓存越大,速度越快,未来CPU会有三级缓存、四级缓…

    2022年7月16日
    25
  • 分类模型评估方法_政策评估的模型与方法

    分类模型评估方法_政策评估的模型与方法上图矩阵中1是正例,0是只负例对于二分类问题,可以将真实类别和分类器预测类别组合为:真正例(truepositiveTP):真实类别为正例,预测类别为正例;假正例(falsepositiveFP):真实类别为负例,预测类别为正例;假负例(falsenegativeFN):真实类别为正例,预测类别为负例;真负例(truenegativeTN):真实类别为负例,预测类别为负例;分类模…

    2026年4月15日
    3
  • js编写HTML通过document.cookie写入不了cookie的问题[通俗易懂]

    js编写HTML通过document.cookie写入不了cookie的问题[通俗易懂]js中通过document.cookie写入不了cookie的问题使用VScode编写HTML应用cookie进行存储,发现编写无法读取到cookie的内容,即未能实现cookie存储。作为新手问题,可以考虑这个原因:只有当用在服务器或者本地的服务器中的时候,才能使用这个方法写入cookie,所以VScode没有使用服务器方式?这个原因可以通过方案一尝试解决:打开VScode,点击左侧扩展,输入liveserver,点击安装即可;安装成功后再VS界面右下角可以看到相应提示

    2022年7月16日
    66
  • 阅读《平庸的世界》印象(一)

    阅读《平庸的世界》印象(一)

    2022年1月14日
    44
  • qcow2 总结

    qcow2 总结1 qcow2 文件分布对内存不了解的可跳过此部分 MMU 虚拟地址和物理地址 TLB TranslationL 4k 一个 page 需要一个地址存放 4K gt 4B 4G gt 4MB 100 万个页 100 个进程需要 400M 将页表 一级页表 分为 1024 个页表 二级页表 每个表 二级页表 中包含 1024 个 页表项 页表一定要覆盖全部虚拟地址空间 不分级的页表就需要有 100 多万个页表项来映射 而二级分页

    2026年3月19日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号