質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

3916閲覧

C++のポインタと参照

RabbitFoot141

総合スコア8

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2015/04/06 22:34

C++でポインタと参照の違いはなんですか??

またどういった点で使い分けますか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

参照のメリットをひとつ。

例えば、巨大な構造体やオブジェクトを引数に取る関数の場合、そのまま渡すと値渡しとなりコピーのコストが発生して遅くなるので、ポインタを引数にするとアドレスのみのコピーとなり速くなります。しかしポインタはあくまでメモリアドレスなので、元の構造体にアクセスする場合は間接演算子(*)を用いなければなりません。そこで参照を使うと、ポインタの利点はそのまま、まるで元の構造体をそのままアクセスしているように使うことが出来るのです。

投稿2015/04/06 23:33

naga3

総合スコア1293

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

値を書き込みたい、取得したいという目的は、変数でもポインタでも同じですよね。
でも実際にコードにしようと思うとこの書き方はそれぞれ違ってきてしまいます。

lang

1int a = 10; 2int *p = &a; 3 4a = 1; // どちらも int a で確保したメモリに書き込みたい点では同じ 5*p = 2; // でも両者の書き方にはなんでかブレが…

この両者の記法の違いを、「参照」を使って埋めてあげることができます。

lang

1int &b = a; // 参照を使うと変数とポインタを以降同じように扱うことができます。 2int &c = *p; 3 4b = 3; // そのまま扱うとブレていた記法が一つになりました。 5c = 4;

先のお二人が使い分けについては回答していなかったので、私はそこを補足したいと思います。

参照渡しの利点は naga3 さんの言った通りです。
参照を利用するのは多くの場合、関数の値渡し回避になると思います。
でも、値渡しを回避するためだけならポインタを使えば回避できますますよね。

そこで、何故参照渡しをするのかは、以下のサンプルを見てもらえばわかると思います。

lang

1struct T; 2void show(const T &t); // コピーするコストが高い時は参照渡しにしよう 3void show2(T t); // でも、コピーコストが低いなら値渡しでもいいね…? 4void edit(T *t); 5 6T t; 7show(t); // 参照渡しでも値渡しでも、これなら関数の扱い方は一緒だ 8show2(t); // 参照渡しなのか、値渡しなのかは関数を作った人が考えることができる 9edit(&t);

私の場合以下のように使い分けています。

中の値を書き換えない場合(コピーコスト:高) → 参照渡しfunc(const T &t)
中の値を書き換えない場合(コピーコスト:低) → 値渡しfunc(T t)
中の値を書き換える場合 → ポインタ渡しfunc(T *t)

上の例では、「edit」が値を書き換える場合に相当します。
ポインタ渡しは最初「引数で渡された値を変更するために使う」と習いませんでしたか?
とすると、ここでも同じように使い分けたら意図が伝わりやすそうですよね。

投稿2015/04/16 06:52

haru666

総合スコア1591

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

簡単に言えば、ポインタを少し安全にしたものが参照です。
ポインタは、機械語レベルのメモリアドレスを指すための道具です。C言語では、配列はメモリ上の連続した空間に確保されますので、ポインタ操作を通じて連続的にアクセスすることができます。
参照は、任意の変数ないしオブジェクトへのポインタです。ポインタはアドレスそのものなのでインクリメントすることで連続したメモリ空間にアクセスすることができますが参照は、指している変数ないしオブジェクトの場所から動かすことができません。

端的に言えば、連続的なメモリ空間にアクセスする必要があるならポインタを使い、そうでないなら参照を使うということになります。

突っこんで言えば、もっともっと沢山のことが言えますが、とりあえず。

投稿2015/04/06 23:07

chokojori

総合スコア971

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問