C++ ポインタと例
ポインタとは?
C++ では、ポインターは別の変数のアドレスを保持する変数を参照します。通常の変数と同様に、ポインターにはデータ型があります。たとえば、整数型のポインターは、整数型の変数のアドレスを保持できます。文字型のポインタは、文字型の変数のアドレスを保持できます。
ポインターは、メモリ アドレスのシンボリック表現として表示されます。ポインターを使用すると、プログラムは参照渡しをシミュレートできます。また、動的データ構造を作成および操作することもできます。 C++ では、ポインタ変数は、別の変数が指すメモリ内の特定のアドレスを指す変数を参照します。
この C++ チュートリアルでは、次のことを学びます:
- ポインタとは?
- C++ の住所
- ポインタ宣言の構文
- 参照演算子 (&) と参照演算子 (*)
- ポインタと配列
- NULL ポインタ
- 変数のポインタ
- ポインタの適用
- ポインタを使用する利点
C++ のアドレス
C++ ポインターを理解するには、コンピューターがデータを格納する方法を理解する必要があります。
C++ プログラムで変数を作成すると、コンピューター メモリのスペースが割り当てられます。この変数の値は、割り当てられた場所に格納されます。
データが格納されているコンピュータ メモリ内の場所を知るために、C++ は & を提供します。 (参考)演算子。この演算子は、変数が占めるアドレスを返します。
たとえば、x が変数の場合、&x は変数のアドレスを返します。
ポインタ宣言の構文
C++ の宣言は次の構文を取ります:
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; }
出力:
仕組み:
コードのスクリーンショットは次のとおりです:
コードの説明:
<オール>ポインタと配列
配列とポインターは、関連する概念に基づいて機能します。ポインターを持つ配列を操作する場合、注意すべき点がいくつかあります。配列名自体は、配列のベース アドレスを示します。つまり、配列のアドレスをポインターに割り当てる場合、アンパサンド (&) を使用しないでください。
例:
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; }
出力:
コードのスクリーンショットは次のとおりです:
コードの説明:
<オール>NULL ポインタ
割り当てられる正確なアドレスがない場合は、ポインター変数に NULL を割り当てることができます。宣言時に行う必要があります。このようなポインターは、ヌル ポインターと呼ばれます。その値はゼロで、iostream などの多くの標準ライブラリで定義されています。
例 3:
#include <iostream> using namespace std; int main() { int *ip = NULL; cout << "Value of ip is: " << ip; return 0; }
出力:
コードのスクリーンショットは次のとおりです:
コードの説明:
<オール>変数のポインタ
C++ を使用すると、コンピューターのメモリから直接データを操作できます。
メモリ空間は、必要に応じて割り当てたり、再割り当てしたりできます。これは、ポインター変数によって可能になります。
ポインター変数は、別の変数が指すコンピューターのメモリ内の特定のアドレスを指します。
次のように宣言できます:
int *p;
または、
int* p;
you の例では、ポインター変数 p を宣言しました。
メモリアドレスを保持します。
アスタリスクは、ポインターを意味する逆参照演算子です。
ポインタ p は、メモリ アドレス内の整数値を指しています。
例 4:
#include <iostream> using namespace std; int main() { int *p, x = 30; p = &x; cout << "Value of x is: " << *p; return 0; }
出力:
コードのスクリーンショットは次のとおりです:
コードの説明:
<オール>ポインタの適用
C++ の関数は、値を 1 つだけ返すことができます。さらに、関数で宣言されたすべての変数は、関数呼び出しスタックに割り当てられます。関数が戻るとすぐに、すべてのスタック変数が破棄されます。
関数への引数は値で渡され、変数に変更を加えても、渡される実際の変数の値は変更されません。次の例は、この概念を説明するのに役立ちます:-
例 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; }
出力:
コードのスクリーンショットは次のとおりです:
コードの説明:
<オール>関数 test 内の変数 a と b に新しい値が割り当てられますが、関数呼び出しが完了すると、同じことが外部関数 main に反映されません。
関数の引数としてポインターを使用すると、変数の実際のアドレスを関数に渡すのに役立ち、変数に対して実行されたすべての変更が外側の関数に反映されます。
上記の場合、関数 'test' には変数 'a' と 'b' のアドレスがあります。これら 2 つの変数は関数 'test' から直接アクセスできるため、これらの変数に加えられた変更は呼び出し元の関数に反映されます。 「メイン」
ポインタを使用する利点
ここに、ポインターを使用する利点があります
- ポインタは、C++ で他の変数のアドレスを格納する変数です。
- ポインタを使用して、関数によって複数の変数を変更して返すことができます。
- ポインタを使用して、メモリを動的に割り当ておよび割り当て解除できます。
- ポインターは、プログラムの複雑さを単純化するのに役立ちます。
- ポインタを使用するとプログラムの実行速度が向上します。
まとめ:
- ポインタは、別の変数のアドレスを保持している変数を参照します。
- 各ポインタには有効なデータ型があります。
- ポインタは、メモリ アドレスのシンボリック表現です。
- ポインタを使用すると、プログラムは参照渡しをシミュレートし、動的データ構造を作成および操作できます。
- 配列とポインターは、関連する概念を使用します。
- 配列名は、配列のベースを示します。
- 配列のアドレスをポインタに割り当てる場合は、アンパサンド (&) を使用しないでください。
- ポインタ変数を割り当てる特定のアドレスがない場合は、NULL を割り当てます。
C言語