首页 » 技术分享 » c++动态数组

c++动态数组

 

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

涉及内容:

堆(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<iostream>

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<iostream>

#include<string>

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;

/*}*/

 

 

 

}

转载自原文链接, 如需删除请联系管理员。

原文链接:c++动态数组,转载请注明来源!

0