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
相关产品推荐
相关产品推荐

