C言語のポインタについて詳しく知りたいな。どうやら、アドレスと関係があるみたいだけど、良く分からない…🤔
こちらの悩みを解決していきますね。
本記事の内容
・メモリとは?
・アドレスとは?
・ポインタとは?
・ポインタの性質
・ポインタの使い方
・変数とポインタはここが違う!
今回は、ポインタの解説だけですが、本質を知るにはこれだけの内容が必要になってきます💦
ご了承ください🙇♂️
この記事を書いている自分は情報系大学生で、三ヶ月ほどでC言語の基礎を完璧に理解しました。勉強中に分からないことが多く、一日中プログラミングしていたこともあります。
今では、ブログでC言語について解説しています。
今回はそんな経験をもとに解説していこうかと。
当サイトでは、覚えるべきところを全てまとめているので、画面を撮影して何度も読み返すことをおすすめします。
それでは、解説していきます!
メモリとは?
メモリとは、コンピュータの中の記憶装置のことです。
たとえば変数に値を代入したら、コンピュータはそれを記憶しておく必要がありますよね?
そういうときに、メモリを利用します。
こういったメモリに保存された情報をコンピュータはいくつも管理する必要があります。
変数には、使用制限が無いからです。また、過去に代入したものなど必要の無い情報がメモリ内にはたくさんあります。
そのため、メモリ内の管理方法にアドレスというものを利用しているのです。
アドレスとは??
アドレスとは、メモリにて割り振られている住所のことです。
これが、アドレスの最も簡単な説明ですが、もう少し詳しく説明していきますね。
下の画像をご覧ください。これがメモリのイメージです。
1つひとつのメモリに数字が割り振られていますね。この数字がアドレスです。
この中に変数に代入された値が記憶されます。この値は、アドレスとは別のものなので注意しましょう。
アドレスはあくまでも「住所」ですよ。
アドレスの性質
アドレスの性質は以下の3つです。
✔アドレスの性質
- アドレスは全て数字で表現される
- 変換書式(変換指定子)に%uを使う
- 変数のアドレスは&を付けて表現される
この3つは暗記しましょう!
変換書式(変換指定子)が良く分からない人は下の記事をどうぞ。
また、余裕のある人は次の2つを覚えてください。
✔アドレスの性質
- アドレスは1,2,3,4…のように連続的な値(途中で途切れることは無い)
- 変数のアドレスは、使われていないメモリをランダムで使っていく
- 配列のメモリは、使われていないメモリを連続的に使っていく
この辺りを覚えておけば問題ないですね。
もっとメモリについて知りたい人は、応用情報技術者試験を勉強してみましょう。下の本では、分かりやすいメモリの説明がされています。
そして、
アドレスを扱ったプログラミングをしたい!💪
この変数はどのアドレスに保存されるの?🤔
というときに、ポインタが必要になってきます。
それでは、本題に移ります。
ポインタとは?
ポインタとは、他の変数もしくは別のポインタのアドレスを参照するための特別な変数であり、これを使用すると参照したアドレスに代入されている値、アドレスの両方を調べることができます。
ポインタの性質は、変数とよく似ています。2つの違いを意識しながら読んでみて下さい。
ポインタの性質
✔ポインタの性質
- 変数と同じように、「値」と「アドレス」がある
- 他の変数の「アドレス」を調べて、ポインタ自身の「アドレス」に代入する機能がある
- 2.のとき、変数に代入されていた「値」もポインタ内に保存される
ポインタの性質は上の3つです。
画像を使って詳しく説明します。
ここでは、次の変数とポインタを使って説明していきますね。
✔説明で使用する変数とポインタの詳細
<変数>
名前:a
代入されている値:3
アドレスの値:43
<ポインタ>
名前:pa
代入されている値:aと同じ
アドレスの値:aと同じ
下の画像の通りです。
ポインタは、変数のアドレスをコピーすることで、変数と同じ値になっているのです。
ポインタの使い方
では、「どうしたら他の変数のアドレスを調べて、ポインタのアドレスに代入することができるのか?」という質問を解決します。
ポインタの使い方
ポインタの基本的な使い方をまとめます。
・ポインタも変数と同じように変数宣言をする必要がある
・ポインタは、「*pa」のようにアルファベットの前に「*」(ポインタ)をつけて表す
・ポインタも変数と同じように変数宣言をする
・アドレスは、「*」を外して表す
・「pa=&調べたい変数;」とすることで、他の変数を調べることができる
一番最後の行が難しいですが、変数ではアドレスを「&」を付けて表し、ポインタではアドレスを「*」を外して表すため、
pa=&調べたい変数
とすることで、他の変数を調べることができます。
実際に、ポインタで変数のアドレスを調べた後、ポインタのアドレスと値を出力するプログラムをつくってみましょう。
#include<stdio.h>
int main()
{
int a,*pa;
a = 3;
pa = &a;
printf("x=%u*x=%d",pa,*pa);
}
このようなコードを書きました。「a」という変数には3が代入されています。
では、出力していきましょう。
「3」という数字は「13630176」というアドレスに保存されているということが分かります。
【重要】変数とポインタはここが違う!
変数とポインタでは、代入された数値(代入される数値)、アドレスの表し方がそれぞれ異なります。
値、アドレスの表し方(変数)
変数での値の表し方:a(そのまま)
変数でのアドレスの表し方:&a(&付ける)
値、アドレスの表し方(ポインタ)
ポインタでの値の表し方:*pa(そのまま)
ポインタでのアドレスの表し方:pa(*取る)
例えば、ポインタ「*pa」に変数「a」のアドレスを代入したいときは
pa=&pa;
のように表します。
まとめ
ポインタの難しいところは、情報量の多さだと思います。実際はアドレスを参照するというだけで、大したことはしてないんです。
じゃあ、情報量の多さをどう克服するかと言ったら、「実際に自分でもプログラミングしてみる」というのが1番です。このサイトをブックマークして、何度も読み返すのもOKです。
次は、「値渡し」と「アドレス渡し」を勉強してみましょう。
コメント