C++ のポインタと参照では、どちらも間接的にオブジェクトにアクセスするために使用されます。そのため、いつポインタを使用し、いつ参照を使用するかを知ることが重要です。この記事では、C++ におけるポインターと参照 (ポインターと参照) の違いについて説明します。ここでは、いつ参照を使用し、いつポインターを使用するかを決定するのに役立つ、参照とポインターの重要な違いについて説明します。また、参照とポインタが互いに異なる理由を理解するのに役立ついくつかのコード スニペットを使用します。
以下の記事もご覧いただけます
- C++ での参照。知っておく必要があります。
- C++ の参照と const。
- ポインタの簡単な紹介
- const 参照とパラメータ内の参照の違い
C++ でのポインタと参照:
いくつかのポイントを残しておくと、参照はポインターに似ています。以下に、C++ でポインターと参照を区別するいくつかのポイントを選択しました (ポインターと参照):
1.宣言と初期化:
参照宣言の構文構造は、ポインター宣言に似ています。違いは、ポインター宣言では *
を使用することです。 演算子、参照宣言は &
を使用します オペレーター。これは、ポインタ名の後に *
が続くことを意味します (アスタリスク) ただし、参照名の後に &
が続く (演算子のアドレス).
例
//create an variable int data = 6; //rData (reference) refer to data int& rData = data; //pData (pointer) refer to data int *pData = &data; OR int *pData; pData = &data;
2. NULL ポインタによる初期化:
ポインターは null ポインターを指すことができますが、参照は NULL を参照できません。
//reference refer to null int& rData = NULL; //error //pointer point to null int *pData = NULL; // ok
3.再バインド:
一度参照がオブジェクトにバインドされると、別のオブジェクトに再バインドされないことに注意してください。しかし、要件に従って複数回ポインターを初期化できるというのはポインターには当てはまりません。作成時にポインターを初期化する必要はありません。
/****reference****/ int& rData; //error int& rData = a; //ok, rData (reference) refer to 'a' rData = b; //error /****Pointer****/ int *pData; // ok int *pData = &a; // ok, pData point to 'a' pData = &b; // ok, pData point to 'b'
4.値にアクセスする方法:
参照は、オブジェクトの名前と考えることができます。したがって、値にアクセスする際に追加の演算子は必要ありません。しかし、ポインターでは、値にアクセスするときに間接演算子が必要です。理解を深めるためにコード例を見てみましょう。
#include <iostream> using namespace std; int main() { //create an variable int data = 6; //pointer point to data int *pData = &data; //rOffData refer to data int& rData = data; cout << "Value of data, rData and pData" << endl; cout << "data = " << data << endl; //accessing value by reference cout << "rData = " << rData << endl; //accessing value by pointer cout << "*pData = " << *pData << endl; return 0; }
出力:
Value of data, rData and pData data1 = 6 rData = 6 *pData = 6
プログラミング言語をオンラインで学習したい場合は、コースを確認できます。無料トライアルを利用できます。
クリックして無料トライアルを入手
5. dynamic_cast の失敗:
失敗した dynamic_cast は、ポインターと参照に対して同じ影響を与えません:
1. ポインターで失敗した dynamic_cast は、null ポインターを返します。
2. 参照で失敗した dynamic_cast は、タイプ std::bad_cast の例外をスローします。 null 参照を返すことができないため、これは理にかなっています。
6.ストレージ:
参照がストレージを必要とするかどうかは指定されていません。それでも、参照が元の変数と同じメモリアドレスを共有しているが、スタック上のスペースも占有している例を見てきました。コード例を見てみましょう。
void fun(int& rChangeData) { rChangeData = 10; } int main() { int data = 5; int& rData = data; fun(rData); return 0; }
上記のコードでは、rData はメイン スタックのスペースを占有するべきではありませんが、関数の参照 rChangeData はそのスタックに配置されます。これは、rData を引数として関数「fun」を呼び出すと、データのアドレスが関数のスタックにプッシュされることを意味します。
7.安全:
参照はポインターよりも安全です。これが、C++ の人々が C++ プログラミングで参照を使用することを主張する理由です。しかし、それはあなたとあなたの要件次第です.
ポインターは、再バインドと null 可能性を許可するため、参照よりも強力です。また、「スパイダーマン映画」を見たことがあれば の場合、「大きな力には大きな責任が伴う」ことを知っているので、ポインタが null ではなく、その指し示したターゲットが変更されないことを常に心配する必要があります。
しかし、参照が常に安全であるということも 100% 真実ではありません。また、参照を使用する前に注意する必要があります。
参照が無効であり、未定義の動作を引き起こす可能性がある例を見てみましょう。悪い点は、そのようなタイプの問題を追跡するのが難しいことです.
int* pData; int& rData = *pData;
参照とポインタのその他の違い:
1. 参照への参照はありませんが、ポインタへのポインタは可能です。
2. 参照の配列はありませんが、ポインターの配列は可能です。
3. 参照へのポインターはありませんが、ポインターへのポインターは可能です。
おすすめの投稿
- C プログラミングのコースとチュートリアル
- CPP プログラミング コースとチュートリアル
- Python のコースとチュートリアル
- C++ での参照の導入
- 新しいオペレーターのすべて
- あなたのための C++ MCQ。
- C++ 面接の質問と回答
- C++ のコンストラクタ
- プログラマーにとって最高のマウス
- プログラマーへの素晴らしい贈り物のリストです。ぜひどうぞ。
- プログラマー向けの最高の電子キット
- 100 C 面接の質問
- 回答付きの C# インタビューの質問