在 C++ 建立指標向量

Jinku Hu 2023年1月30日 2020年12月19日
  1. 使用 [] 符號在 C++ 中建立指標向量
  2. 使用 new 操作符在 C++ 中建立動態記憶體上的指標向量
  3. 使用 std::vector 容器在 C++ 中建立指標向量
在 C++ 建立指標向量

本文將介紹幾種在 C++ 中如何建立指標向量的方法。

使用 [] 符號在 C++ 中建立指標向量

由於指標型別可以很容易地修改,我們將在下面的例子中使用 int *來宣告指標的向量。另外,如果你需要一個通用的地址型別來儲存不透明的資料結構,我們也可以使用 void *指標,或者相反,使用一個指向自定義定義類的指標。

這個解決方案使用了一個 C 風格的陣列符號-[],它宣告瞭一個固定長度的陣列。它與常規陣列宣告類似,但在這種情況下,我們對訪問每個元素的地址感興趣。我們使用&(取址)運算子來訪問向量中的指標,並列印出來到控制檯。注意,這些記憶體地址位於堆疊記憶體上。

#include <iostream>
#include <vector>

using std::cout;
using std::vector;
using std::endl;

constexpr int WIDTH = 8;

int main()
{
    int *pointers_vec[WIDTH];

    cout << "pointers_vec addresses:" << endl;
    for(auto &i : pointers_vec) {
        cout << &i << endl;
    }
    cout << endl;

    return EXIT_SUCCESS;
}

輸出:

pointers_vec addresses:
0x7ffecd7a00d0
0x7ffecd7a00d8
0x7ffecd7a00e0
0x7ffecd7a00e8
0x7ffecd7a00f0
0x7ffecd7a00f8
0x7ffecd7a0100
0x7ffecd7a0108

使用 new 操作符在 C++ 中建立動態記憶體上的指標向量

另一方面,我們可以利用 new 操作符來建立一個在堆上動態分配的指標向量。

這種解決方案要求程式設計師在程式退出前釋放記憶體,否則,程式碼將受到記憶體洩漏的影響,這在長期執行的應用程式和資源受限的硬體環境中是一個巨大的問題。注意,我們使用 delete [] 符號來清理動態分配向量中的每個位置。

#include <iostream>
#include <vector>

using std::cout;
using std::vector;
using std::endl;

constexpr int WIDTH = 8;

int main()
{
    int *vector_of_pointers = new int[WIDTH];

    cout << "vector_of_pointers addresses:" << endl;
    for(int i = 0; i < WIDTH; ++i) {
        cout << &vector_of_pointers[i] << endl;
    }
    cout << endl;

    delete [] vector_of_pointers;
    return EXIT_SUCCESS;
}

輸出:

vector_of_pointers addresses:
0x2561c20
0x2561c28
0x2561c30
0x2561c38
0x2561c40
0x2561c48
0x2561c50
0x2561c58

使用 std::vector 容器在 C++ 中建立指標向量

std::vector 提供了豐富的功能,可以分配一個指標向量,並通過多個內建函式操作向量。該方法為執行時的新元素建立提供了更靈活的介面。注意,我們用 nullptr 值初始化向量元素,如下例所示。

#include <iostream>
#include <vector>

using std::cout;
using std::vector;
using std::endl;

constexpr int WIDTH = 8;

int main()
{
    vector<int *> vector_p(WIDTH, nullptr);

    cout << "vector_p addresses:" << endl;
    for(int i = 0; i < WIDTH; ++i) {
        cout << &vector_p[i] << endl;
    }
    cout << endl;

    return EXIT_SUCCESS;
}

輸出:

vector_p addresses:
0x1255c20
0x1255c28
0x1255c30
0x1255c38
0x1255c40
0x1255c48
0x1255c50
0x1255c58
Author: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn

相關文章 - C++ Pointer