C ++はいつ参照とポインターを使用しますか?

1.パラメータの受け渡しの方法:値の受け渡しとアドレスの受け渡し

(1)値渡し方法は、実パラメータの値のコピーを関数(メソッド)に渡し、メソッド内で仮パラメータを操作することです。オブジェクトは実パラメータのコピーであり、影響を与えることはできません。実際のパラメーター。メソッドが戻った後、、正式なパラメーターは解放されて破棄され、実際のパラメーターの内容は変更されません。

(2)アドレッシングモードでは、実パラメータのアドレスが関数(メソッド)に渡されます。メソッドで仮パラメータを操作することは、実パラメータで同じ操作を行うことと同じです。メソッドが終了して戻った後、仮パラメータはパラメータも解放されます。パラメータの内容は、仮パラメータに対する操作の結果になります。

アドレスパスメソッドはさらに次のように分類できます。参照渡し、ポインタ渡し
参照は実際にはオブジェクトのエイリアスであり、オブジェクトの参照を渡し、オブジェクトのアドレスをパラメータとして取得するために使用されます。オブジェクト自体はありませんこれは、私たちが理解している前の質問に対する答えです。参照渡しにより、実際のパラメーターの正式なパラメーターへのコピーが回避され、効率が向上します。

2.参照パラメータをいつ使用するか

(1)参照パラメーターを使用する主な理由は、
プログラマーが呼び出し元の関数でデータオブジェクトを変更できることです。
データオブジェクト全体ではなく参照を渡すことで、実行速度を向上させることができます。

(2)変更せずに関数に渡された値を使用する:組み込みデータオブジェクトなどのデータオブジェクトが小さい
場合、データオブジェクトが配列、ポインター、およびポインターである場合のプレスパスの値は次のように宣言されます。 constへのポインタ
データオブジェクトがより大きな構造の場合は、constポインタまたはconst参照を使用して、効率を向上させ、構造のコピーに必要な時間とスペースを節約します。
データオブジェクトがクラスオブジェクトの場合は、const参照を使用します。クラス設計のセマンティクスでは、多くの場合、参照を使用する必要があります。これが、C ++がこの機能を追加した主な理由です。したがって、クラスオブジェクトを渡す標準的な方法は、参照を渡すことです。

(3)呼び出し元の関数のデータを変更する関数の
場合データオブジェクトが組み込みデータ型の場合は、ポインターを使用します。
データオブジェクトが配列の
場合はポインタのみ使用できます。データオブジェクトが構造体の場合は参照またはポインタを使用します。
データオブジェクトがクラスオブジェクトの場合は参照を使用します。

3.結論

C / C ++プログラミングでは、いつポインターを使用してパラメーターを渡す必要がありますか?次のように要約します。

  1. 実際のパラメーターを変更する必要がある場合は、ポインターのみを使用できます。
  2. 大きな構造体とその要素を「読み取り専用」に渡す場合、

大きな構造体は値で渡されるため、各要素をコピーする必要があり、非効率的です。

  1. 配列をトラバースする必要がある場合、またはその要素を頻繁に参照する必要がある場合、これは添え字を使用するよりも効率的です。

  2. スペースを動的に割り当てるときは、ポインターを使用する必要があります。

  3. 配列を渡すときは、ポインターを使用する必要があります。

  4. 関数がfopenなどのポインタを返すとき

  5. さらに、セカンダリポインター、つまりポインターへのポインターを使用する必要がある場合があります。次に例を示します
    。MemAllocate(char * a){ a =(char *)malloc(sizeof(char));

}

この関数をメモリ割り当てのために呼び出すと、この時点でaの仮パラメータは変更されていますが、実際のパラメータは変更されないため、メモリを正常に割り当てることができないことがわかります。これらは異なるメモリユニットに対応しています。正しい記述は次のとおりです。

MemAllocate(char **a){

*a=(char *)malloc(sizeof(char));

}

このようにして、メモリを正しく割り当てることができます。

多くの場合、ポインターと参照は同じ効果を持ちますが、参照は正式なパラメーターと同じように使用されるため、読み取りが困難になることがよくありますが、ポインターの特性があります。さらに
、データオブジェクトがクラスオブジェクトの場合、const参照が使用されます。クラス設計のセマンティクスでは、多くの場合、参照を使用する必要があります。これが、C ++の新機能の主な理由です。したがって、constオブジェクトを渡す標準的な方法は、
参照を渡すことです。それ以外の場合は、ポインタを使用することをお勧めします

4.その他

まず、null値への参照はどのような状況でも使用できないことを認識してください。参照は常に何らかのオブジェクトを指している必要があります。

1.変数を使用してオブジェクトを指すようにしているが、ある時点で変数がオブジェクトを指していない可能性がある場合は、変数をポインターとして宣言する必要があります。

2.変数がオブジェクトを指す必要がある場合、たとえば、設計で変数を空にすることが許可されていない場合は、変数を参照として宣言できます。

3. null値への参照がないという事実は、参照を使用するコードがポインターを使用するよりも効率的であることを意味します。参照を使用する前にその正当性をテストする必要がないためです。
いくつかの
参照規則は次のとおりです。(1)参照は、作成時に初期化する必要があります(ポインターはいつでも初期化できます)。
(2)NULL参照は存在できず、参照は有効なストレージユニットに関連付けられている必要があります(ポインターはNULLにすることができます)。
(3)参照が初期化されると、参照の関係を変更することはできません(ポインターは、ポイントされているオブジェクトをいつでも変更できます)。

参照:
https //www.cnblogs.com/jingzhishen/p/5046631.html

おすすめ

転載: blog.csdn.net/weixin_40437821/article/details/110870552