C言語のポインタと配列の違いとは?初心者でも理解できるポインタと配列の関係をやさしく解説
生徒
「C言語を勉強していたら、ポインタと配列ってよく一緒に出てきます。これって同じものなんですか?」
先生
「見た目が似ているので同じように思われがちですが、実は役割が違います。ポインタは『メモリの場所を指す変数』で、配列は『同じ型のデータを並べて保存する入れ物』です。」
生徒
「なるほど。でも、配列の名前を使うとポインタみたいに扱えるって聞いたことがあります。」
先生
「その通りです。C言語では配列とポインタは密接な関係があります。この記事では、初心者でも理解できるようにポインタと配列の違いをやさしく説明していきます。」
1. C言語のポインタとは?
C言語のポインタとは、メモリ上のアドレス(場所)を保存するための変数です。
メモリとは、コンピュータがデータを一時的に保存する場所のことです。プログラムで作った変数は、このメモリのどこかに保存されています。そして、その場所にはアドレスという番号が付いています。
ポインタは、このアドレスを保存する特別な変数です。
たとえば次のプログラムを見てみましょう。
#include <stdio.h>
int main()
{
int a = 10;
int *p;
p = &a;
printf("aの値: %d\n", a);
printf("aのアドレス: %p\n", &a);
printf("ポインタpの値: %p\n", p);
return 0;
}
ここで登場する&aは変数aのアドレスを取得する演算子です。そしてポインタ変数pは、そのアドレスを保存しています。
つまりポインタはデータそのものではなく、データの場所を覚えている変数です。
2. C言語の配列とは?
配列とは、同じ型のデータを連続して保存するための仕組みです。
たとえばテストの点数を5人分保存する場合、変数を5個作るより配列を使う方が便利です。
#include <stdio.h>
int main()
{
int score[5] = {70, 80, 90, 60, 75};
printf("%d\n", score[0]);
printf("%d\n", score[1]);
printf("%d\n", score[2]);
return 0;
}
このscore[5]が配列です。配列では添字(そえじ)という番号を使ってデータを取り出します。
添字とは、配列の何番目のデータかを示す番号です。C言語では0から番号が始まるという特徴があります。
つまりこの配列の並びは次のようになります。
- score[0] → 70
- score[1] → 80
- score[2] → 90
配列は、同じ種類のデータをまとめて管理するための仕組みです。
3. ポインタと配列の決定的な違い
ポインタと配列は似ている部分もありますが、役割ははっきり違います。
| 種類 | 役割 |
|---|---|
| ポインタ | メモリのアドレスを保存する変数 |
| 配列 | 複数のデータを連続して保存する入れ物 |
簡単に例えると次のようになります。
- 配列 → 本棚
- ポインタ → 本棚の場所を示すメモ
本棚には本が並んでいますが、ポインタはその本棚の場所を書いたメモのようなものです。
4. 配列名はポインタとして使える
C言語では、配列名は配列の先頭アドレスを表します。つまり配列名はポインタのように扱うことができます。
次の例を見てください。
#include <stdio.h>
int main()
{
int data[3] = {10, 20, 30};
printf("%p\n", data);
printf("%p\n", &data[0]);
return 0;
}
このプログラムでは、dataと&data[0]が同じアドレスになります。
つまり配列名は配列の最初の要素のアドレスを意味しています。
この仕組みがあるため、C言語では配列とポインタが深く関係しているのです。
5. ポインタを使って配列の値を取り出す
ポインタを使うと、配列の値を取り出すこともできます。
次のプログラムを見てください。
#include <stdio.h>
int main()
{
int numbers[3] = {5, 10, 15};
int *p;
p = numbers;
printf("%d\n", *p);
printf("%d\n", *(p + 1));
printf("%d\n", *(p + 2));
return 0;
}
*pはポインタが指している場所の値を取り出す操作です。これをデリファレンスと呼びます。
また(p + 1)のようにすると、ポインタは次の要素へ移動します。これはポインタ演算と呼ばれる仕組みです。
このようにポインタを使うと、配列を効率よく操作することができます。
6. 配列とポインタの書き方の違い
配列とポインタは書き方も違います。
int array[5];
int *pointer;
配列は[]を使って宣言します。一方ポインタは*を使って宣言します。
また次のような違いもあります。
- 配列 → サイズが固定
- ポインタ → 指す場所を変更できる
つまり配列は作ったあとサイズを変えられませんが、ポインタは別のアドレスを指すように変更できます。
7. 初心者が混乱しやすいポイント
C言語を学び始めた人がよく混乱するポイントは、「配列とポインタは同じなのか」という点です。
結論としては似ているが同じではないです。
理由は次の通りです。
- 配列はデータを保存する領域
- ポインタはアドレスを保存する変数
ただし配列名は先頭アドレスとして扱われるため、ポインタと似た使い方ができます。
この仕組みを理解すると、C言語のポインタや配列の仕組みが一気に理解しやすくなります。
まとめ
ポインタと配列の違いをもう一度整理しよう
ここまで、C言語におけるポインタと配列の違いについて解説してきました。C言語の学習を始めたばかりの初心者が最初につまずきやすいテーマの一つが「ポインタ」と「配列」です。どちらもメモリやアドレスという概念と深く関係しているため、最初は難しく感じるかもしれません。しかし、基本的な仕組みを理解すると、C言語のプログラミングは一気に理解しやすくなります。
C言語のポインタとは、メモリのアドレスを保存するための特別な変数です。つまりポインタは「データそのもの」を持っているのではなく、「データが保存されている場所」を覚えている変数です。一方、配列は同じ型のデータを連続したメモリ領域に保存する仕組みです。配列は複数の値をまとめて管理できるため、プログラムの中で大量のデータを扱うときにとても便利な仕組みです。
C言語のポインタと配列の違いを理解するうえで重要なのは、「役割の違い」です。ポインタはメモリの場所を指す変数であり、配列はデータを保存する領域です。この違いを理解しておくことで、C言語のメモリ管理、ポインタ操作、配列処理、関数へのデータ渡しなど、多くの重要な概念が理解しやすくなります。
また、C言語では配列名が配列の先頭アドレスとして扱われるという特徴があります。この仕組みのため、配列とポインタはとても似た動きをすることがあります。たとえば配列名をポインタ変数に代入したり、ポインタ演算を使って配列の要素にアクセスしたりすることが可能です。この仕組みはC言語の重要な特徴であり、効率的なプログラムを書くために欠かせない知識です。
C言語のポインタと配列の重要ポイント
C言語のポインタと配列を理解するために、次のポイントを覚えておくとよいでしょう。
- ポインタはメモリのアドレスを保存する変数
- 配列は同じ型のデータを連続して保存するデータ構造
- 配列名は配列の先頭アドレスとして扱われる
- ポインタ演算を使うことで配列の要素にアクセスできる
- 配列はサイズ固定だが、ポインタは指す場所を変更できる
これらのポイントを理解しておくと、C言語のポインタと配列の違いがより明確になります。また、C言語のポインタは配列だけでなく、関数ポインタ、構造体ポインタ、動的メモリ確保など、さまざまな高度なプログラミング技術でも利用されます。そのため、ポインタの基本をしっかり理解しておくことは非常に重要です。
C言語のポインタと配列を確認するサンプルプログラム
ここで、ポインタと配列の関係を確認する簡単なC言語のサンプルプログラムを見てみましょう。このプログラムでは、配列の先頭アドレスをポインタに代入し、ポインタを使って配列の要素を取り出しています。
#include <stdio.h>
int main()
{
int numbers[3] = {100, 200, 300};
int *ptr;
ptr = numbers;
printf("配列の先頭アドレス: %p\n", numbers);
printf("ポインタの値: %p\n", ptr);
printf("1番目の値: %d\n", *ptr);
printf("2番目の値: %d\n", *(ptr + 1));
printf("3番目の値: %d\n", *(ptr + 2));
return 0;
}
このプログラムでは、配列numbersの先頭アドレスがポインタptrに代入されています。そして、ポインタを使って配列の各要素にアクセスしています。*(ptr + 1)のような書き方はポインタ演算と呼ばれ、配列の次の要素へ移動することができます。
このようにC言語では、ポインタを使うことで配列の要素を柔軟に操作することができます。特に、ループ処理や関数に配列を渡す処理では、ポインタを利用したプログラムがよく使われます。
実行結果
配列の先頭アドレス: 0x7ffee2c1
ポインタの値: 0x7ffee2c1
1番目の値: 100
2番目の値: 200
3番目の値: 300
この実行結果を見ると、配列の先頭アドレスとポインタの値が同じであることが確認できます。つまり配列名は配列の最初の要素のアドレスを表しているということです。この仕組みを理解すると、C言語のポインタと配列の関係がよりはっきりと理解できるようになります。
生徒
「今日の記事で、C言語のポインタと配列の違いが少し分かってきました。ポインタはアドレスを保存する変数で、配列はデータをまとめて保存する場所なんですね。」
先生
「その通りです。C言語のポインタはメモリの場所を扱う仕組みで、配列はデータを並べて保存する仕組みです。この違いを理解することが、C言語プログラミングの基礎になります。」
生徒
「でも配列名がポインタみたいに使えるところが、少しややこしいですね。」
先生
「確かにそこは初心者が混乱しやすいポイントです。しかし、配列名は配列の先頭アドレスを表すというルールを覚えておけば理解しやすくなります。C言語ではこの仕組みを利用して効率的なプログラムを書くことができます。」
生徒
「なるほど。つまり配列とポインタは同じではないけれど、関係がとても深いんですね。」
先生
「その理解で正しいです。C言語ではポインタと配列の関係を理解することで、配列操作、ポインタ演算、関数への配列の受け渡し、さらにはメモリ管理など、多くの重要なプログラミング技術を学ぶことができます。基礎をしっかり身につけていきましょう。」
生徒
「はい。これからはポインタと配列の違いを意識しながら、C言語のプログラムを書いてみます。」