文章目录
一、指向vector的指针
1.&:指向栈上的vector
(1)形式
指向一个栈上的vector变量,栈上的变量会因为{}范围的不同而被自动释放(所谓的局部变量)。
对应vector的所有的五种构造:
https://blog.csdn.net/sandalphon4869/article/details/94589399#1_15
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> k{ 1,2,3 };
//vector<int>* p=&k;
vector<int>* p;
p = &k;
for (int i = 0; i < p->size(); i++)
{
cout << p->at(i) << ' ';
}
//1 1 1
return 0;
}
等等
(2)局部变量自动释放
因为p指向局部变量出了括号就被释放,重新指向空,所以p->size()=0
(分开初始化的形式才会出现局部变量被释放的问题)
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int>* p;
{
vector<int> k{ 1,2,3 };
p = &k;
}
for (int i = 0; i < p->size(); i++)
{
cout << p->at(i) << ' ';
}
//什么输出也没有
return 0;
}
(3)区分误区
示例1
p虽然一开始是指向堆区的vector的,但之后指向栈上的变量
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int>* p = new vector<int>{ 1,2,3 };
vector<int> k{ 4,5,6 };
p = &k;
for (int i = 0; i < p->size(); i++)
{
cout << p->at(i) << ' ';
}
//4 5 6
//不是1 2 3
return 0;
}
示例2
这样其实还是指向局部变量的。
p虽然一开始是指向堆区的vector的,但之后指向的局部变量出了括号就被释放,重新指向空
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int>* p = new vector<int>{ 1,2,3 };
{
vector<int> k{ 4,5,6 };
p = &k;
}
for (int i = 0; i < p->size(); i++)
{
cout << p->at(i) << ' ';
}
//什么输出也没有
return 0;
}
2.new:指向堆上的vector
(1)形式
new的方式是在堆区上的分配数据内存,不同于上面的局部变量,当你主动释放delete,数据才会消失。
vector<int>* p = new vector<int>{1,2,3};
的意思是指针指向一个new出来的,所以写成vector<int>* p;p=new vector<int>{1,2,3};
也是一个意思。
对应vector构造方法的三种构造。
#include <iostream>
#include <vector>
using namespace std;
int main()
{
//vector<int>* p = new vector<int>{1,2,3};
vector<int>* p;
p = new vector<int>{ 1,2,3 };
for (int i = 0; i < p->size(); i++)
{
cout << p->at(i) << ' ';
}
//1 2 3
return 0;
}
#include <iostream>
#include <vector>
using namespace std;
int main()
{
//vector<int>* p = new vector<int>(3);
vector<int>* p;
p = new vector<int>(3);
for (int i = 0; i < p->size(); i++)
{
cout << p->at(i) << ' ';
}
//0 0 0
return 0;
}
#include <iostream>
#include <vector>
using namespace std;
int main()
{
//vector<int>* p = new vector<int>(3,1);
vector<int>* p;
p = new vector<int>(3,1);
for (int i = 0; i < p->size(); i++)
{
cout << p->at(i) << ' ';
}
//1 1 1
return 0;
}
(2)除非主动释放,数据不会消失
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int>* p;
{
p = new vector<int>{ 1,2,3 };
}
for (int i = 0; i < p->size(); i++)
{
cout << p->at(i) << ' ';
}
//1 2 3
return 0;
}
二、指向vector的指针数组
格式:vector<int> *p[5]
1.p[i]:指向栈上的vector
(1)形式
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> a{ 1,2,3 }, b{ 4,5,6 }, c{7,8,9,10};
//写法1
vector<int>* p[3] = { &a,&b,&c };
/*
//写法2
vector<int>* p[3];
p[0] = &a, p[1] = &b, p[2] = &c;
*/
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < p[i]->size(); j++)
{
cout << p[i]->at(j) << ' ';
}
cout << endl;
}
/*
1 2 3
4 5 6
7 8 9 10
*/
return 0;
}
(2)局部变量自动释放
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int>* p[3];
{
vector<int> a{ 1,2,3 }, b{ 4,5,6 }, c{ 7,8,9,10 };
p[0] = &a, p[1] = &b, p[2] = &c;
}
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < p[i]->size(); j++)
{
cout << p[i]->at(j) << ' ';
}
cout << endl;
}
//空
return 0;
}
2.p[i]:指向堆上的vector
(1)形式
对应vector构造方法的三种构造。
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int>* p[3];
p[0] = new vector<int>{ 1,2,3 };
p[1] = new vector<int>(3);
p[2] = new vector<int>(4, 1);
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < p[i]->size(); j++)
{
cout << p[i]->at(j) << ' ';
}
cout << endl;
}
/*
1 2 3
0 0 0
1 1 1 1
*/
return 0;
}
(2)除非主动释放,数据不会消失
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int>* p[3];
{
p[0] = new vector<int>{ 1,2,3 };
p[1] = new vector<int>(3);
p[2] = new vector<int>(4, 1);
}
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < p[i]->size(); j++)
{
cout << p[i]->at(j) << ' ';
}
cout << endl;
}
/*
1 2 3
0 0 0
1 1 1 1
*/
return 0;
}
三、vector内是指针元素
1.栈
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int*> v;
{
int a = 1, b = 2, c = 3;
v.push_back(&a);
v.push_back(&b);
v.push_back(&c);
}
for (int i = 0; i < v.size(); i++)
{
cout << *v[i] << ' ';
}
//1 2 3
return 0;
}
参考:
https://blog.csdn.net/zjc_game_coder/article/details/52609902
https://blog.csdn.net/s9434/article/details/51052029#commentBox
http://www.cppblog.com/lshain/articles/149664.html