●学校情報

講座一覧・募集状況

学習方法

学習サポート

修了生の評価

受講生の横顔

当学院について

入学相談

入学手続

 

●講座情報

技術者養成講座

プログラミング講座

WEB講座

情報処理試験講座

Excel講座

Access講座

 

●関連コラム

関連コラム

関連用語集

 

logo

 

 

関連用語集

実は似ている!?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]」の関係をしっかり理解しながら、使い分けを体験して覚えていきましょう!