C 言語での**ポインタ
Jagathish
2023年10月12日
![C 言語での**ポインタ](/img/C/memory_image_1.webp)
このチュートリアルでは、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'