[ad_1]
私は C++ での参照について学んでいて、ポインターでも同じことができることに気付きました。
参照して:
int hello(int& hello) { return hello; } int main() { cout << "enter a num: "; int num; cin >> num; cout << num << endl; hello(num); cout << endl; cout << *num; }
出力:
12
12
ポインター付き:
int hello(int* hello) { return *hello; } int main() { cout << "enter a num: "; int *num = new int; cin >> *num; cout << *num << endl; hello(num); cout << endl; cout << *num; }
出力:
12
12
私の質問:
どちらも同じこと (変数の別名) を行うのに、なぜポインタよりも参照を使用するのでしょうか?
私が試したこと:
調べてみましたが、何も見つかりません
解決策 1
参照パラメーターは、ユーザーに次のことを伝えます。 nullptr
は無効ですが、ポインタ パラメータは そうかもしれない 許す。
参照を使用すると、次のように書くこともできます parameter.whatever
、一方、ポインターには追加の文字が必要です。 parameter->whatever
. それは一部の人にとっては大したことです! 🙂
しかし、参照が「私は受け入れません」と言っているにもかかわらず、 nullptr
“、まだ取得できるため、防弾コードを含める必要があります if(&ref != nullptr)
.
編集: コードに含める必要があります cout << hello(num)
あなたの主張をよりよく示すために。 現状では、 hello(num)
何もしていないので main
返されるものを無視します。
解決策 5
主な違いは、ポインターは通常、ヒープに割り当てられたメモリ (構造体やオブジェクトなど) を指し、参照はほとんどがスタックからの変数を参照することです。 オブジェクト配列、マルチメディア データ、データベースなどの大きなデータ チャンクが処理される場合、これはより重要になります。
これを読む スタックとヒープのメモリ割り当て この高度なトピックをよりよく理解するために。 いくつかのさらに詳細な ビデオ このトピックについて。
解決策 3
機械的には、それらは同じです。 ただし、主な使用方法の違いが 2 つあります。
1) NULL にすることはできず、 持ってる コードに渡される: 間違いはコンパイル時に簡単に発見されます。
2) 値を割り当てるときに、それらを逆参照する必要はありません。 それは読みやすさに役立ちます。
また:
*彼らが指しているアドレスを不注意に変更することはできません。
* キャストする必要がない / キャストできないため、タイプ セーフになります。
解決策 4
ポインタは参照よりも強力です。 残念ながら、ポインターを使用するとエラーが発生しやすくなります。 したがって、経験則は次のとおりです。できる限り参照を使用してください。 参照を使用できない場所ではポインタを使用してください。
解決策 6
参照はポインタ変数よりも使いやすいです。 それらを分離する主な違いは、参照変数は単一の変数を指すために使用され、それを変更することもできるのに対し、ポインター変数は複数の変数を指すために使用できることです(同時にではありません)。 さらに理解を深めるために、ポインターと配列の関係を確認することをお勧めします。 それがあなたの質問に答えることを願っています。 (どの視点で質問されているのかまだわかりませんが、まだ混乱がある場合は、より具体的にしてみてください)
[ad_2]
コメント