【C言語】配列とポインタの違いを解説

この記事では、C言語における配列とポインタの違いについて解説します。

配列とポインタのメモリ上の配置やサイズの違い、関数への渡し方の違いについて理解することができます。

目次から探す

配列とポインタの違い

メモリ上の配置

配列とポインタは、メモリ上での配置が異なります。

配列は連続したメモリ領域に要素が格納されます。

一方、ポインタは単一のメモリアドレスを指し示し、そのアドレスに格納されているデータを参照します。

サイズの違い

配列のサイズは、要素の数によって決まります。

例えば、int型の要素を5つ持つ配列のサイズは、5 * sizeof(int)バイトとなります。

一方、ポインタのサイズは、プラットフォームに依存します。

通常は4バイトまたは8バイトです。

関数への渡し方の違い

配列は関数に渡す際には、配列そのものが渡されます。

つまり、関数内で配列の要素を変更すると、呼び出し元の配列も変更されます。

一方、ポインタは関数に渡す際には、ポインタの値(メモリアドレス)が渡されます。

関数内でポインタが指し示すメモリの値を変更すると、呼び出し元のポインタが指し示すメモリの値も変更されます。

配列とポインタの使い分け

配列の利点と適切な使用例

配列は、複数の要素を一括して扱うことができるため、データの集合を表現するのに適しています。

例えば、10個の整数を格納する配列を使用して、それらの整数の合計値を計算することができます。

#include <stdio.h>
int main() {
    int numbers[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int sum = 0;
    for (int i = 0; i < 10; i++) {
        sum += numbers[i];
    }
    printf("合計値: %d\n", sum);
    return 0;
}

上記の例では、配列numbersに10個の整数を格納し、forループを使用して合計値を計算しています。

ポインタの利点と適切な使用例

ポインタは、メモリ上の特定の場所を指し示すため、動的なメモリの確保やデータの操作に適しています。

例えば、動的にメモリを確保して、そのメモリをポインタで操作することができます。

#include <stdio.h>
#include <stdlib.h>
int main() {
    int* numbers = (int*)malloc(10 * sizeof(int));
    int sum = 0;
    for (int i = 0; i < 10; i++) {
        numbers[i] = i + 1;
        sum += *(numbers + i);
    }
    printf("合計値: %d\n", sum);
    free(numbers);
    return 0;
}

上記の例では、malloc関数を使用して10個の整数のためのメモリを動的に確保し、ポインタnumbersにそのアドレスを格納しています。

forループを使用して、ポインタを介してメモリ上の値にアクセスし、合計値を計算しています。

最後に、free関数を使用してメモリを解放しています。

配列とポインタは似たような概念ですが、使い分けることでプログラムの効率や柔軟性を向上させることができます。

配列は要素の数が固定されている場合や、データの集合を一括して扱う場合に適しています。

一方、ポインタは動的なメモリの確保やデータの操作が必要な場合に適しています。

適切な場面で使い分けることで、より効果的なプログラミングが可能となります。

目次から探す