• Index

连续的堆内存

Reads: 7

指针的用途三:保存申请连续堆内存后返回的地址。这个用途应该用容器库里的std::vector代替。

连续的内存

在我们写程序时,很多时候都会遇到需要连续的内存,举个我们常用的例子就是字符串,字符串变量内部用的内存就是连续的字符类型的内存。不知道你有没有想过:为什么不用一个个字符变量去保存而要使用连续的字符类型的内存来保存所有字符?举一个简单的例子:假设我用100个字符变量保存100个字符,我想统计这100个字符里面有多少个空格,那么你就要每个字符变量都去判断一遍,重复的代码写100遍;而用连续的内存,可以使用循环,通过内存地址不断+1,就可以逐个访问字符的内存,在循环里面写一遍代码就够了,下面会有代码例子。

连续的内存有两种,一种是堆内存,一种是栈内存。我们习惯将连续的堆内存称为动态数组,将连续的栈内存称为静态数组

而对于连续内存中的各份内存,我们习惯把它叫做元素

申请连续的堆内存

现在讲的是申请连续的堆内存,需要使用关键字new,释放需要使用关键字delete[]。假设我要创建100个unsigned long long类型的连续堆内存,先看看简单的申请和释放的代码:

unsigned long long *arr = new unsigned long long[100]; // 创建100个连续的堆内存
delete[] arr; // 释放连续的堆内存
arr = nullptr; // 指针赋值为指针空值防止误操作

从代码可以看到,申请100个连续堆内存需要在类型后面的[]里填入100,如果成功申请到内存后,将返回这段连续内存的第一个内存的内存地址,这时候需要用指针保存下来;而释放连续的堆内存需要使用delete[];最后为了防止误操作,将指针arr赋值为指针空值。

一般创建内存后都建议初始化,在申请内存的最后加上{},就是将申请后的内存里面的所有元素全部初始化为0

unsigned long long *arr = new unsigned long long[100]{};

也可以指定其他初始值:

unsigned long long *arr = new unsigned long long[100]{1, 233, 666};

上面的代码指明了,申请后的内存第一个元素初始化为1,第二个元素初始化为233,第三个元素初始化为666,其他剩余的元素都初始化为0

基础示例

以下看看完整的使用例子:

#include <iostream> // std::cout std::endl

long long sum(long long *arr, std::size_t number);

int main(void)
{
    long long *arr = new long long[100]{};
    std::cout << "这是一个求总和的程序" << std::endl;
    std::cout << "请输入你要求多少个数的总和(不能大于100):";

    std::size_t number;
    std::cin >> number;
    for (std::size_t i = 0; i < number; ++i)
    {
        std::cout << "请输入第" << (i + 1) << "个数:";
        std::cin >> arr[i];
    }
    std::cout << "这" << number << "个数的总和是:" << sum(arr, number) << std::endl;

    delete[] arr;
    arr = nullptr;

    return 0;
}

long long sum(long long *arr, std::size_t number)
{
    long long total = 0;
    for (std::size_t i = 0; i < number; ++i)
    {
        total += arr[i];
    }
    return total;
}

基础讲解

或许你之前经常看到我的例子里面使用了std::size_t,这个类型是专用用来保存连续内存的数量,所以它无符号整数。由于内存地址根据操作系统位数的不同而大小不同,所以std::size_t可以保存的范围也是随之改变的,即有可能是16位、32位、64位、128位。

上面代码中,先申请100个连续的堆内存并且全部元素初始化为0,然后提示用户输入要求和的数字的数量,然后循环将读取到的数据逐个写入连续内存中,然后通过求和函数求出所有数字的总和并输出,接着释放内存并清空指针。

我们的输入数量限制在100以内,当我们想保存比100更多的数量的时候,可以一开始申请更大的连续内存,但是如果输入更小的数量时,那么大的连续内存就很浪费了,这个也可以用类std::vector来解决。


Comments

Make a comment

  • Index

WARNING: You are using an old browser that does not support HTML5. Please choose a modern browser (Chrome / Microsoft Edge / Firefox / Sarafi) to get a good experience.