C 言語での**ポインタ

Jagathish 2023年10月12日
  1. C での変数のメモリ割り当て
  2. C ポインタ
  3. C でのポインタからポインタ(**
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'

関連記事 - C Pointer