ポインタについて(1) 概要・宣言・代入・参照

C初心者には難関といわれるポインタについて勉強したいとおもいます。

ポインタってなによ??

僕がリファレンス的な教科書として使っている『C言語プログラミング』によると、

ポインタはメモリアドレスを値としてもつ変数

とのことです。

ようするに、データそのものではなく、データが格納されている変数のメモリ番地を値としてもっている変数がポインタ
ということのようです。

変数は直接的に値を参照し、ポインタは関節的に値を参照することができます

ポインタを介して値を参照することを関節参照といいます。

ポインタの宣言のしかた

//int型の値が格納されているメモリ番地を示すポインタを宣言
int *pointer;

型宣言の中で変数名のまえに*を付けると、その変数はポインタになる

ポインタは必ず初期化すべし

ポインタの初期値として使えるのは以下のいづれ

  • 0
  • NULL
  • アドレス

0もしくはNULLで初期化されたポインタを”NULLポインタ”や”空ポインタ”と呼ぶ。

アドレスの代入の仕方

int n = 123;
int *p;

//変数nのアドレスをポインタpに代入する
p = &p;

変数の前に"&"をつけると、その変数のアドレスを取得することができるようです。

関節参照の仕方

ポインタが示すアドレスに格納されているデータを参照するには以下のようにする。

printf("%d\n", *p); //"123"が出力される

ポインタが示すアドレスを参照したい場合は以下のようにします。

printf("%p\n", p); //16進数で表されたアドレスが出力される
int n = 346;
int *p;

p = &n; //nのアドレスをpに代入

//nのアドレスとpに代入されたアドレスは同じ
printf("%p\n", &n); //0065FE00
printf("%p\n", p); //0065FE00

注意事項

宣言で使用されている"*"と、式の中で使われる"*"は別のもの。

  • 変数宣言での"*"は、宣言した変数がポインタであることを示す。
  • 式の中での"*"は関節参照をするための演算子

次回

次はポインタ式と、ポインタ演算/ポインタと配列について勉強します。