在 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