C 言語ではポインタ変数にメモリ アドレスを格納できることがわかっています。この記事では、そのポインタを使用して、ポインタが指すメモリ位置に格納されているデータにアクセスする方法を学びます。
ポインタとは何ですか?
まず、ポインタとは何かを復習します。ポインタは、別の変数のメモリ アドレスを格納する変数です。ポインタは、ポインタが指すメモリ アドレス内のデータを操作するのに役立ちます。さらに、複数のポインタが同じメモリを指すことができます。
次の例を考えてみましょう。
int num = 10; int *ptr; ptr = #>
のアドレスを保存しました。 1つで の変数 ptr ポインタですが、次に、メモリ内のポインタが指すアドレスに格納されている値にアクセスする方法を説明します。 ptr ?ここで逆参照が登場します。
C の逆参照ポインター
逆参照または間接演算子 (*) を使用して、ポインターが指すメモリー アドレスに格納されているコンテンツにアクセスまたは操作することを、ポインターの逆参照と呼びます。
C でのポインターの逆参照
ポインタを逆参照するための構文
ポインターを逆参照するための接頭辞として間接演算子 (*) を使用します。
* ( pointer_name )>
メモリに保存されているデータを変更するには、次を使用します。
* ( pointer_name ) = new_value;>
new_value は以前のものと同じ型でなければならないことに注意してください。
上記の例を考えてみましょう。 ptr に指差す どうか、t メモリ アドレスの内容には、逆参照演算子 * を使用してアクセスできます。ここで、*ptr はアドレス 10 に格納されているコンテンツをフェッチします。
num と ptr のメモリ アドレスと値は次のようになります。
| 変数 | メモリアドレス | 価値 |
|---|---|---|
| 数値 = 10 | 202020 | 10 |
| 202021 | ||
| 202022 | ||
| 202023 | ||
| ptr = &num | 202024 – 202032 | 202020 |
注記: 上記の例のアーキテクチャはバイトアドレス指定可能である、つまり、個別のアドレスを持つ最小単位はバイトであると仮定しています。
ポインター逆参照の例
例 1:
ポインタを使用して整数変数の値にアクセスし、その値を変更します。
C
// C Program to illustrate the dereferencing of pointer> #include> int> main()> {> >// Declare integer variable number> >int> num = 10;> >// Declare pointer to store address of number> >int>* ptr = #> >// Print the value of number> >printf>(>'Value of num = %d
'>, num);> >// Print Address of the number using & operator> >printf>(>'Address of num = %d
'>, &num);> >// Print Address stored in the pointer> >printf>(>'Address stored in the ptr = %p
'>, ptr);> >printf>(>'Dereference content in ptr using *ptr
'>);> >// Access the content using * operator> >printf>(>'Value of *ptr = %d
'>, *ptr);> >printf>(>'Now, *ptr is same as number
'>);> >printf>(>'Modify the value using pointer to 6
'>);> >// Modify the content in the address to 6 using pointer> >*ptr = 6;> >// Print the modified value using pointer> >printf>(>'Value of *ptr = %d
'>, *ptr);> >// Print the modified value using variable> >printf>(>'Value of number = %d
'>, num);> >return> 0;> }> |
>
文字列Javaのインデックス
>
出力
Value of num = 10 Address of num = 0x7ffe47d51b4c Address stored in the ptr = 0x7ffe47d51b4c Dereference content in ptr using *ptr Value of *ptr = 10 Now, *ptr is same as number Modify the value using pointer to 6 Value of *ptr = 6 Value of number = 6>
例 2: ダブル ポインターの逆参照
同じロジックを使用してダブル ポインターを逆参照することもできますが、間接演算子を 2 回使用する必要があります。1 回目はダブル ポインターが指しているポインターに移動するため、もう 1 回目は実際の値にアクセスするためです。
C
// C program to dereference double pointer> #include> int> main()> {> >int> var = 10;> >int>* ptr = &var;> >// double pointer> >int>** dptr = &ptr;> >// dereferencing the double pointer> >printf>(>'Accesing value from double pointer using '> >'**dptr: %d'>,> >**dptr);> >return> 0;> }> |
>
>出力
Accesing value from double pointer using **dptr: 10>
同様に、任意のレベルのポインターを逆参照できます。
逆参照はどのように機能するのでしょうか?
コンパイラにポインタの逆参照を依頼すると、コンパイラは次の 3 つのことを実行します。
- まず、ポインタに格納されているアドレスを検索します。
- 次に、ポインタのタイプを検索して、読み取るメモリの量を推定します。たとえば、int の場合は 4 バイト、char の場合は 1 バイトなどです。これは、システム内のすべてのポインターのサイズが同じであっても、宣言でポインターの型を指定する必要がある主な理由でもあります。
- 最後に、メモリを読み取り、保存されているデータを返します。
注記: 上記の推論から、void ポインターが指しているデータのサイズが不明であるため、void ポインターを逆参照できないことも推測できます。したがって、void ポインタを型キャストして逆参照する必要があります。