C/C++

【C/C++】ポインタをめちゃめちゃ丁寧に解説してみた!

C/C++のポインタについてまとめてみたいと思います。
ポインタはC/C++の学習でつまづきやすい所ですが、しっかりとポイントを抑えることで理解をすることができます。

ポインタ変数の使い方

 

ポインタ変数の使い方の基本

本来、変数は2つの値を持ちます

1つ目は普通の変数が持つような値
2つ目は変数のアドレス

1つ目はいいと思いますが、この2つ目のアドレスというのは、その変数を管理しているメモリの番号のことです。
図にするとこのようになります。

ポインタ変数でない、普通の変数は値を指します。
しかし、ポインタ変数はメモリ番号(アドレス)を指します。
それでは、このことを踏まえた上で、ポインタ変数の使用例を見ていきましょう。

宣言の仕方

ポインタ変数は以下のように宣言します。

例としてポインタ変数「num」を宣言しました。

変数へ値を代入する
それではこのポインタ変数に値を代入してみます。
先ほど、変数は2つの値を持つといいました。
なのでまずは単純な値を代入してみます。

このように、単純に値を代入したい場合は、「*(アスタリスク)」を先頭につける必要があります。
そうすることで、ポインタ変数がもつ、値(メモリ番号ではない)を参照することができます。
では次にアドレスを代入しましょう…とはなりません。
実はアドレスはこちらが操作することはできません。もちろん、参照をすることはできます。

アドレスを使った変数操作

ではこのアドレス情報はどのように役に立つのでしょうか。
その使用例を紹介します。

まずはポインタを使わなかったことでうまくいかなかった例から。

こちらのプログラムの例では、「result」という変数に「add」関数を用いて値を代入しようとしたのですが、上手くいきませんでした。
しかし、次のポインタ変数を使った例では、これを上手く解決することができます。

「add」関数の3つ目の引数をポインタにしたところ、「main」関数で定義した「result」変数の値もしっかり「30」になりました。
これがアドレス情報の使い方です。
ちなみに、プログラムを見ても分かる通り、普通の変数のアドレスを参照する場合は先頭に「&(アンド)」をつける必要があります。
ポインタ変数の場合は、ポインタ変数がそもそもアドレスを指しているため、必要ありません。(2重ポインタなどの場合は除く)。

では一体プログラムで何が起こったのでしょうか。
図にするとわかりやすいと思います。

どうでしょうか。アドレス情報というのは、変数を特定するための究極の情報であることがわかったと思います。

これがポインタの概念です。

アドレス情報があれば、変数へのアクセスがたやすくなり、プログラムも簡潔になります。
使っていくうちに使用感に慣れれば、ポインタがないと不便であると感じるようになります。

こちらの記事では、ポインタを応用した、関数ポインタという機能を解説しています。
ポインタの理解を深めたい方は是非読んでみてはいかがでしょうか。

ABOUT ME
IT系だんし
プログラミングが大好きな人。 趣味でゲームやツール製作をしながら、プログラミング記事を書き続けています。