ポインタと参照の違いとは?C++での違いや使い分けをプログラマーがわかりやすく解説
ポインタと参照の特徴、速度は?使い分けは?
image by iStockphoto
ポインタと参照の違い、関数での使い分けについて見てきましたが、実際の違いはどうなのでしょう。簡単に両者を比較します。
ポインタ渡しと参照渡し、どちらが速い?
ポインタ渡しと参照渡し、スピードに違いがあるのでしょうか。その前に値渡しです。値渡しは変数の中の値をコピーするので時間がかかります。数値1つだけであれば大きな違いはありませんが、複雑なクラスでは時間がかかります。
一方、実際に計測してもポインタ渡しと参照渡しは大きな違いはないようです。スピードからどちらかを選ぶという必要性はありませんね。
ケース別、ポインタ渡しと参照渡しの使い分け
スピードに違いがないのであれば、どのように使い分けるのでしょう。まず、プリミティブ型の場合です。関数の中で変更を元の変数に影響しないようにする場合は値渡しを使います。一方、関数の中での変更を反映したい場合はポインタ渡しか参照渡しです。どちらでも良いのですが、迷った場合には参照渡しを使いましょう。その理由は後で説明します。
クラスの場合は参照渡しを使うことが多いです。ポインタ渡しは使わないようにしましょう。
ポインタは危ない?nullとは何か
C++言語や元になったC言語ではポインタがありますが、ポインタは難しいとか危ないと聞いたことはないですか。実はポインタの扱いには注意が必要なのです。
例えば、大きさ5の配列をポインタを使ってアクセスした場合、6番目の値にアクセスできてしまいます。もちろん、大きさ5なので、6番目はありませんのでエラーです。ポインタは指す先を自由に変更できる分、正しい場所を指しているか注意が必要なのですね。
また、ポインタがどこも指していないことを示す「null」というものがあります。このnullの先の値を見てしまうとエラーです。このようにポインタを使う場合、その指している先がnullなのかどうかを常に意識する必要があります。参照は必ず何かの変数を指しており、また指す先を変更できないので、nullやアクセスできないところを指してしまう心配はありません。ポインタの良い点を残しつつ改良したのが参照なのです。
C++以外のポインタと参照
ポインタには危ない部分もあるので、他の言語ではポインタがないものも多いです。例えば、C++から発展したJava言語にはポインタはありません。一方、マイクロソフトが開発したRust言語やGoogleが開発したGo言語にはポインタがあります。ただ、これらの言語ではポインタを渡すことを「参照渡し」と呼ぶので注意が必要です。
同じ用語で似たような概念でもプログラミング言語によって考え方に違いがあります。他の言語で似たような言葉が出てきた場合、同じだろうと考えずに確認してください。
こちらの記事もおすすめ

3分でわかる「Java」と「JavaScript」の違い!何で似た名前なの?文法や用途の違いも現役エンジニアがわかりやすく解説
\次のページで「ポインタはメモリ内の場所を示す、参照は変数の別名、用途に応じて使い分けよう」を解説!/


