C++でポインタと参照の違いはなんですか??
またどういった点で使い分けますか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
ベストアンサー
参照のメリットをひとつ。
例えば、巨大な構造体やオブジェクトを引数に取る関数の場合、そのまま渡すと値渡しとなりコピーのコストが発生して遅くなるので、ポインタを引数にするとアドレスのみのコピーとなり速くなります。しかしポインタはあくまでメモリアドレスなので、元の構造体にアクセスする場合は間接演算子(*)を用いなければなりません。そこで参照を使うと、ポインタの利点はそのまま、まるで元の構造体をそのままアクセスしているように使うことが出来るのです。
投稿2015/04/06 23:33
総合スコア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
総合スコア1591
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
簡単に言えば、ポインタを少し安全にしたものが参照です。
ポインタは、機械語レベルのメモリアドレスを指すための道具です。C言語では、配列はメモリ上の連続した空間に確保されますので、ポインタ操作を通じて連続的にアクセスすることができます。
参照は、任意の変数ないしオブジェクトへのポインタです。ポインタはアドレスそのものなのでインクリメントすることで連続したメモリ空間にアクセスすることができますが参照は、指している変数ないしオブジェクトの場所から動かすことができません。
端的に言えば、連続的なメモリ空間にアクセスする必要があるならポインタを使い、そうでないなら参照を使うということになります。
突っこんで言えば、もっともっと沢山のことが言えますが、とりあえず。
投稿2015/04/06 23:07
総合スコア971
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。