2017-03-17 11 views
0

なぜこの2行で異なるアドレスが出力されるのですか?C++のvector.begin()とvector [0]

vector<int> v1{ 12,2,34 }; 
printf_s("%d - 0x%p\n", v1[0], &v1[0]); 
printf_s("%d - 0x%p\n",*v1.begin(), v1.begin()); 

このアドレスの値は同じですが、アドレス自体は異なります。 同じ配列のコピーが2つあることを意味しますか?

EDIT:デバッグモードでは、異なるアドレスを出力し、リリースモードで同じアドレスがある:)

答えて

10

v1.begin()必ずしもv1[0]にアドレスされていない、std::vector<int>::iteratorを返します。実際には、printfを使用して、それをプリントアウトしようとすると、私に警告を与える:

警告:フォーマット「%のP」はタイプの引数は「ボイド*」期待しますが、引数3は「STDタイプがあります。 :ベクトル:: iterator`

あなたが特定の標準ライブラリの実装では、あなたの現在のコンパイルオプションstd::vector<int>::iteratorとするint*の別名であることを確認していない限り、比較は無意味です。ベクターオブジェクトv1の

+1

「&(* v1.begin()」と「&v1 [0]」は同じアドレスを出力します。 –

+1

@ Person.Junkieしかし、これはあなたの質問と同じではありません。 – deviantfan

2

&V[0]

オブジェクトV1の最初のエレメントのアドレスです。

イテレータを作成する場合は iterそのものがこのdocumentの説明のように他のオブジェクトです。

イテレータ:!++でインクリメントすることができ、ポインタのようなオブジェクト、 は*を間接参照し、と別のイテレータと比較=。

このリファレンスマニュアルがあなたの質問に詳しく答えることを願っています。

関連する問題