C++ ポインターと例

ポインタとは何ですか?

C++ では、ポインターは別の変数のアドレスを保持する変数を指します。 通常の変数と同様に、ポインタにもデータ型があります。 たとえば、整数型のポインタは、整数型の変数のアドレスを保持できます。 文字型のポインタは、文字型の変数のアドレスを保持できます。

ポインタがメモリ アドレスの記号表現として表示されるはずです。 ポインターを使用すると、プログラムは参照渡しをシミュレートできます。 また、動的データ構造を作成および操作することもできます。 C++ では、ポインタ変数は、別の変数が指すメモリ内の特定のアドレスを指す変数を指します。

C++ のアドレス

C++ ポインターを理解するには、コンピューターがデータを保存する方法を理解する必要があります。

C++ プログラムで変数を作成すると、コンピュータ メモリの一部の領域が変数に割り当てられます。 この変数の値は、割り当てられた場所に保存されます。

コンピュータ メモリ内のデータが保存されている場所を知るために、C++ は & (参照) 演算子。 演算子は、変数が占めるアドレスを返します。

たとえば、x が変数の場合、&x は変数のアドレスを返します。

ポインタ宣言の構文

C++ の宣言は次のようになります。wing 構文:

datatype *variable_name; 
  • データ型はポインターの基本型であり、有効な C++ データ型である必要があります。
  • variable_name はポインター変数の名前である必要があります。
  • 上記のポインター宣言に使用されるアスタリスクは、乗算演算を実行するために使用されるアスタリスクに似ています。 変数をポインターとしてマークするのはアスタリスクです。

C++ での有効なポインター宣言の例を次に示します。

int    *x;    // a pointer to integer
double *x;    // a pointer to double
float  *x;    // a pointer to float
char   *ch     // a pointer to a character

参照演算子 (&) と参照演算子 (*)

参照演算子 (&) は変数のアドレスを返します。

逆参照演算子 (*) は、メモリ アドレスに格納されている値を取得するのに役立ちます。

例:

num という名前の変数があり、アドレス 0x234 に格納され、値 28 が格納されているとします。

参照演算子 (&) は 0x234 を返します。

逆参照演算子 (*) は 5 を返します。

例1:

#include <iostream>
using namespace std;
int main() {
	int  x = 27;  
	int  *ip;        
	ip = &x;       
	cout << "Value of x is : ";
	cout << x << endl;
	cout << "Value of ip is : ";
	cout << ip<< endl;
	cout << "Value of *ip is : ";
	cout << *ip << endl;
	return 0;
}

出力:

参照演算子 (&) と参照演算子 (*)

仕組み:

参照演算子 (&) と参照演算子 (*)

コードのスクリーンショットは次のとおりです。

参照演算子 (&) と参照演算子 (*)

コードの説明:

  1. iostream ヘッダー ファイルをインポートします。 これにより、ヘッダー ファイルで定義された関数をエラーを発生させることなく使用できるようになります。
  2. std 名前空間を含めると、呼び出さずにそのクラスを使用できます。
  3. main() 関数を呼び出します。 プログラム ロジックは、この関数の本体内に追加する必要があります。 { は関数本体の始まりを示します。
  4. 整変数 x を宣言し、値 27 を割り当てます。
  5. ポインタ変数*ipを宣言します。
  6. 変数xのアドレスをポインタ変数に格納します。
  7. コンソールにテキストを出力します。
  8. 変数 x の値を画面に表示します。
  9. コンソールにテキストを出力します。
  10. 変数 x のアドレスを出力します。 アドレスの値は変数 ip に格納されました。
  11. コンソールにテキストを出力します。
  12. ポインタのアドレスに格納されている の値を出力します。
  13. プログラムは、実行が成功すると値を返す必要があります。
  14. main() 関数の本体の終わり。

ポインタと配列

配列とポインターは、関連する概念に基づいて機能します。 ポインターを持つ配列を操作する場合は、注意すべき点がいくつかあります。 配列名自体は配列のベース アドレスを示します。 これは、配列のアドレスをポインターに割り当てる場合、アンパサンド (&) を使用すべきではないことを意味します。

例:

p = arr;

arr は配列のアドレスを表すため、上記は正しいです。 別の例を次に示します。

p = &arr;

上記は誤りです。

配列を暗黙的にポインタに変換できます。 例えば:

int arr [20];
int * ip;

以下は有効な操作です。

ip = arr;

上記の宣言の後、ip と arr は等価になり、プロパティを共有します。 ただし、ip には別のアドレスを割り当てることができますが、arr には何も割り当てることができません。

例2:

この例は、ポインターを使用して配列を走査する方法を示しています。

#include <iostream>
using namespace std;
int main() {
	int *ip;
	int arr[] = { 10, 34, 13, 76, 5, 46 };
	ip = arr;
	for (int x = 0; x < 6; x++) {
		cout << *ip << endl;
		ip++;
	}
	return 0;
}

出力:

ポインタと配列

コードのスクリーンショットは次のとおりです。

ポインタと配列

コードの説明:

  1. 整数ポインタ変数 ip を宣言します。
  2. arr という名前の配列を宣言し、そこに 6 つの整数を格納します。
  3. arr を IP に割り当てます。 ip と arr は等価になります。
  4. for ループを作成します。 ループ変数 x は、インデックス 0 から 5 までの配列要素を反復処理するために作成されました。
  5. ポインタ IP のアドレスに格納されている値を出力します。 反復ごとに 6 つの値が返され、合計 XNUMX 回の反復が行われます。 endl は、終了行を意味する C++ キーワードです。 このアクションにより、各値が出力された後にカーソルを次の行に移動できます。 各値は個別の行に出力されます。
  6. 反復ごとにポインタを次の int 位置に移動します。
  7. for ループの終わり。
  8. プログラムは実行が成功したときに何かを返さなければなりません。
  9. main() 関数本体の終わり。

NULLポインタ

割り当てられる正確なアドレスがない場合は、ポインター変数に NULL を割り当てることができます。 それは宣言中に行う必要があります。 このようなポインターは、ヌル ポインターとして知られています。 その値はゼロで、iostream などの多くの標準ライブラリで定義されています。

例3:

#include <iostream>
using namespace std;
int main() {
	int  *ip = NULL;
	cout << "Value of ip is: " << ip;
	return 0;
}

出力:

NULLポインタ

コードのスクリーンショットは次のとおりです。

NULLポインタ

コードの説明:

  1. ポインタ変数 ip を宣言し、それに NULL 値を割り当てます。
  2. ポインタ変数 ip の値をテキストとともにコンソールに表示します。
  3. プログラムは正常に完了すると値を返す必要があります。
  4. main() 関数の本体の終わり。

変数のポインタ

C++ を使用すると、コンピュータのメモリから直接データを操作できます。

メモリ空間は、必要に応じて割り当てたり、再割り当てしたりできます。 これはポインター変数によって可能になります。

ポインタ変数は、別の変数が指すコンピュータのメモリ内の特定のアドレスを指します。

次のように宣言できます。

int *p;

または、

int* p;

この例では、ポインター変数 p を宣言しました。

メモリアドレスを保持します。

アスタリスクはポインタを意味する逆参照演算子です。

ポインタ p はメモリ アドレス内の整数値を指します。

例4:

#include <iostream>

using namespace std;
int main() {
	int *p, x = 30;
	p = &x;
	cout << "Value of x is: " << *p;
	return 0;
}

出力:

変数のポインタ

コードのスクリーンショットは次のとおりです。

変数のポインタ

コードの説明:

  1. ポインター変数 p と変数 x を値 30 で宣言します。
  2. 変数 x のアドレスを p に代入します。
  3. ポインタ変数 p の値をテキストとともにコンソールに表示します。
  4. プログラムは正常に完了すると値を返す必要があります。
  5. main() 関数の本体の終わり。

ポインタの適用

C++ の関数 XNUMX つの値のみを返すことができます。 さらに、関数内で宣言されたすべての変数は、関数呼び出しスタックに割り当てられます。 関数が戻るとすぐに、すべてのスタック変数が破棄されます。

関数への引数は値によって渡され、変数に変更を加えても、渡される実際の変数の値は変更されません。 フォロwing この概念を説明するのに役立つ例:-

例5:

#include <iostream>

using namespace std;
void test(int*, int*);
int main() {
	int a = 5, b = 5;
	cout << "Before changing:" << endl;
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;

	test(&a, &b);

	cout << "\nAfter changing" << endl;
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
	return 0;
}

void test(int* n1, int* n2) {
	*n1 = 10;
	*n2 = 11;
}

出力:

ポインタの適用

コードのスクリーンショットは次のとおりです。

ポインタの適用

コードの説明:

  1. XNUMX つの整数パラメータを取る test という名前の関数のプロトタイプを作成します。
  2. main() 関数を呼び出します。 本体内にプログラムロジックを追加します。
  3. それぞれの値が 5 である XNUMX つの整数変数 a と b を宣言します。
  4. コンソールにテキストを出力します。 endl (終了行) はカーソルを移動して、次の行の印刷を開始します。
  5. 変数 a の値を他のテキストと一緒にコンソールに出力します。 endl (終了行) はカーソルを移動して、次の行の印刷を開始します。
  6. 変数 b の値を他のテキストと一緒にコンソールに出力します。 endl (終了行) はカーソルを移動して、次の行の印刷を開始します。
  7. 変数 a と b のアドレスをパラメーターとして受け取る test() という名前の関数を作成します。
  8. コンソールにテキストを出力します。 \n は、テキストが印刷される前に新しい空白行を作成します。 endl (終了行) は、テキストの印刷後にカーソルを移動して次の行の印刷を開始します。
  9. 変数 a の値を他のテキストと一緒にコンソールに出力します。 endl (終了行) はカーソルを移動して、次の行の印刷を開始します。
  10. 変数 b の値を他のテキストと一緒にコンソールに出力します。 endl (終了行) はカーソルを移動して、次の行の印刷を開始します。
  11. プログラムは正常に完了すると値を返す必要があります。
  12. main() 関数の本体の終わり。
  13. 関数 test() を定義します。 この関数は 1 つの整数ポインター変数 *n2 と *nXNUMX を取る必要があります。
  14. ポインター変数 *n1 に値 10 を割り当てます。
  15. ポインター変数 *n2 に値 11 を割り当てます。
  16. 関数 test() の本体の終わり。

関数 test 内で変数 a と変数 b に新しい値が代入されても、関数呼び出しが完了すると、外側の関数 main には反映されません。

ポインタを関数の引数として使用すると、関数内で変数の実際のアドレスを渡すことが容易になり、変数に対して実行されたすべての変更が外側の関数に反映されます。

上記の場合、関数 'test' は変数 'a' と 'b' のアドレスを持ちます。 これら XNUMX つの変数は関数「test」から直接アクセスできるため、これらの変数に加えられた変更は呼び出し側関数「main」に反映されます。

ポインターを使用する利点

ポインターを使用する利点と利点は次のとおりです。

  • ポインタは、他のアドレスを格納する変数です。 C++ の変数.
  • ポインタを使用して、関数によって複数の変数を変更したり返したりすることができます。
  • メモリは、ポインタを使用して動的に割り当てたり割り当て解除したりできます。
  • ポインタは、com を簡素化するのに役立ちますplexプログラムの内容。
  • ポインタを使用することでプログラムの実行速度が向上します。

まとめ

  • ポインタとは、別の変数のアドレスを保持する変数を指します。
  • 各ポインターには有効なデータ型があります。
  • ポインタはメモリ アドレスを記号的に表現したものです。
  • ポインターを使用すると、プログラムは参照による呼び出しをシミュレートし、動的データ構造を作成および操作できます。
  • 配列 ポインターは関連する概念を使用します。
  • 配列名は配列のベースを示します。
  • 配列のアドレスをポインターに割り当てる場合は、アンパサンド (&) を使用しないでください。
  • ポインター変数を割り当てる特定のアドレスがない場合は、それに NULL を割り当てます。