ポインタ
- int* a
- 変数 a の中身はアドレスを示す。
- ポインタ変数 *a はアドレス(aの値)のメモリの値をポインタ変数(*a)として扱う事ができる。
- *a=1; はaの値(アドレス)のメモリに1を代入する。aの値が100の場合、アドレス100の番地に1を代入する。*(100) = 1。
- a=1 と *(&a)=1と等価。
- オブジェクトからクラスメンバにアクセスする場合にはドット演算子「 . 」 を使う。
- ポインタからクラスメンバにアクセスする場合にはアロー演算子「 -> 」を使う。
- 関数へ引数にポインタ渡しする場合にはアドレス演算子「 & 」を使う。
ローカル変数のポインタを戻り値として返す場合
以下のプログラムは正しく動作しない。 return文が返している str は、自動記憶域期間を持つローカル変数ですから、 関数から抜け出してしまった後は、もうメモリ上に残っている保証がない。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
#include <stdio.h> #include <assert.h> char* getString(int max); int main(void) { char* str; str = getString( 5 ); puts( str ); /* 受け取った文字列を出力 */ return 0; } /* 標準入力から max以下の文字数の文字列を受け取る。 引数: max: 最大文字数。1~255 戻り値: 受け取った文字列。 */ char* getString(int max) { char str[256]; assert( 1 <= max && max <= 255 ); printf( "%d文字以内の文字列を入力して下さい。\n", max ); fgets( str, max+1, stdin ); /* 改行文字のことを考えて +1 */ return str; } |
基底クラスのポインタを使って派生クラスを動的に確保して受け取ったりする
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
//基底クラス 動物なら、鳴くことができるはず struct animal{ virtual void cry()=0; }; //犬用派生クラス 当然、鳴き声はワンワン struct dog: public animal{ void cry()override{std::cout<<"bow wow";} }; //猫用派生クラス 当然、鳴き声はニャー struct cat: public animal{ void cry()override{std::cout<<"meow";} }; int main(){ bool LikeDog; animal* Animal; //犬好きかどうかのフラグに応じて、Animalを作り分ける。 if(LikeDog){ Animal = new dog(); }else{ Animal = new cat(); } //鳴いてもらう Animal->cry(); delete Animal; } |
参考にさせて頂いたページ
・それ、ポインタ使わなくてもできるよ:C言語のポインタとC++の流儀