Study & Practice

北海道札幌市のプログラマによる技術とか雑記のブログ

C言語のポインタ

現在のプロジェクトではC/C++を使うということでCを先行して自習してるけど
案の定、初心者が悩むと言われているポインタ変数で少し詰まってしまった。

なので今回は自分用のポインタ学習資料としてまとめようと思う。

まずポインタ変数とはメモリのアドレスが入れられる変数のことで、ポインタ変数にはアドレスが値として入る。

ポインタ変数は

int *pointer;

というように変数の前に「*」をつけて宣言する。

そしてこのポインタ変数に値を代入するときは

int number = 0;
pointer = &number; 

というように値を代入した変数の前に「&」をつける必要がある。
上記で言うとnumberを初期化していなくてもエラーが発生することはないようだ。

アドレスをprintfで出力したい場合は

printf("%p\n", pointer);

というように%pを指定しなければならない。

ちなみに

printf("%p\n", &number);

としても同じ結果が得られる。


注意点としてはchar型で文字列を扱う場合やint型でも配列を使用する場合は使い方が少し異なる点である。

char型では

char string[] = "Hello World!";
char *pointer;
pointer = string;
printf("%p", pointer);

のようにポインタ変数に代入するときに「&」を付けないようにしなければならない。
「&」をつけるとエラーが発生してしまうので気をつけよう。

ポインタ変数で示されるアドレスの中に入っている値を取り出したい場合は

int number = 1;
int *pointer = number;
printf("%d", *pointer);

のようにポインタ変数の左に「*」をつけることでアドレス内の値が出力される。

ポインタの場合、配列で添字を指定して出力しようとするとエラーが起こるので

int array[] = {0, 2, 4, 6, 8};
int *pointer = array;
printf("%d",*(pointer + 1));

のようにアドレスの値に整数を足す形で配列の中身を出力する。

*pointer + 1

と指定しまうとポインタの指し示すアドレス内の値に1を足した数値が出力されてしまうので括弧でくくるのを忘れないこと

まとめ

・ポインタ変数とは変数のアドレスを格納する変数のこと。
・ポインタ変数を宣言するときは変数名の前に「*」をつけて宣言する。
・ポインタ変数に値を代入するときは変数名の左に「&」をつけて代入する。
・ポインタ変数内のアドレスをprintf()で出力したい場合は「%p」を指定する。
・int型の場合とchar型で文字列を扱う場合、int型の整数を扱う場合でポインタ変数に代入するやり方が少し違うので注意する。
・ポインタ変数に格納されている値を出力するときはポインタ変数名の左に「*」をつける。
・配列を扱う場合添字を指定するのではなくポインタ変数に数値を足してアドレスを指定する。このとき括弧でくくるのを忘れないこと


自分向けの備忘録と指定書いていることもあり箇条書き的で起承転結がなくなってしまっているので
定期的にリライトしてわかりやすい記事にして行こうと思う。