スラッシュドットでこんな記事が話題になっていた。
えーと、
-
- ポインタは、どこかを指し示しているモノである。
- ポインタは、指し示しているだけで、その先の領域を確保してくれるわけではない。
- ポインタ自身も、ポインタが指し示している先も、普通はメモリ上に存在する。
- ポインタの宣言には * をつける。 int *p; と書くと、p は int 型のポインタ。
- pはメモリ上のどこかに存在していて、そのアドレスは &p。つまりポインタp自身も変数。
- pはメモリ上のどこかを指し示していて、指し示している先のアドレスが p。int i=5; で宣言されたメモリの領域を指し示すためには p = &i として i のアドレスをポインタに代入する。
- 指し示している先のアドレスにある値は *p で得られる。この場合、*p は 5。
- ここで p は int型へのポインタなので、(p+1) は sizeof(int) 分増える。
int main(void)
{
int i=5;
int *p;
p = &i;printf( " i = %d\n", i );
printf( "*p = %d\n", *p );
printf( "&i = %p\n", &i );
printf( " p = %p\n", p );
printf( " sizeof(int) = %d\n", sizeof(int) );
printf( " (p+1) = %p\n", p+1 );
}
で、いいはずだよな?
$ ./a.out
i = 5
*p = 5
&i = 0xbffff884
p = 0xbffff884
sizeof(int) = 4
(p+1) = 0xbffff888