pointers pointer operations c
ポインタとC ++でのそれらの使用に関する集中的な研究。
ポインタは、C ++言語の最も強力な機能の1つです。ポインタは、そのアドレスを介して変数を操作するのに役立ちます。
無料のyoutubeからmp3へのコンバータープレミアム
このチュートリアルでは、C ++でのポインターとその使用法について詳しく説明します。
=> ここで簡単なC ++トレーニングシリーズに注意してください。
学習内容:
ポインタとは何ですか?
ポインタは、メモリ位置のアドレスを保持する変数です。宣言するすべての変数は、メモリ内に特定のアドレスを持っていることがわかっています。メモリ内のこれらのアドレスを指すポインタ変数を宣言します。
ポインタ変数を宣言するための一般的な構文は次のとおりです。
datatype * variable_name;
例えば、 宣言 int * ptr;
これは、ptrがint型の変数を指すポインターであることを意味します。したがって、ポインタ変数には常にメモリの場所またはアドレスが含まれます。以下のポインタ変数の動作を見てみましょう。
次の宣言があると考えてください。
Int p, *ptr; //declare variable p and pointer variable ptr p = 4; //assign value 4 to variable p ptr = &p; //assign address of p to pointer variable ptr
メモリ内では、これらの宣言は次のように表されます。
これは、メモリ内のポインタの内部表現です。アドレス変数をポインタ変数に割り当てると、上の表現に示すように変数を指します。
ptrのアドレスは変数pであるため、* ptrは変数p(ポインター変数ptrが指している変数)の値を示します。
注意: ポインターで使用する演算子*は、それがポインター変数であることを示すために使用されます。
C ++で使用されるポインターの概念のいくつかを見てみましょう。
ポインタ演算
ポインタ変数は常にメモリ内のアドレスを指していることがわかっています。実行できる演算の中には、ポインタに対して実行される次の算術演算があります。
- インクリメント演算子(++)
- デクリメント演算子(–)
- 加算(+)
- 減算(-)
サンプルプログラムでこれらの操作の使用法を見てみましょう。
#include #include using namespace std; int main() { int myarray(5) = {2, 4,6, 8,10}; int* myptr; myptr = myarray; cout<<'First element in the array :'<<*myptr< 出力:
配列の最初の要素:2
配列の次の要素:4
配列の次の要素:6
配列の次の要素:4
配列の次の要素:2
ポインタに対して実行される算術演算を見てきました。インクリメント演算子++はポインタをインクリメントし、配列内の次の要素を指すことに注意してください。同様に、デクリメント演算子は、ポインタ変数を1だけデクリメントして、配列内の前の要素を指すようにします。
+および–演算子も使用します。まず、ポインタ変数に1を追加しました。結果は、配列内の次の要素を指していることを示しています。同様に、–演算子は、配列内の前の要素を指すようにポインター変数を作成します。
これらの算術演算子とは別に、==、のような比較演算子を使用することもできます。
ヌルおよびボイドポインタ
ポインタ変数に変数のアドレスが割り当てられていない場合は、ポインタ変数にNULL値を割り当てることをお勧めします。 NULL値を持つポインター変数は、NULLポインターと呼ばれます。
nullポインターは、iostreamヘッダーで定義された値ゼロの定数ポインターです。アドレス0のメモリはオペレーティングシステムによって予約されており、この場所にアクセスできません。
nullポインターを使用すると、未使用のポインターの誤用を回避し、ポインター変数にいくつかのガベージ値が割り当てられるのを防ぐことができます。
ボイドポインタは、型のない値を指す特別なポインタです。 voidポインターは、任意の型を指すことができるため、より柔軟性があります。ただし、直接逆参照することはできません。間接参照の場合、voidポインターは、具象データ型の値を指すポインターに変換する必要があります。
次のコード例では、NULLポインターとvoidポインターの動作を示しています。
#include #include using namespace std; int main() { int intvar = 10; char c = 'A'; void* vptr; int* myptr = NULL; cout<<'NULL pointer value :'< 出力:
NULLポインタ値:0
ボイドポインタvptrが指すもの:A
ボイドポインタvptrが指す:: 10
上記のプログラムでは、最初に、値NULLが割り当てられた整数ポインターを宣言します。このポインタを出力すると、前に説明したように、値が0であることがわかります。
次に、voidポインタを宣言します。まず、このvoidポインタに文字変数のアドレスを割り当てます。次に、voidポインターを文字ポインターに割り当て、char *を使用してタイプキャストします。次に、前に宣言した文字変数であり、voidポインターが指すcharAを指すcharptr値を出力します。
次に、整数変数をvoidポインターに割り当て、整数ポインターを使用してこのvoidポインターを逆参照するのと同じ手順を実行します。
配列とポインタ
配列とポインタは互いに強く関連しています。配列の名前が配列の最初の要素を指していることがわかっており、これは定数ポインターです。
PCに最適なオペレーティングシステムは何ですか
このポインターをポインター変数に割り当ててから、ポインターをデクリメントするか、添え字演算子を使用して配列にアクセスできます。
次のコード例では、ポインタ変数と配列の間のこの関連付けを確認します。
#include #include using namespace std; int main() { int myarray(5) = {1, 1, 2, 3, 5}; int* ptrvar; ptrvar = myarray; for(int i=0;i<5;i++) { cout<<*ptrvar<<' '; ptrvar++; } return 0; }
出力:
1 1 2 3 5
上記のプログラムでは、配列名をポインタ変数に割り当てます。配列名は配列の最初の要素を指しているため、ポインター変数を使用して配列全体の内容を出力し、++演算子を使用してインクリメントできます。これは出力に示されています。
ポインタの配列
プログラムに複数のポインタ変数が必要な場合があります。個々のポインター変数を宣言する代わりに、ポインターの配列を宣言できます。
ポインタの配列を示すために、すぐに例を見てみましょう。
#include #include using namespace std; int main() { int myarray(5) = {2,4,6,8,10}; int *ptr(5); //array of pointers for(int i=0;i<5;i++){ ptr(i) = &myarray(i); } for (int i = 0; i < 5; i++) { cout << 'Value of myarray(' << i << ') = '; cout << *ptr(i) << endl; } return 0; }
出力:
myarray (0) = 2の値
myarray (1) = 4の値
myarray (2) = 6の値
myarray (3)の値= 8
myarray (4)の値= 10
上記の宣言では、
int * ptr (5);
私たちは次のように解釈できます。 ptrは、5つの整数ポインターの配列です。したがって、ptrの各要素は整数型の変数を指します。
整数配列を使用して、配列の各要素のアドレスを各ptr要素に割り当てます。次に、「* ptr (i)」を出力して、ptr配列の内容を表示します。
ポインタのポインタ
ポインタのポインタは、複数の間接化に他なりません。これは一種のポインタのチェーンです。ポインターのポインターを定義すると、最初のポインターには2番目のポインターのアドレスがあり、2番目のポインターにはそれが指す変数のアドレスがあります。
メモリでは、これは次のように表されます。

ポインタのポインタは次のように宣言されます。
int** intptr;
ポインタのポインタをよりよく理解するために、コード例を直接取り上げます。
#include #include using namespace std; int main() { int *vptr; int ** intptr; int var = 10; vptr = &var; intptr = &vptr; cout<<'Variable var: '< 出力:
変数変数:10
変数へのポインター:10
ポインターから変数へのポインター:10
上記のプログラムでは、整数変数、整数ポインター、および整数へのポインターのポインターを宣言します。プログラムに示されているように、ポインター変数には変数の値が割り当てられます。ポインター変数のポインターには、ポインター変数のアドレスが割り当てられます。
最後に、整数変数に等しい同じ値10を表示する3つの変数を出力します。
関数へのポインタの受け渡し
関数へのポインターの受け渡しは、ポインター変数を関数に渡す他のパラメーター受け渡し手法と同じです。
2つの値を交換し、ポインター変数をパラメーターとして渡すように変更します。
#include #include using namespace std; void swap(int* a, int* b) { int temp; temp = *a; *a = *b; *b = temp; } int main() { int a, b; cout<>a>>b; cout<<'a = '< 出力:
交換する値を入力してください:3 2
a = 3 b = 2
スワップされた値
a = 2 b = 3
プログラムに示されているように、スワップされる値を整数変数として渡します。仮パラメーターは、ポインター変数として定義されます。この結果、関数内の変数に加えられた変更は、呼び出し元の関数の外部にも反映されます。
関数ポインタ
同様に、変数や配列などへのポインターがあるので、関数へのポインターも持つことができます。ただし、違いは、関数ポインターが変数や配列などのデータではなく、実行可能コードを指していることです。
関数ポインタを示す例を取り上げます。
#include #include using namespace std; void displayVal(int a) { printf('Value of a is %d
', a); } int main() { void (*func_ptr)(int) = &displayVal; (*func_ptr)(100); return 0; }
出力:
aの値は100です
SQLインタビューの質問と回答pdf
上記のプログラムには、渡された整数値を出力するだけの関数「displayVal」があります。メイン関数では、intを引数として取り、void型を返す関数ポインタ「func_ptr」を定義しました。
void(* func_ptr)(int)
注意: 関数ポインタを()で囲む必要があります。省略した場合は関数プロトタイプになります。
関数「displayVal」のアドレスをこの関数ポインタに割り当てました。次に、この関数ポインタ「func_ptr」を使用して、引数値100を渡します。これは、引数100でdisplayValを呼び出すのと同じです。
これで、同じプロトタイプを持つ別の関数がある場合、関数のアドレスを割り当てることで同じ関数ポインターを使用できます。これは、関数ポインタの主な用途です。
結論
これはすべて、C ++でのポインター、その定義、および使用法に関するものです。
次のチュートリアルでは、C ++での参照について詳しく学習します。参照はC ++でも特別に使用され、変数のエイリアスとしてよく使用されます。
=> 絶対C ++トレーニングシリーズについては、ここをクリックしてください。
推奨読書