C言語のポインタ演算入門:加算と減算の仕組みを実例で解説
ポインタには多くの概念がありますが、どれも理解しやすく、Cプログラミングにおいて非常に重要な役割を果たします。
本記事では、ポインタの算術演算の中でも特に基本となる「ポインタの加算」と「ポインタの減算」について、具体的なコード例とともに詳しく解説します。
C言語におけるポインタの加算
ポインタの加算とは、ポインタ変数に対して値を加える操作のことです。重要なポイントは、ポインタに加算を行うと、単純にバイト数が足されるのではなく、指し示すデータ型のサイズに応じてアドレスが移動するという点です。
計算式は以下の通りです。
new_address = current_address + (number * size_of(data type))
サンプルコード
以下は、C言語でポインタの加算を行うプログラム例です。
#include<stdio.h>
int main(){
int num = 500;
int *ptr; // int型へのポインタ
ptr = # // num変数のアドレスを格納
printf("add of ptr is %u \n", ptr);
ptr = ptr + 7; // ポインタ変数に7を加算
printf("after adding add of ptr is %u \n", ptr);
return 0;
}実行結果
上記のプログラムを実行すると、次のような結果が出力されます。
add of ptr is 6422036 after adding add of ptr is 6422064
この結果を見ると、アドレスは 6422036 → 6422064 へと「28」増えています。これは、int型のサイズが一般的に4バイトであるため、7 × 4 = 28 バイトだけアドレスが前進したことを意味します。このように、ポインタの加算では「要素数 × データ型のサイズ」分だけアドレスが移動します。
C言語におけるポインタの減算
ポインタの減算は、ポインタ変数から値を引く操作です。ポインタ変数から数値を減算すると、その結果として新しいアドレスが得られます。加算の場合と同様に、実際に減少するのは「数値 × データ型のサイズ」分のバイト数です。
計算式は以下の通りです。
new_address = current_address - (number * size_of(data type))
サンプルコード
以下は、C言語でポインタの減算を行うプログラム例です。
#include<stdio.h>
int main(){
int num = 500;
int *ptr; // int型へのポインタ
ptr = # // num変数のアドレスを格納
printf("addr of ptr is %u \n", ptr);
ptr = ptr - 5; // ポインタ変数から5を減算
printf("after sub Addr of ptr is %u \n", ptr);
return 0;
}実行結果
上記のプログラムを実行すると、次のような結果が出力されます。
addr of ptr is 6422036 after sub Addr of ptr is 6422016
この場合、アドレスは 6422036 → 6422016 へと「20」減少しています。これも同様に、int型が4バイトであるため、5 × 4 = 20 バイトだけアドレスが後退したことになります。
まとめ
ポインタの加算・減算は、配列やメモリを直接扱う際に欠かせない基本的な操作です。ポイントを整理すると以下のようになります。
- ポインタに整数 n を加減算すると、アドレスは「n × sizeof(データ型)」バイトだけ移動する
- int型(4バイト)の場合、+1 で4バイト、-1 で4バイト移動する
- この性質により、ポインタを使って配列の各要素へ効率的にアクセスできる
ポインタ演算の挙動を正しく理解することで、C言語でのメモリ操作や配列処理をより安全かつ効果的に行えるようになります。
-
C言語入門:ポインタ配列とポインタへのポインタ(二重ポインタ)の基本をわかりやすく解説
はじめにC言語において、ポインタはメモリを直接扱える強力な機能です。本記事では、その応用形である「ポインタ配列」と「ポインタへのポインタ(二重ポインタ)」について、宣言方法・初期化方法・値へのアクセス方法を、サンプルコードと実行結果とともに順を追って解説します。 ポインタ配列とは通常の変数と同様に、ポインタも配列として宣言することができます。これを「ポインタ配列」と呼びます。各要素がそれぞれ別のアドレスを保持できるため、複数のデータを間接的に扱う際に便利です。 宣言方法データ型 *ポインタ名 [サイズ];例えば、次のように宣言します。int *p[5]; // int型の要素アドレスを5つ格納
-
具体例でわかる!C言語のvolatile型修飾子とrestrict型修飾子の使い方
型修飾子とは、C言語において既存のデータ型に特別な属性を付与するキーワードのことです。C言語には「const」「volatile」「restrict」の3種類の型修飾子が存在します。本記事では、このうちvolatileとrestrictについて、具体例を交えながらわかりやすく解説します。 volatile型修飾子とは volatile型修飾子は、「その変数が共有されている」ことをコンパイラに伝えるために使用します。つまり、変数をvolatile付きで宣言すると、その変数は他のプログラムやハードウェアなどの外部要因によって参照・変更される可能性があることを意味します。これにより、コンパイラはその