C 言語での**ポインタ
このチュートリアルでは、Pointer to Pointer(ダブルポインターまたは**)を使用して別のポインター変数のアドレスを格納する方法を説明します。
C での変数のメモリ割り当て
変数を作成すると、値を格納するためにその変数に割り当てられたメモリの特定のブロックがあります。たとえば、char 変数 ch と値 a を作成しました。内部的には、1 バイトのメモリが変数 ch に割り当てられます。

C ポインタ
C プログラミングでは、ポインタは別の変数のアドレスを格納する変数です。そのアドレスに存在する値にアクセスするには、*を使用します。

#include <stdio.h>
int main() {
char ch = 'a'; // create a variable
char *ptr = &ch; // create a pointer to store the address of ch
printf("Address of ch: %p\n", &ch); // prints address
printf("Value of ch: %c\n", ch); // prints 'a'
printf("\nValue of ptr: %p\n", ptr); // prints the address of a
printf("*ptr(value of ch): %c\n",
*ptr); // Prints Content of the value of the ptr
}
出力:
Address of ch: 0x7ffc2aa264ef
Value of ch: a
Value of ptr: 0x7ffc2aa264ef
*ptr(value of ch): a
上記のコードでは、
char変数chを作成し、値として文字aを割り当てました。charポインタptrを作成し、変数chのアドレスを保存しました。chのアドレスと値を出力しました。ptrの値を出力すると、ptrの値はchのアドレスになります*ptrを使用してchの値を出力しました。ptrの値は変数chのアドレスであり、そのアドレスには値'a'が存在するため、出力されます。
C でのポインタからポインタ(**)
変数のアドレスを格納するには、ポインターを使用します。同様に、ポインタのアドレスを格納するには、(ポインタからポインタ)を使用する必要があります。は、別のポインタのアドレスを格納するポインタを示します。
ポインター変数へのポインターに存在する値を出力するには、**を使用する必要があります。

#include <stdio.h>
int main() {
char ch = 'a'; // create a variable
char *ptr = &ch; // create a pointer to store the address of ch
char **ptrToPtr = &ptr; // create a pointer to store the address of ch
printf("Address of ch: %p\n", &ch); // prints address of ch
printf("Value of ch: %c\n", ch); // prints 'a'
printf("\nValue of ptr: %p\n", ptr); // prints the address of ch
printf("Address of ptr: %p\n", &ptr); // prints address
printf("\nValue of ptrToPtr: %p\n", ptrToPtr); // prints the address of ptr
printf("*ptrToPtr(Address of ch): %p\n",
*ptrToPtr); // prints the address of ch
printf("**ptrToPtr(Value of ch): %c\n", **ptrToPtr); // prints ch
}
出力:
Address of ch: 0x7fffb48f95b7
Value of ch: a
Value of ptr: 0x7fffb48f95b7
Address of ptr: 0x7fffb48f95b8
Value of ptrToPtr: 0x7fffb48f95b8
*ptrToPtr(Address of ch): 0x7fffb48f95b7
**ptrToPtr(Value of ch): a
上記のコードでは、
char変数chを作成し、それに値として文字aを割り当てました。charポインタptrを作成し、変数chのアドレスを保存しました。- ポインタ
ptrToPtrへのcharポインタを作成し、変数ptrのアドレスを格納しました。 - ptr は変数
chのアドレスを値として持ち、ptrToPtrはポインターptrのアドレスを値として持ちます。 *ptrToPtrのようにptrToPtrを逆参照すると、変数chのアドレスが取得されます。**ptrToPtrのようにptrToPtrを逆参照すると、変数chの値が取得されます。
覚えておくべきポイント
ptrToPtr のアドレスを保存するには、作成する必要があります
char ***ptrToPtrToPtr = &ptrToPtr;
printf("***ptrToPtrToPtr : %c\n", ***ptrToPtrToPtr); // 'a'
チュートリアルを楽しんでいますか? <a href="https://www.youtube.com/@delftstack/?sub_confirmation=1" style="color: #a94442; font-weight: bold; text-decoration: underline;">DelftStackをチャンネル登録</a> して、高品質な動画ガイドをさらに制作するためのサポートをお願いします。 Subscribe