ポインタを理解する
苦しんで覚えるC言語、通称「苦C」を最近読んでいる。
道中「はいはい他の言語でやった」と飛ばして、今Cの代名詞とも言えるポインタに入った。
今までやってきた言語(javascript,PHP)ではメモリなんて一切考えたことがなかったから、なかなか興味深い。
要するに、メモリの住所を指定するサムシングなのね。と何となーくの認識で読んでたら(ちゃんと理解せずに読み進めてたら意味ないぞ)この節で
引数による情報の受け渡し
C言語では、関数へ情報を渡す場合、必ず元の変数の値のコピーを渡します。
この様な方法を値渡しと呼び、元の変数の値が変更されないことが特徴です
えっそうなの!!?
ということで試しに簡単なコードを書いてみた。
関数で変数に10を足して表示させるだけ。
#include <stdio.h> void func(int num); int main(void) { int num = 1; printf("%d\n",num); //実行結果1行目 func(num); //↓の関数を実行。numに10足して結果表示 printf("%d\n",num); //実行結果3行目 return 0; } void func(int num) { num += 10; printf("%d\n", num); //実行結果2行目 return; }
実行結果
1 11 1
わ、本当だ!mainの中の変数は変わってない!!
次に、上の苦Cの通り変数をポインタ変数に変えてみた。
#include <stdio.h> void func(int *num); //引数宣言時にポインタ変数を宣言 int main(void) { int num = 1; //ここは普通の変数でいい。らしい printf("%d\n",num); func(&num); //変数の”アドレス"を代入することでポインタ変数を代入になる。らしい printf("%d\n",num); return 0; } void func(int *num) { *num += 10; //ポインタ変数を通常変数にして10足す printf("%d\n", *num); //通常変数を出力 return; }
1 11 11
おおー、ちゃんと上書きされてる。
ポインタの必要性わかってきたぞ。ポインタを制すればCを制すって聞いたことある(多分ない)し行ける気がするぞ。
と、思って読み進めたら配列だとまた挙動が変わってくるとか、、、
まだ道のりは長そうだ、これはまた次回