Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

C言語におけるポインタと配列の違いを徹底解説!基本からサンプルコードまで

はじめに

C言語において「ポインタ」と「配列」は非常によく似た挙動を示すため、初心者が混同しやすい概念の一つです。しかし、両者はメモリの扱い方や性質がまったく異なります。本記事では、それぞれの特徴を具体例とともに解説し、違いを明確にしていきます。

ポインタとは

ポインタとは、別の変数のアドレス(メモリ上の場所)を格納するための変数です。変数にメモリが割り当てられると、ポインタはその変数が配置されたメモリアドレスを指します。ポインタ変数を宣言する際には、単項演算子「*(間接参照演算子)」を使用します。

ポインタ宣言の構文

データ型 *変数名;

ここで、「データ型」には int や char、float など対象となる変数の型を指定し、「変数名」には任意の名前を指定します。

ポインタのサンプルプログラム

#include <stdio.h>
int main () {
    int a = 8;
    int *ptr;
    ptr = &a;
    printf("Value of variable a: %d\n", a);
    printf("Address of variable a: %d\n", ptr);
    return 0;
}

このプログラムでは、変数 a のアドレスをポインタ ptr に代入して表示しています。実行結果は以下のようになります。

Value of variable a: 8
Address of variable a: -2018153420

※ アドレスとして表示される数値は、実行環境や実行のたびに変わる点に注意してください。

配列とは

配列とは、同じ型の要素を連続したメモリ領域に並べて格納したものです。配列内で最も小さいアドレスが先頭の要素に対応し、最も大きいアドレスが末尾の要素に対応します。また、配列の添字(インデックス)は 0 から始まり、「配列のサイズ − 1」で終わる点に注意が必要です。

配列宣言の構文

型 配列名[配列サイズ];

「配列名」には任意の名前を、「配列サイズ」には格納する要素数を指定します。

配列のサンプルプログラム

#include <stdio.h>
int main () {
    int a[5];
    int i,j;
    for (i = 0;i<5;i++) {
        a[i] = i+100;
    }
    for (j = 0;j<5;j++) {
        printf("Element[%d] = %d\n", j, a[j] );
    }
    return 0;
}

このプログラムでは、5つの int 型要素を持つ配列 a を宣言し、各要素に値を代入して順番に表示しています。実行結果は以下の通りです。

Element[0] = 100
Element[1] = 101
Element[2] = 102
Element[3] = 103
Element[4] = 104

ポインタと配列の主な違い

項目ポインタ配列
役割他の変数のアドレスを格納する同じ型の複数の値を連続領域に格納する
メモリ確保アドレスを保持する分だけの領域が必要宣言時に全要素分の領域が確保される
再代入別のアドレスを指すように変更可能先頭アドレスは固定で変更不可
sizeof 演算子ポインタ自体のサイズを返す配列全体のサイズを返す

まとめ

ポインタは「アドレスを扱う変数」、配列は「同種のデータをまとめて管理する仕組み」であり、似ているようで本質的に異なる機能です。ただし、C言語では配列名が式の中で先頭要素へのポインタに読み替えられる場面が多いため、両者の関係を正しく理解しておくことが重要です。

  1. C#の配列とリスト(List)の違いとは?特徴と基本的な使い方を解説

    C#における配列(Array)とリスト(List<T>)は、どちらも複数のデータをまとめて扱うためのコレクションですが、その性質には重要な違いがあります。 配列とリストの主な違い 配列は、生成時にサイズが固定される、同じ型の要素を順番に格納するコレクションです。一度作成した後は要素数を変更できません。 一方、Listはジェネリックコレクションであり、要素の追加や削除に応じてサイズが自動的に拡張・縮小します。この柔軟性が最大の特徴です。 項目配列List<T> サイズ固定可変(動的) 要素の追加不可(再作成が必要)Addメソッドで可能 宣言方法型[] 変数名Lis

  2. GoとJavaの違いを徹底比較!特徴と使い分けのポイント

    プログラミング言語を選ぶ際、「Go」と「Java」のどちらを採用すべきか迷う開発者は少なくありません。どちらもGoogleや企業システムで広く使われる人気言語ですが、設計思想や言語仕様には大きな違いがあります。本記事では、それぞれの言語の特徴を解説したうえで、両者の主な違いを比較表を使ってわかりやすく整理します。 GoとはGoはGoogleが開発した手続き型(プロシージャル)プログラミング言語です。プログラムはパッケージ単位で構成され、シンプルで読みやすいコード記述を重視した設計になっています。動的言語に近い柔軟なパターンを取り入れつつ、静的型付けによる安全性も兼ね備えています。また、軽量スレ