C++入門教程(五十):連續的堆內存

小古銀的官方網站(完整教程):http://www.xiaoguyin.com/
C++入門教程視頻:https://www.bilibili.com/video/av20868986/

目錄

指針的用途三:保存申請連續堆內存後返回的地址。這個用途應該用容器庫裏的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來解決。

發佈了86 篇原創文章 · 獲贊 125 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章