この記事では、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関数
を使用してメモリを解放しています。
配列は要素の数が固定されている場合や、データの集合を一括して扱う場合に適しています。
一方、ポインタは動的なメモリの確保やデータの操作が必要な場合に適しています。
適切な場面で使い分けることで、より効果的なプログラミングが可能となります。