注意:静态数组是在堆栈上(不需要自行释放空间)创建,动态数组是在堆上创建(需要自行释放空间)
涉及内容:
堆(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++动态数组,转载请注明来源!