Cプログラミング · 1 min read · Nov 20, 2025

Linux Cプログラミングチュートリアル 第21部: 文字ポインタ、ポインタの配列、およびポインタへのポインタ

ポインタの概念は、Cプログラミング言語において非常に重要な概念の1つです。これまでに、Cにおけるポインタのいくつかの側面について議論してきました。それを拡張して、このチュートリアルでは、さらにいくつかのポインタの概念について説明します。

Cにおける文字ポインタ、ポインタの配列、およびポインタへのポインタ

次のコード行を使って、文字ポインタから始めましょう:

char p[] = "I like HowtoForge"  
char *p = "I like HowToForge"

最初の行は、二重引用符内の文字数に等しいサイズの配列’p’を定義します。しかし、次の行は、文字列定数を指すポインタ’p’を定義します。

ここでの違いは、最初の’p’は配列であるため、配列の内容を簡単に変更または変更できることです。しかし、2番目の’p’は文字列定数を指しているため、文字列の内容を変更することはできません。

例えば、次のコードは文字列定数を変更しようとします:

#include   
  
int main()  
{  
   char *p = "I like HowToForge";  
   
   p[0] = 'U';  
   
   return 0;  
}

そして、私のシステムでこのコードによって生成された出力は次のとおりです:

セグメンテーションフォルト

このエラーは、プログラムの実行が突然終了したことを示しており、それは定数を変更しようとしたためです。

また、ポインタ’p’を異なる文字列を指すようにすることはできますが、配列’p’の基準アドレスを変更することはできないことを覚えておいてください(これは以前のチュートリアルの1つで既に議論したことです)。

次にポインタ配列に移ります。整数、文字、および他のタイプの配列を見たように、ポインタの配列も存在します。例えば、次のプログラムは整数ポインタの配列’arr’を定義し、それに値を割り当てます。

#include   
  
int main()  
{  
 int *arr[3];  
 int a = 0, b = 1, c = 2;  
   
 arr[0] = &a;  
 arr[1] = &b;  
 arr[2] = &c;  
  
 return 0;  
}

配列に割り当てられた値はアドレスであることに注意してください。これは’arr’がポインタの配列であり、ポインタはアドレス以外の何物でも保存しないためです。これらのアドレスに保持されている値にアクセスしたい場合は、*演算子を使用する必要があります。

次の例(これは前の例の拡張に過ぎません)はこれを示しています:

#include   
  
int main()  
{  
   int *arr[3];  
   int a = 0, b = 1, c = 2;  
   
   arr[0] = &a;  
   arr[1] = &b;  
   arr[2] = &c;  
   
   for(int i=0; i < 3; i++)  
      printf("\n arr[%d] is: %d",i,*(arr[i]));  
  
 return 0;  
}

出力は次のとおりです:

arr[0] is: 0   
arr[1] is: 1   
arr[2] is: 2 

整数ポインタ配列(ここで議論したもののような)と同様に、文字ポインタやその他のポインタを保存する配列を持つことができます。

次にポインタへのポインタに移ります。これまでに何度も繰り返してきたように、ポインタはアドレスを保存します。これまでのCプログラミングチュートリアルシリーズでは、ポインタが非ポインタ変数を指すのを見ただけですが、実際にはポインタは他のポインタを指すこともできます。

これは、ポインタが別のポインタのアドレスを保存できることを意味します。例えば、以下はダブルポインタまたはポインタへのポインタです:

int **ptr;

以下はダブルポインタを利用したコードの一部です:

#include   
  
int main()  
{  
   int *ptr;  
   int p;  
   
   int a = 10;  
   
   ptr = &a;  
   
   p = &ptr;  
   
   printf("\n ポインタ'p'はポインタ'ptr'を指し、さらに値を指します: %d", p);  
   
   return 0;  
}

出力は次のとおりです:

ポインタ'p'はポインタ'ptr'を指し、さらに値を指します: 10

これがダブルポインタの例でした。同様のラインで、ポインタへのポインタへのポインタを持つことができ、例えばint *ptrとして定義されます。このような「ポインタへのポインタへの……」のレベルの最大数は実装に依存します(場合によっては制限は12ですが)。

実際には、レベル3までのポインタへのポインタに出会うことが多いでしょう。なぜなら、より多くのレベルを持つことは、論理を理解し維持するのがより複雑になるからです。

結論

ここでは、3つの重要なポインタに関連する概念について議論しました。ここで議論した例や概念をあなたのシステムで試して、これらのことがどのように機能するかをよりよく理解することをお勧めします。疑問や質問がある場合は、下にコメントを残してください。

Share: X/Twitter LinkedIn

新しい投稿を受信箱で受け取る

スパムはありません。いつでも購読を解除できます。