day3_ポインタ変数の初期化
勉強しては触るのサボって忘れて、勉強しては触るの忘れてを繰り返すポインタ
ポインタ変数ってなんか初期化のときとそれ以外でなんか違う動きしない? というのが毎回混乱の原因だと思ったので、今回はそれを文字にしておきたい。
こちらによると
ポインタ変数の宣言(初期化)時には、「*」を付けてアドレスにアクセスします。 それ以外で「*」を付けると、アドレス先の値を扱います。 「*」を付けないとアドレスを扱います。 宣言時と代入時とで感覚的に逆になるので注意しましょう。
あーこれだこれだ。コレのせいでいつもポインタが理解したつもりなのに混乱してたんだ。 宣言時に合わせて初期化するなら、代入するのはアドレスね。 *つけてるから、なんとなく参照先に値を入れるイメージが合った。
int pnt2() {
int i = 1;
int* pointer = &i;
// 1
printf("%d\n", *pointer);
return 0;
}
あと、宣言したポインタ変数は初期化されずに使うことは出来ない、というのもなんとなく忘れがち。
int pnt() {
int* pointer;
*pointer = 10;
printf("%d\n", *pointer);
return 0;
}
この場合、変数 pointer は宣言はされているものの初期化されておらず、メモリ上のアドレスの値が定まっていないため
*pointer = 10;
で値を代入することが出来ない。 ポインタ変数はポインタなんだからアドレスを入れてやらないとね。
int pnt2() {
int* pointer;
int i = 1;
pointer = &i;
// 1
printf("%d\n", *pointer);
return 0;
}
おまけ。 ポインタ変数は宣言時にNULLで初期化出来るらしい。 この場合、ポインタ変数には0が代入されるが、当然このままでは参照先も何もないため利用できない。
が、この状態でprintf等で値を参照すると、NullPointerExceptionとしてエラーが発生する。
いわゆる ぬるぽ というやつか。