C言語のポインタのmy復習です。本当に初歩的なことをねちねち書きました、すみません。
①(まず)ポインタ

変数には実態(収まっているものの内容)と、アドレス(収まってる場所)があります。
int a =5;
int* p=&a;
この時、変数aに入れた5が実態。変数aがメモリ上のどこにあるのか、
そのアドレスが&aとなります。&aはアドレスなので、ポインタ型じゃないと受け取れません。
アドレスを取り出すのがポインタ型(ここではint*)。これがpです。
#include <stdio.h>
int main (int argc, const char * argv[]) {
int a = 5;
int* p = &a;
printf(“a = %d, &a = %d, p = %d”,a, &a, p);
return 0;
}
<結果ログ>
a = 5, &a = -1073744280, p = -1073744280
②(で、)ポインタのポインタ(??のところ)
ポインタ自体もアドレスが入っていようが変数です。変数として、実態とアドレスがあります。(アドレス値のくせに、アドレス値が収まっている場所のアドレスがさらにある、というのがややこしい。ややこしいけど当たり前。そりゃメモリ上のどっかに住所があるはず。)pの実態は上のとおり、ここでは、-1073744280 という値であり、これはaのアドレスに当たります。pは int* というポインタ型だったので、pのアドレスを取り出すには、int** というポインタのポインタ型で取り出さなくてはいけません。
int a;
int* p=&a;
int** pp=&p;
&は、「アドレスちょーだい」という記号です(マイ解釈)。
#include <stdio.h>
int main (int argc, const char * argv[]) {
int a = 5;
int* p = &a;
//printf(”a = %d,&a = %d,p = %d”,a, &a, p,);
int** pp=&p;
printf(“pp=%d,&p=%d,p=%d”,pp,&p,p);
return 0;
}
<結果ログ>
pp=-1073744284,&p=-1073744284,p=-1073744280
※(補足)
アドレスのログは、printf(”0x%x\n”, p);
で16進数での表記が基本、ということをしりませんでした。
「マイナスなんておかしいじゃないか!」ということに気付きもしません。。。
上は恥さらし記念として残します。
ちなみに、
//×10進法で
printf(“pp=%d,&p=%d,\n”,pp,&p);
//○16進法で
printf(“pp=0x%x, &p=0x%x\n”,pp,&p);
<結果ログ>
//×10進法 (わかりにくい)
pp=-1073744348,&p=-1073744348,
//○16進法(わかりやすい)
pp=0xbffff624, &p=0xbffff624
でした。