![見出し画像](https://assets.st-note.com/production/uploads/images/86621853/rectangle_large_type_2_e6dbd6a4ec1379a9ffa95207a304cc79.png?width=800)
【C言語】ポインタのことを説明してみましょう
コンピュータにはメモリが必要です。メモリにデータを格納し演算することで、様々な動作を実現します。
メモリにはアドレスが割り振られています。
こんな感じ。
![](https://assets.st-note.com/img/1662810062219-Razcna6pDw.png?width=800)
例えば、プログラムで
char x = 13;
と書くと、空いているメモリから1バイト確保して割り当てます。
![](https://assets.st-note.com/img/1662811935932-ozxiRAKu7B.png?width=800)
「x」はメモリの中の値で、
「&x」はそのアドレスです。
![](https://assets.st-note.com/img/1662812188610-F462hpbi5S.png?width=800)
C言語にはさらに、ポインタ変数というものがあります。
「char」型のポインタの場合
char*
と書きます。
char* px = &x;
と書くと、空いているメモリから32bitを確保して割り当てます。
例えばこんな風に。
![](https://assets.st-note.com/img/1662816677053-FUtm6A0IFy.png?width=800)
「x」と「px」の間をあけたことにあまり意味はないんだけど、昨今のCPUは4で割りきれないアドレスに4バイトのデータを割り当てることはあまりありません。
「x」と「px」は次のような感じになります。
![](https://assets.st-note.com/img/1662818365341-AhmgHSAEsN.png?width=800)
「px」には「&x」を設定したので、これらは同じ値ですね。
もう一つ、「*px」はここを指します。
![](https://assets.st-note.com/img/1662818572695-A70KAhqpuE.png?width=800)
「x」も「*px」も、同じメモリを指し、同じ値となります。
x = 14;
などとすれば
![](https://assets.st-note.com/img/1662818773788-zSn21aWhM3.png?width=800)
となるわけですが、「*px」も同じメモリを指しているので、当然のことながら「*px」も「14」になります。
どんなデータもメモリに格納され、メモリはアドレスで区別されるわけですが、ポインタ変数というのはその「アドレスを格納するための領域」ということです。
もちろん、
*px = 15;
と書けば
x = 15
となります。
では、
px = (char*)0x075BCD17;
と書くとどうなるでしょう。
「*px」も移動します。
![](https://assets.st-note.com/img/1662818964159-eawjJ0W03B.png?width=800)
*px = 56;
とすると、ここが変化します。
![](https://assets.st-note.com/img/1662819085164-dsk8U2MHA4.png?width=800)
「px」はどんな値にでもできます。
ということは、「*px」はどこでもアクセスできるわけです。
アドレス「0x00000000」の中を変更することもできるし、
アドレス「0xFFFFFFFF」の中を変更することもできます。
ポインタがコワイと言われる所以ですね。
さて。
では、この「ポインタ変数」。
いったい何に使うのでしょうか。
それは・・・・。
また次回。
この記事が気に入ったらサポートをしてみませんか?