【C言語入門】ポインタと配列の関係をわかりやすく解説|スケールファクタとは
ポインタと配列の基本的な関係
C言語では、コンパイラが配列のすべての要素に対して連続したメモリ領域を自動的に割り当てます。ここで重要になるのが「ベースアドレス」です。ベースアドレスとは、配列の先頭要素(0番目の要素)が格納されているメモリアドレスのことを指します。
例えば、次のように配列を宣言してみましょう。
int a[5] = {10, 20, 30, 40, 50};
この場合、5つの要素はメモリ上に以下のように順番に格納されます。

ここで変数「p」をint型へのポインタとして宣言すれば、次のいずれかの代入文によって、配列aの先頭アドレスをポインタに持たせることができます。
p = a; または p = &a[0];
配列名だけを書いた場合、それは先頭要素のアドレスを意味するため、どちらの書き方でも同じ結果になります。あとは「p++」でポインタを1つずつ進めていくことで、各要素へ順番にアクセスできます。
ポイントとなるのは、ポインタをインクリメントすると、その値は「ポインタが指すデータ型のサイズ」分だけ増えるという点です。この増加分のサイズは「スケールファクタ(scale factor)」と呼ばれます。たとえばint型が4バイトの環境では、p+1は実際には4バイト先のアドレスを指します。
ポインタpと配列aの関係は、以下のようになります(ベースアドレスを1000と仮定)。
P = &a[0] = 1000 P+1 = &a[1] = 1004 P+2 = &a[2] = 1008 P+3 = &a[3] = 1012 P+4 = &a[4] = 1016
このように、配列要素のアドレスは「添字(インデックス)」と「そのデータ型のスケールファクタ」から計算することができます。
アドレス計算の例
a[3] のアドレス = ベースアドレス + (3 × int型のスケールファクタ)
= 1000 + (3 × 4)
= 1000 + 12
= 1012
さらに、間接参照演算子「*」を使えば、ポインタ経由で配列要素の値を取得できます。つまり、次の等式が成り立ちます。
*(p+3) は a[3] の値を表す a[i] = *(p+i)
これは「添字によるアクセス」と「ポインタ演算によるアクセス」が完全に等価であることを示しています。C言語の配列操作を理解するうえで非常に重要な概念です。
サンプルプログラム
それでは実際に、ポインタを使って配列の要素を入力・表示するプログラムを見てみましょう。
#include<stdio.h>
int main(void) {
int a[5];
int *p, i;
printf("5つの整数を入力してください: ");
for (i = 0; i < 5; i++)
scanf("%d", &a[i]);
p = &a[0]; /* ポインタpに配列の先頭アドレスを代入 */
printf("配列の要素は以下の通りです: ");
for (i = 0; i < 5; i++)
printf("%d ", *(p+i));
return 0;
}
実行結果
5つの整数を入力してください: 10 20 30 40 50 配列の要素は以下の通りです: 10 20 30 40 50
まとめ
- コンパイラは配列の全要素を連続したメモリ領域に配置する
- 配列名は先頭要素のアドレス(ベースアドレス)を表す
- ポインタを1つ進めたときの増加量は、指すデータ型のサイズ(スケールファクタ)に依存する
- a[i] と *(p+i) は完全に等価である
-
C言語の文字操作を徹底解説!宣言方法と入出力関数の使い方
Cプログラミング言語において、文字(character)は英大文字(A〜Z)、英小文字(a〜z)、数字(0〜9)、空白(ホワイトスペース)、または特殊記号のいずれかとして扱われます。文字の宣言方法C言語で文字型変数を宣言する際は、char 型を使用します。文字定数はシングルクォーテーション( )で囲んで指定します。char a = A; /* 文字定数を使用した宣言 */このように宣言することで、変数 a に1文字分のデータを格納できます。文字入出力関数の種類C言語には、文字を入出力するための関数がいくつか用意されています。代表的なものは以下の3組です。scanf / printf: 書式指定
-
C言語のソート手法を徹底解説!バブルソートの仕組みと実装例
問題C言語にはどのようなソート手法があるのか?また、そのうち1つを選んで具体例とともに説明しなさい。 解答C言語では、主に以下の5つのソート手法が用いられます。 バブルソート(交換ソート) 選択ソート 挿入ソート(線形ソート) クイックソート(分割交換ソート) マージソート(外部ソート) バブルソートとはバブルソートは最もシンプルなソート手法であり、「交換ソート」とも呼ばれます。隣接する要素同士(または基準要素と他の要素)を比較し、順序が正しくなければ入れ替えることを繰り返すことで、リスト全体を昇順に並べ替えます。 基本の手順 先頭の要素を残りのすべての要素と比較し、順序が正しくなければ