1.使用new创建动态数组
数组是在程序运行时创建的,这种数组就叫做动态数组
要创建一个包含10个int元素的数组,vector可以这样做
int *psome = new int [10];
new运算符返回第一个元素的地址,在这个例子中,该地址(数组首元素地址)赋给指针psome
当程序使用完new分配的内存时,应使用delete释放他们
delete []psome;
总之,在使用new和delete时,应遵守以下规定:
**不要使用delete来释放不是new分配的内存
**不要使用delete释放同一个内存两次
**如果使用new[]为一个数组分配内存,则应该使用delete[]来释放
**对空指针使用delete是安全的
2.使用动态数组
由于psome存储的是数组首元素的地址,因此*psome代表的是第一个元素的值,但是其他就不好表达。在C++中,只要把指针当作数组名使用就行,也就是说psome[0]代表第一个元素,psome[1]代表第二个元素,以此类推;创建一个文件,命名为1.cpp;
#include <iostream>
int main()
{
double *p = new double [3];
p[0] = 0.2;
p[1] = 0.5;
p[2] = 0.8;
std::cout << "p[1] is " << p[1] << ".\n";
p = p + 1;
std::cout << "Now p[0] is " << p[0] << " and ";
std::cout << "p[1] is " << p[1] << ".\n";
p = p - 1;
delete []p;
return 0;
}
在vscode输入上述代码,在终端输入g++ 1.cpp -o 1;会编译出一个可执行的1.exe文件,执行./1.exe,最终会运行程序,输出为
请注意p加1的效果,对指针加减1会改变指针指向,而不是直接修改数组名的值。
3.指针算数
由上面的示例可知,对指针加减可以改变指针指向,再举一个例子
double wages[3] = {1000, 2000, 3000};
short stacks[3] = {3, 2, 1};
double *pw = wages;
short *ps = &stacks[0];
则*pw = 1000,若加入一行代码pw = pw + 1,则*pw = 2000,同理,*ps = 3,若加入一行代码ps = ps + 1,*ps = 2。
4.使用new创建动态结构
已知
struct inflatable
{
char name[20];
float volume;
double price;
};
想使用new创建动态结构,可使用以下方法
inflatable *ps = new inflatable;
这将把足以存储inflatable结构的一块内存赋给ps,这样ps就指向了inflatable结构,则ps->price是被指向的结构的price成员。另一种访问结构成员的方法是,如果ps是指向结构的指针,则*ps就是被指向的结构本身,由于*ps是一个结构,因此(*ps).price是该结构的成员。
5.数组的替代品
1.模板类vector
模板类类似string类,也是一种动态数组,他是使用new创建动态数组的替代品,实际上vector确实使用new和delete来管理内存,但这种工作是自动完成的。
#include <iostream>
#include <vector>
int main()
{
std::vector<int> vi;
int n;
std::cin >> n;
std::vector<double> vd(n);
return 0;
}
其中,vi是一个vector<int>对象,vd是一个vector<double>对象。由于vector对象在插入和添加值时会自动调整长度,因此可以将vi的初始化长度设置为0,但要调整长度,需要使用vector包中的各种方法。
2.模板类array
vector类付出的代价是效率较低,如果需要的是长度固定的数组,使用数组是最佳选择。
C++新增了模板类array,与数组一样,array对象的数组长度是固定的,也使用栈(静态内存分配),而不是自由存储区,因此效率与数组相同,但更方便更安全。
#include <iostream>
#include <vector>
#include <array>
int main()
{
std::array<int, 5> ai;
std::array<double, 5> ad = {1.2, 2.1, 3.43, 4.3};
return 0;
}
3.比较数组,vector,array
给出示例程序
#include <iostream>
#include <vector>
#include <array>
int main()
{
double a1[4] = {1.2, 2.4, 3.6, 4.8};
std::vector<double> a2(4);
a2[0] = 1.0 / 3.0;
a2[1] = 1.0 / 5.0;
a2[2] = 1.0 / 7.0;
a2[3] = 1.0 / 9.0;
std::array<double, 4> a3 = {3.14, 2.72, 1.62, 1.41};
std::array<double, 4> a4;
a4 = a3;
std::cout << "a1[2]: " << a1[2] << " at " << &a1[2] << std::endl;
std::cout << "a2[2]: " << a2[2] << " at " << &a2[2] << std::endl;
std::cout << "a3[2]: " << a3[2] << " at " << &a3[2] << std::endl;
std::cout << "a4[2]: " << a4[2] << " at " << &a4[2] << std::endl;
a1[-2] = 20.2;
std::cout << "a1[-2] " << a1[-2] << " at " << &a1[-2] << std::endl;
std::cout << "a3[2] " << a3[2] << " at " << &a3[2] << std::endl;
std::cout << "a4[2] " << a4[2] << " at " << &a4[2] << std::endl;
return 0;
}
程序输出为
a1[2]: 3.6 at 0x61fdf0
a2[2]: 0.142857 at 0xd92510
a3[2]: 1.62 at 0x61fdb0
a4[2]: 1.62 at 0x61fd90
a1[-2] 20.2 at 0x61fdd0
a3[2] 1.62 at 0x61fdb0
a4[2] 1.62 at 0x61fd90