You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

vector<int*>与vector<int>*的区别及vector<plate*>元素访问咨询

关于vector指针两种写法的区别与使用方法

先给你掰明白vector<int*> a和vector<int> *a这俩的核心区别:

1. 两种写法的本质差异

  • vector<int*> a:这是一个装着int指针的vector容器。你可以把它看成是一个“指针数组”,容器本身是实体,里面每一个元素都是指向int类型变量的指针。
  • vector<int> *a:这是一个指向vector容器的指针。也就是说a本身是个指针,它指向的是一个完整的、正常的vector对象——相当于你先有一个vector,再用指针去“指着”它。

举两个实际例子帮你理解:

对于vector<int*> a:

int num1 = 5, num2 = 10;
vector<int*> a;
a.push_back(&num1); // 把num1的地址存进容器
a.push_back(&num2);

// 访问元素:先拿到容器里的指针,再解引用
cout << *a[0] << endl; // 输出5
*a[1] = 15; // 修改num2的值为15

对于vector<int> *a:

vector<int> b = {1, 2, 3};
vector<int> *a = &b; // 让a指向b这个vector

// 访问元素:先解引用指针拿到vector,再用[]访问
cout << (*a)[0] << endl; // 输出1
// 也可以用箭头调用vector的成员函数
a->push_back(4); // 给b添加元素4,此时b变成{1,2,3,4}

2. 关于你用vector<plate*> A的操作问题

你写的plate p; vector<plate*> A; A.push_back(&p);是把p的地址存进了容器,但这里有个重要的坑:如果p是局部变量(比如在函数里定义的),当这个函数执行完,p会被销毁,容器里的指针就变成了“野指针”,再访问会直接出问题!如果p是全局变量或者动态分配的,就不用担心这个问题。

操作容器里的plate对象的方法:

假设plate类有成员变量int width;和成员函数void setWidth(int w);,你可以这样操作:

单个元素操作:

// 方法1:先解引用指针,再访问成员(有点繁琐)
(*A[0]).width = 20;
(*A[0]).setWidth(20);

// 方法2:用箭头运算符(更常用、更简洁)
A[0]->width = 20;
A[0]->setWidth(20);

遍历所有元素操作:

// 范围for循环遍历每个指针
for (plate* ptr : A) {
    ptr->width = 30;
    ptr->setWidth(30);
}

// 或者用迭代器
for (auto it = A.begin(); it != A.end(); ++it) {
    (*it)->width = 30;
    (*it)->setWidth(30);
}

额外提醒:避免野指针的正确做法

如果要存指针到vector里,更安全的方式是动态分配对象,用完记得释放内存避免泄漏:

vector<plate*> A;
A.push_back(new plate()); // 动态分配plate对象

// 使用完后释放内存
for (auto ptr : A) {
    delete ptr;
}
A.clear();

内容的提问来源于stack exchange,提问作者jofri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:16:22