【C言語】ポインタについて丁寧に解説
今回は、C言語の最初の難関ポイントともいわれる、
「ポインタ」
について解説します。
ポインタは構造体や配列にも頻繁に絡んでくるものなので、
理解しておかないと先に進めません。
では、ポインタの前に、まず変数の理解を深めます。
Contents
変数とは
「変数」とは、よく言われるのが、値を入れる箱のようなものという説明です。
たしかにそうなんですが、
個人的にもっとイメージがしやすいのが、人を入れる家。
変数が家、値が人。
そんなイメージです。
たとえば、
a = 5;
という式。
メモリ上にある変数aに5という値を代入しています。
家が住所で識別されているように、プログラムでは変数はメモリ上のアドレスによって識別されています。
ポインタ
変数について軽く説明したところで、次はポインタについてです。
ポインタは、変数をアドレスから指定する方法です。
#include <stdio.h>
int main (void)
{
int a;
int *p;
p = &a;
a = 5;
printf ("%d\n", a);
printf ("%d\n", *p);
return 0;
}
int型の変数aと、int型のポインタ変数pがあります。
ポインタ変数pにはaのアドレスを代入します。
そして、変数aに5を代入して、aとpを表示すると…
どのような結果になるでしょうか?
正解は…
このように、5が2回表示されます。
中々イメージしづらいですよね。
試しに、*pではなく、pの中身は何なのか、表示してみましょう。
#include <stdio.h>
int main (void)
{
int a;
int *p;
p = &a;
a = 5;
printf ("%d\n", a);
printf ("%d\n", *p);
printf ("%d\n", p); // 追加分
return 0;
}
結果は…
5が2回表示された後、よく分からん数字が表れました。
これが、変数aのアドレスです。
改めて、ポインタとは
ポインタとは、変数そのものではなく、変数が入っているアドレスへアクセスする手段です。
int a;
int *p;
p = &a;
この3行が何を意味するか、もう一度考えてみましょう。
int a;はint型変数aの宣言です。
int *p;は、int型のポインタ変数pの宣言です。
p = &aは、変数aのアドレスをポインタ変数であるpに代入しています。
printf (“%d\n", *p);とすれば、ポインタ変数pが指しているアドレス上の変数の中身を表します。
printf (“%d\n", p);とすれば、ポインタ変数pが指すアドレスそのものを表します。
もう1つ例を出しましょうか。
#include <stdio.h>
int main (void)
{
int a;
int *p;
p = &a;
a = 2021;
*p = 2022;
printf ("%d\n", a);
return 0;
}
ここで問題です。
画面にはなんと表示されるでしょうか?
2021と表示されるか、2022と表示されるか。
正解は…
はい、2022と表示されます。
ぱっと見ただけだと、変数aに2021を入れて、それ以降何も触っていないのに何で…?
となりそうですが、
*p = 2022;
とすることで、ポインタ変数pが示すアドレス上の変数aの中身を2022に書き換えることができちゃうんです。
まとめ
- 変数はアドレス上に用意される箱(家)
- ポインタ変数は変数のアドレスを代入する
- printf (“%d\n", *p);と書くことで、ポインタ変数に入っているアドレス上の変数の値を表示できる
- printf (“%d\n", p);とすると、ポインタ変数に入っているアドレスが表示される
- ポインタ変数を使うことで、メモリのアドレス上の変数の値を書き換えることができる
C言語ではポインタは非常に重要です。
最初の躓きポイントですが、これが理解できると、かなりプログラムに柔軟性を持たせることができます。
参考書などに載っている練習問題などを使って、さらに理解を深めることをおすすめします!
他にもC言語の記事があるので、よかったら参考にしてみてください。
最後までお読みいただき、ありがとうございました。