C++学习之动态数组

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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值