対象者
c/c++でif文等の制御文を理解していて
ポインタって難しいらしいぞ。。。
「*,&」みたいなマークめっちゃ見るけどよくわかってないまま使ってる。。。
って感じの人たち
値型
画像1(メモリ上の値は実際には2進数ですが、16進数で省略表記)
ポインタの理解に困ってる人あるあるなのですが、そもそも値型が曖昧になっていることが多いので簡単に説明します。(アドレスとポインタの違いがわかる方は飛ばしていただいて問題無いと思います。)
プログラム上で使用される全ての値は、画像1のようにメモリという物理装置に格納されます。
見てわかるとおり 変数 i,f は 同じ値(0001) ですが、プログラム側で使用する際は型という情報が与えられプログラム上での値は int と float とで異なっています。
値型のまとめ
- 値はメモリというものに保存される。
- どの型として読み取るかで全く別の物になるというもの。
ポインタ型
画像2
値型のところでは省略しましたが、メモリには アドレス という1byteずつに振られた目印が存在します。
現実で言うところの 家(値) と その住所(アドレス) のような関係だと考えてもらえればわかりやすいかもしれません。
そして、その アドレス(0x????)を値として保持する型を〇〇ポインタといいます。
(〇〇はそのアドレスに格納されている変数の型です。)
画像2を見ると、変数 ip は変数 i のアドレスを値として保持しているのがわかると思います。
ポインタの宣言
「型*」(* : アスタリスク)
// intを参照するポインタの宣言
int* ip; // intポインタ
ポインタ型もただの型 なのでポインタのポインタを宣言することも可能。
ポインタのポインタを ダブルポインタ といったりします。
int** ipp; // intのダブルポインタ
// ↑と同じ意味
using IntP = int*; // intポインタ型を定義
IntP* = ipp2; // intポインタ型のポインタ
インスタンスからのアドレスの取得
「&変数」(& : アンパサンド)
int i;
int* ip = &i;
ポインタの値が指す アドレス に存在する値の取得
「*ポインタ変数」
// i をポインタを通して i2 に代入。
int i;
int* ip = &i;
int i2 = *ip
参照型
参照型は本質的にはポインタと同じくアドレスを保持する型です。
違いはポインタが参照先を変更出来るのに対して、参照型は初期化時以外で参照先を変えることができません。つまりconstポインタ型のようなものです。
また、コーディングも大きく異なり下のようになります。
参照型の宣言と代入
「型& 変数名 = 参照先変数」
参照型は初期化時のみ代入が可能な為、宣言時やメンバ初期化時に代入する必要があります。
int i;
int& ref = i; // &iとする必要はない。
参照型からの値の取得
「参照型変数」(通常の変数と同様の記述のみ)
int i;
int& ref = i;
// 値取得時も *ref 等の特別な記述をする必要がない。
int i2 = ref;
逆引き「*, &」記号の使い方
「 * 」(アスタリスク)
- ポインタ型宣言
- [ポインタから参照先の値を取得](#ポインタの値が指す アドレス に存在する値の取得)
「 & 」(アンパサンド)
※ 特にアンパサンドは紛らわしいので気をつける!!!
次のc++erへの道
- const Type&は特殊な型なので少し調べると面白いかも
- new delete によるインスタンスの生成、破棄。