ポインタ算術 · 1 min read · Nov 15, 2025
Linux Cプログラミングチュートリアル パート20 - ポインタのアドレス算術

前回のこのCプログラミングシリーズのチュートリアルでは、ポインタについて少し詳しく説明しました。その議論を拡張し、ここではポインタに関連するさらにいくつかの議論に値する概念について説明します。それでは、早速始めましょう。
Cにおけるポインタのアドレス算術
まず、ポインタを扱う際のアドレス算術に焦点を当てましょう。前回のチュートリアルで説明したように、配列を指すポインタ(例えば、その始まり)を持っている場合、その配列の要素にアクセスするのは非常に簡単です。以下はその例です:
#include
int main()
{
char arr[]={'a','b','c','d'};
int a[]={1,2,3,4};
char *ptr = arr;
int *p = a;
for(int i=0; i このコードでは、’arr’と’a’の2つの配列があります。最初の配列は文字配列で、2番目の配列は整数配列です。そして、これらの配列を指す2つのポインタ - ‘ptr’と’p’があります。それから、現在ポインタが指しているアドレスとそのアドレスに含まれる値を印刷するいくつかの’for’ループがあります。
以下は、私のマシンでのこのコードの出力です:
文字ポインタが指しているのは 726409312, 値は a
文字ポインタが指しているのは 726409313, 値は b
文字ポインタが指しているのは 726409314, 値は c
文字ポインタが指しているのは 726409315, 値は d
整数ポインタが指しているのは 726409296, 値は 1
整数ポインタが指しているのは 726409300, 値は 2
整数ポインタが指しているのは 726409304, 値は 3
整数ポインタが指しているのは 726409308, 値は 4ここで注目すべきは、出力に印刷されたアドレスです。文字配列の場合、ポインタに’1’を加えると次のアドレスにインクリメントされますが、整数配列の場合、ポインタに’1’を加えると4つのアドレス先にジャンプします。なぜそうなるのでしょうか?
それはすべてポインタの型に依存します。文字ポインタは常に文字が占めるバイト数、通常は1バイトだけジャンプします。同様に、整数ポインタは通常、1でインクリメントされると4バイトジャンプします。したがって、上記の出力における文字と整数ポインタのジャンプの違いを説明するはずです。
ポインタ算術を進めると、ポインタは特定のケースで比較式に使用できます。たとえば、ポインタ’ptr’が配列’arr’(サイズ’size’)の要素を指しているかどうかを確認したい場合、次のように比較を行うことができます:
if((ptr >= arr) && (ptr < (arr + size))) したがって、上記の式はポインタが保持しているアドレスがその要素の1つであるかどうかをチェックします。
また、同じ配列の要素を指す複数のポインタがある場合、次の比較演算子 ==, !=, <, および >= を使用できます。実際、これらのケースではポインタの減算も行うことができます。以下はその例です:
#include
int main()
{
char arr[]= "Welcome to HowtoForge";
char *ptr = arr;
char *p = arr;
while(*p != '\0')
{
p++;
}
printf("\n 文字列の長さは %d", (p - ptr));
return 0;
} このプログラムでは、1つのポインタが配列の最初の要素を指すようにし、2番目のポインタは最後の要素(定数文字列では’\0’)を指すまで継続的にインクリメントされます。
次に、ここで扱っているのは文字(それぞれ1バイトを占める)であるため、最初のポインタが指すアドレスから2番目のポインタが指すアドレスを引くことで、文字の数を見つけることができ、これは文字列の正確な長さです。
注意:ポインタに関しては、加算、乗算、除算などの操作は無効であることに注意してください。また、これまでにリストした受け入れ可能な操作の種類も、ポインタが同じ型であり、同じ配列の要素を指している場合にのみ有効です。
結論
前回のチュートリアルで基本的なポインタの概念について説明した後、ここではポインタのアドレス算術について説明しました。ここで説明したことをプログラムの形であなたのマシンで練習することをお勧めします。疑問や質問がある場合は、遠慮なく下にコメントを残してください。
新しい投稿を受信箱で受け取る
スパムはありません。いつでも購読を解除できます。