C++のvectorとポインタ
46708 ワード
文書ディレクトリ一、vectorへのポインタ 1.&:スタックへのvector (1)形式 (2)局所変数自動放出 (3)誤り区分 2.New:スタック上のvector を指す(1)形式 (2)アクティブに解放されない限り、データは から消失しない.二、vectorを指すポインタ配列 1.p[i]:スタック上のvector を指す(1)形式 (2)局所変数自動放出 2.p[i]:スタック上のvector を指す(1)形式 (2)アクティブに解放されない限り、データは から消失しない.三、vector内はポインタ要素 である. 1.スタック 一、vectorへのポインタ
1.&:スタック上のvectorを指す
(1)形式
スタック上のvector変数を指し、スタック上の変数は{}範囲によって自動的に解放されます(いわゆるローカル変数).
対応するvectorのすべての5つの構造:
https://blog.csdn.net/sandalphon4869/article/details/94589399#1_15
など
(2)局所変数自動解放
p指向局所変数は括弧を出すと解放され、再び空を指すため、
(3)誤区分
例1
pは最初はスタック領域のvectorを指すが,その後はスタック上の変数を指す.
例2
これは実際には局所変数を指しています.pは最初はスタック領域を指すvectorであったが,その後指す局所変数は括弧を出して解放され,空を再び指す.
2.new:スタック上のvectorを指す
(1)形式
Newの方法は、スタック領域にデータメモリを割り当てることです.上のローカル変数とは異なり、deleteをアクティブに解放すると、データが消えます.
vector構造方法に対応する3つの構造.
(2)自発的に解放しない限り、データは消失しない
二、vectorを指すポインタ配列
フォーマット:
(1)形式
(2)局所変数自動解放
2.p[i]:スタック上のvectorを指す
(1)形式
vector構造方法に対応する3つの構造.
(2)自発的に解放しない限り、データは消失しない
三、vector内はポインタ要素
1.スタック
参照先: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
1.&:スタック上のvectorを指す
(1)形式
スタック上のvector変数を指し、スタック上の変数は{}範囲によって自動的に解放されます(いわゆるローカル変数).
対応するvectorのすべての5つの構造:
https://blog.csdn.net/sandalphon4869/article/details/94589399#1_15
#include
#include
using namespace std;
int main()
{
vector<int> k{ 1,2,3 };
//vector* 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
#include
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
#include
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
#include
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* p = new vector{1,2,3};
とは、ポインタが1つのnewを指していることを意味するので、vector* p;p=new vector{1,2,3};
と書くのも1つの意味です.vector構造方法に対応する3つの構造.
#include
#include
using namespace std;
int main()
{
//vector* p = new vector{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
#include
using namespace std;
int main()
{
//vector* p = new vector(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
#include
using namespace std;
int main()
{
//vector* p = new vector(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
#include
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 *p[5]
1.p[i]:スタック上のvectorを指す(1)形式
#include
#include
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* 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
#include
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構造方法に対応する3つの構造.
#include
#include
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
#include
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
#include
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