转 c++动态数组

c++动态数组
https://blog.csdn.net/manchengpiaoxue/article/details/83145476
注意:静态数组是在堆栈上(不需要自行释放空间)创建,动态数组是在堆上创建(需要自行释放空间)

涉及内容:

堆(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 int10;//使用内置类型的默认值进行初始化

3.const对象的动态数组

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

const int *p_const = new const int100;

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 int10;//使用内置类型的默认值进行初始化

实例:

#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§;//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 int10;//使用内置类型的默认值进行初始化

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 int100;

//防止内存泄漏

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;

/}/

}

作者:RoderRick
来源:CSDN
原文:https://blog.csdn.net/manchengpiaoxue/article/details/83145476
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值