ちゅーりんぐくんの備忘録

C言語のポインタ周りに関するまとめ

変数宣言をするとメモリのある領域が確保される.

代入するとメモリ領域の指定番地に情報が書き込まれる.

取得することでメモリ領域の指定番地から情報を読み出すことができる.

 

アドレスを取得する際には &変数 で獲得することができる

たとえばアドレス情報を格納するときにlongを使うとする.

long people = 64873437;

long people_a = (long)&people;

このようにしてしまうとアドレス情報とデータの区別がつきにくくなってしまうので実際はlongなどの型は用いない

ではアドレスを格納する変数の宣言はどのようにするのか.以下のようになる.

void* 変数名

これは通常のvoidとはまったく関係がない

このようにアドレス情報が格納される型をポイント型という. 

しかしvoid*型の変数の先頭のアドレスしか格納されていない.

 

よって実際にはint*型などを用いることが多い.

もともとのint型は4byte領域なのでint*型にすると先頭アドレスから4byte分取り出される.

 

アドレスに実際書きこまれている情報を取り出すときは *ポインタ変数名 でとりだす

int a = 46;

void* add = (void*)&a; とする

この時プリント文で出力すると以下のようになる

a->46

add -> 3921283492

 

*add -> 46

このことから実質的にaと*addは同じものである

 

ポインタの存在意義を問われるとやはり一番に言えるのはメモリの節約により高速に動作する関数が欠けることであろう.

例えばある変数 int a = 100; というものを関数などに直接渡したら,300バイトぐらいの領域を使うことになる.しかしあのアドレスすなわち &aのみを渡せば,たったの4バイトですむ.直接値などを渡す方法を値渡しといい,アドレスだけを渡す方法をポインタ渡しという.