実は似ている!?C言語の「ポインタと配列の関係」をやさしく解説!
C言語を学んでいると、「ポインタと配列は似ている」と聞くことがあります。
実際、配列の名前は先頭要素のポインタと同じように扱うことができます。
本記事では、ポインタと配列の違いと共通点を初心者向けにわかりやすく解説します。
配列の基本
int a[3] = {10, 20, 30};
printf("%d\n", a[0]); // → 10
配列では、添字(インデックス)を使って各要素にアクセスします。
ポインタの基本
int *p = a; // a は a[0] のアドレス(先頭要素)と同じ
printf("%d\n", *p); // → 10
printf("%d\n", *(p + 1)); // → 20
配列名 a
は実は「a[0] のアドレス」を意味します。
ポインタと配列の共通点
a[i]
は *(a + i)
と同じ意味
p[i]
は *(p + i)
と同じ意味
- 配列名は暗黙的にポインタとして扱える
比較:配列とポインタの違い
項目 |
配列 |
ポインタ |
メモリの確保 |
固定長で自動的に確保される |
malloc で動的に確保することも可能 |
再代入 |
できない(a = 〜 はエラー) |
できる(p = &b[0] など) |
sizeofの挙動 |
配列全体のサイズ |
ポインタのサイズ(4または8バイト) |
例:ポインタで配列をループ処理
int data[] = {1, 2, 3, 4, 5};
int *ptr = data;
for (int i = 0; i < 5; i++) {
printf("%d ", *(ptr + i)); // → 1 2 3 4 5
}
応用:関数に配列を渡す
void printArray(int *arr, int size) {
for (int i = 0; i < size; i++) {
printf("%d\n", arr[i]); // ポインタとして扱える
}
}
配列を関数に渡すとき、int arr[]
でもint *arr
でもOKです(どちらもポインタとして扱われる)。
まとめ
配列名は先頭要素のポインタと同じように使えるため、ポインタと配列は非常に近い存在です。
ただし、メモリの扱い方や再代入の可否など違いもあります。
初心者の方は、「*(a + i)
= a[i]
」の関係をしっかり理解しながら、使い分けを体験して覚えていきましょう!