ポインタと参照の違いとは?C++での違いや使い分けをプログラマーがわかりやすく解説
関数の「値渡し」と「ポインタ渡し」の違い
関数に引数を渡すときに、その値をコピーして渡すのが「値渡し」です。プログラミング言語によって引数の渡し方は違いますが、C++言語では何も指定しなければ値渡しになります。値渡しの場合、コピーを渡すので関数の中で引数を変更しても元の変数には影響しません。
一方、ポインタ渡しでは変数の値ではなくポインタを渡します。ポインタは変数のある場所を示す矢印ですね。そのため、関数の中でポインタの指す先を変更すると、元の変数の値も変わってしまいます。値渡しは変数の中の値だけ渡し、ポインタ渡しは変数そのものを渡す、と考えてください。
ポインタ渡しと参照渡しの違い
関数には参照を渡すこともできます。参照も変数の場所を指す矢印だと説明しました。では、ポインタ渡しと参照渡しは何が違うのでしょう。どちらも変数そのものを渡している、という点は同じです。ただし、そのために使うのがポインタか参照かの違いがあります。それでは、もう少しポインタと参照の違いを見てみましょう。
配列とポインタ
ポインタと参照の違いとして、ポインタは指している先を変更できる、参照はできないと説明しました。その違いが一番関係するのが配列とポインタです。
配列とはある値を入れる箱を複数並べたもの。普通の変数が一軒家とすれば、配列はマンションやアパートです。普通の変数には1つの値しかしまえませんが、配列は部屋の数だけ値をしまうことができます。マンションの住所は1つですが、どの部屋を示すかを「○号室」と指定しますよね。これが添字です。配列の先頭を指すポインタをずらしていくとそれぞれの部屋を指すように変更できます。このように配列とポインタは深い関係があります。実際のプログラム例を以下に示します。
#include <iostream>
using namespace std;
int main(void){
int array[5]; // 大きさ5の配列
for (int i = 0; i < 5; i++) {
array[i] = (i + 1) * 2; // 配列arrayを初期化(2, 4, 6, 8, 10)
}
cout << array[1] << endl; // 2番目の値「4」を出力
int *pointer = array; // arrayの先頭を指すポインタ変数pointerを宣言
cout << *(pointer + 4) << endl; // array[4]と同じ意味。5番目の「10」を表示
}
クラスと参照
C++の変数には数値や文字などの種類があります。これがデータ型。データ型にもいろいろありますが、大きく分けるとプリミティブ型と参照型があります。数字や文字はプリミティブ型、クラスは参照型です。クラスとはデータや関数をまとめたもののことをいいます。
変数の参照はプリミティブ型の変数にも使えますが、クラスとの関係が深いものです。クラスから作った変数(インスタンス)を関数に渡す際には参照を使います。これが参照渡し。クラスを関数に渡す場合に、値渡しも使うことができます。しかし、通常クラスに使うのは参照渡しです。
こちらの記事もおすすめ

インスタンスとオブジェクトの違いとは?クラスとの関係は?違いや注意点もプログラマーがわかりやすく解説
\次のページで「ポインタと参照の特徴、速度は?使い分けは?」を解説!/


