ポインタを堀り下げるその1
配列とポインタその2 - Shammerism以来になるが、またポインタを少しやる。というか、もうちょっと堀り下げていきたいと思う。ポインタも最初は簡単。しかし、どこかのタイミングでよくわからなくなる。それがどこなのかはよくわからないが。
変数に&をつけると、メモリアドレスを表すようになる、というのはポインタ以前からやっている。そして、実際にポインタを宣言するには変数の前に*をつけて変数を宣言する。*が付与された変数はメモリアドレスを格納するための変数、つまり、ポインタになる。以下、簡単な例。
#include <stdio.h> main() { int a; int *aPtr; a = 7; aPtr = &a; // Set a's memory address to aPtr printf("a's address is %p.\n", &a); printf("aPtr value is %p.\n", aPtr); printf("a's value is %d.\n", a); printf("*aPtr value is %d.\n", *aPtr); printf("&*aPtr = %p.\n", &*aPtr); printf("*&aPtr = %p.\n", *&aPtr); return 0; }
この例からは以下のことがわかる。
- 変数に&をつけるとその変数のメモリアドレスになる
- *と&は打ち消す
- printf の %p は printf でどのように表記するかということを意味しているだけで、実際の変数の型とは関係ない。
また、以下のようにすると変数に値を代入できない。
&a = 8;
こうすると、以下のエラーが出た。
error: lvalue required as left operand of assignment
左辺は lvalue でないといけないらしい。lvalue って何かよくわからないけれど。この時点でよくわかっていないかも。。。