【解決方法】参照と関数に関する C++ の問題

プログラミングQA


私は C++ での参照について学んでいて、ポインターでも同じことができることに気付きました。

参照して:

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

ポインター付き:

C++
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

参照はポインタ変数よりも使いやすいです。 それらを分離する主な違いは、参照変数は単一の変数を指すために使用され、それを変更することもできるのに対し、ポインター変数は複数の変数を指すために使用できることです(同時にではありません)。 さらに理解を深めるために、ポインターと配列の関係を確認することをお勧めします。 それがあなたの質問に答えることを願っています。 (どの視点で質問されているのかまだわかりませんが、まだ混乱がある場合は、より具体的にしてみてください)

コメント

タイトルとURLをコピーしました