【C++入門】ポインタとか(あるいはポインタからJAVAのコペルニクス的転回を理解する)

今回のC++学習では、ポインタにじっくり取り組んでみた。

いろいろコード書いて動きを確かめながら、ポインタとは何か大体理解できたと思う。

JAVAからC++に移行した人だけのために、JAVAでの用語を交えながら簡単に定式化したいと思う。

JAVAからC++に移行する人って結構ニッチな気もするがわはは。

C++の世界では、変数の実態とは、値とその値が格納されたメモリ上のアドレスのセットである、と。

※メモリ上のアドレス≒JAVAで言うところの参照としておこう

ポインタとは、変数の特殊な型の一種で、上記のメモリ上のアドレスのみを格納する型である。

ポインタはメモリ上のアドレスしか指していないため、そのアドレスに格納された値を取り出すには、ポインタ型変数名の前に*(アスタリスク)をつけてやる必要がある。

たとえば…

int a = 10;
//p_aはポインタ。aのアドレスが入っている
int* p_a = &a;
cout << "aのアドレス:" << (size_t) p_a << endl; //p_aはポインタなので、値を見るためには変数名に*をつける cout << "アドレスに格納された値:" << *p_a << endl;

このあたりが、ポインタを難しくしている要因のひとつである。

JAVAにはポインタはない。プリミティブ型の変数とクラス変数の二種類のみだ。

つまり、JAVAはC++の変数の扱い方を制限して、int や char などのプリミティブな変数は値のみを、クラス変数は参照のみを指すように制限を加えたのだ。

そして、JAVAが賢いのは、クラス変数は参照を指しているにもかかわらず、普通の変数のように扱えることだ。

そのためにJAVAでは、C++のようにポインタのポインタという複雑な変数は扱えない。

ただし、そういったトリッキーな仕組みがなくても、プログラムが組めることは、JAVAの歴史が証明したといっていい。

ところで、もうひとつC++のポイント周りでややこしいやつがいる。

&のついた型宣言である。

&つきで宣言された変数は、他の変数のアドレス(つまり参照)で初期化する必要がある。

しかし、初期化された後では、通常の変数と同じように(アドレスではなく)値の読み書きが可能となる。

ただし、値を書き換えると、変数を初期化するときに使った他の変数の値も同時に書き換わる。

というか、この変数は別の変数の参照なのである。

振る舞い的には、finalで宣言されたJAVAのクラス変数に近い。

もっと簡単に言おう。

&付きで宣言された変数は、別の変数のシノニムなのだ。

以上。

【その他のTips】
■ アドレスをログに出力する場合、(size_t) でキャストすると符号なし10進数で表示できる。
たとえば、変数・配列・関数のアドレスをログに表示するのはそれぞれこんな感じ。
cout << "変数: " << (size_t)&a << endl; cout << "配列: " << (size_t)arr << endl; cout << "関数: " << (size_t)Foo << endl; ■ 関数の引数にクラスを使用しても、&をつけなければ値渡し(インスタンスのコピー)となる。(びっくり) JAVAから入るとこの辺ちょっと驚いた。初めて目にしたときは信じられなかったので、実際にコードを書いて動かしてみた。 たしかに、クラスの参照ではなく、インスタンスのコピーを渡しているようだ。(改めてびっくり) こんなん、引数にクラス渡す場合って、たいがい参照渡しにきまってるやんけ、そのたびに&つけないとだめなのね。 めんどくさー。 [amazonjs asin="4839926050" locale="JP" title="ロベールのC++入門講座"]

5年前

コメントを残す

メールアドレスが公開されることはありません。