🌻天国にいけるC++言語入門🌻 進化し続けるオブジェクト指向プログラミング ver3.2307
vector<int>型のオブジェクトaのメンバ関数a.begin()が実行されると戻り値として最初にメモリに格納された数値データを格納しているメモリのアドレスが返されます
vector<int>型のオブジェクトaのメンバ関数a.begin()が実行されると戻り値として最初にメモリに格納された数値データを格納しているメモリのアドレスが返されます
つづきで~す
int(イント)「マックスは今日も好調ね」
次のプログラムをご覧ください
👇
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> a{ 1,2,3 };
vector<int>::iterator itr = a.begin();
cout << *itr << "\n";
cout << *(itr+1) << "\n";
cout << *(itr+2 )<< "\n";
return 0;
}
プログラムの実行結果
1
2
3
vector<int>::iterator itr = a.begin();
は
vector<int>::iterator itr;
itr= a.begin();
のように分けて記述することができます
solarplexussより
マックス「
vector<int>::iterator itr = a.begin();
の
vector<int>::iterator itr
で
イテレータitrが生成されているが
a.begin()
ってなんだ?」
ソーラー「aのvector<int>型のオブジェクト宣言
vector<int> a{ 1,2,3 };
の実行により
メモリに
連続した数値データ
1
2
3
が格納されていますが
このとき
vector<int>型のオブジェクトaのメンバ関数
a.begin()
も生成されていて使用できるようになります
つまり
クラスvector<int>のメンバ関数には
begin関数が設定されていたわけです
a.begin();
が実行されると
vector<int> a{ 1,2,3 };
の実行により
メモリに最初に格納された
数値データ
1
を格納しているメモリのアドレス
が
a.begin()に戻り値として返されます
つまり
vector<int>::iterator itr = a.begin();
が実行されると
ポインタ変数の役割を果たす
イテレータitrに数値データ
1
を格納しているメモリのアドレスが格納されます
ですので
*itr
は
数値データ1を表すことになるので
cout << *itr << "\n";
が実行されると
コマンドプロンプト画面に
1が表示されることになります
めでたし
めでたし
いや~よかったね
begin関数の使い方も分かったね」
マックス「
cout << *(itr+1) << "\n";
が実行されると
2
が表示されるのが
微妙にわっかんな~いなあ」
ソーラー「そこです
vector<int> a{ 1,2,3 };
が実行されると
数値データ1
数値データ2
数値データ3
はメモリに格納されることになるのですが
数値データ1
を格納しているメモリと
数値データ2
を格納しているメモリと
数値データ3
を格納しているメモリは
連続して並んでいるメモリになっているんです
たとえば
数値データ1
を格納しているメモリが
00FFFA60
なら
数値データ2
を格納しているメモリは
00FFFA64
数値データ3
を格納しているメモリは
00FFFA68
になります
もう少し詳しく説明すると
数値データ1
は
メモリに
00000000 00000000 00000000 00000001
👆 👆 👆 👆
8ビット 8ビット 8ビット 8ビット
数値データ2
は
メモリに
00000000 00000000 00000000 00000010
👆 👆 👆 👆
8ビット 8ビット 8ビット 8ビット
数値データ3
は
メモリに
00000000 00000000 00000000 00000011
👆 👆 👆 👆
8ビット 8ビット 8ビット 8ビット
と格納されることになりますが
これらのデータは
アドレス
00FFFA60
00FFFA61
00FFFA62
00FFFA63
00FFFA64
00FFFA65
00FFFA66
00FFFA67
00FFFA68
00FFFA69
00FFFA6A
00FFFA6B
のメモリに
00000001
00000000
00000000
00000000
00000010
00000000
00000000
00000000
00000011
00000000
00000000
00000000
と格納されることになります」
てんC「
数値データ1
と
数値データ2
と
数値データ3
が
仲良く並んで
メモリに格納されているのですね」
ソーラー「そうなんです
そして
イテレータitr
に数値データ
1
を格納しているメモリのアドレス
00FFFA60
が格納されると
イテレータ(itr+1)
に数値データ
2
を格納しているメモリのアドレス
00FFFA64
が格納されることになります
イテレータ(itr+2)
には数値データ
3
を格納しているメモリのアドレス
00FFFA68
が格納される格納されることになります
マックス「ははあ~ん
イテレータitr
に数値データ
1
を格納しているメモリのアドレス
00FFFA60
が格納されていると
イテレータ(itr+1)
には
00FFFA61
ではなく
00FFFA64
が格納されることになるってわけだ
00FFFA64は
数値データ2を格納しているメモリの先頭のアドレスなので
*(itr+1)
は
数値データ
2
をあらわすことになり
cout << *(itr+1) << "\n";
が実行されると
2
が表示されることになるわけだ
そういや
配列宣言
int hairetu[3]={1,2,3};
を実行して
メモリに
数値データ
1
2
3
を格納したときも
数値データ1
は
メモリに
00000000 00000000 00000000 00000001
👆 👆 👆 👆
8ビット 8ビット 8ビット 8ビット
数値データ2
は
メモリに
00000000 00000000 00000000 00000010
👆 👆 👆 👆
8ビット 8ビット 8ビット 8ビット
数値データ3
は
メモリに
00000000 00000000 00000000 00000011
👆 👆 👆 👆
8ビット 8ビット 8ビット 8ビット
と格納されることになり
これらのデータは
たとえば
アドレス番号
01FFFA70
01FFFA71
01FFFA72
01FFFA73
01FFFA74
01FFFA75
01FFFA76
01FFFA77
01FFFA78
01FFFA79
01FFFA7A
01FFFA7B
のメモリに
00000001
00000000
00000000
00000000
00000010
00000000
00000000
00000000
00000011
00000000
00000000
00000000
と格納されることになったよな
そして
ポインタ変数
hairetu
hairetu+1
hairetu+2
は
アドレス
01FFFA70
01FFFA74
01FFFA78
を格納するポインタ変数となったが
そのときも
ポインタ変数hairetu+1
は
アドレス01FFFA71
ではなく
アドレス01FFFA74
を格納することになった
それと
まったく同じ仕組みってわけなんだな」
= a.begin(); みつかっちゃった💦
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます