printf("%d\n",sizeof(p)); //ここではなぜか8と表示される
他の方がご回答されているようにポインタ宣言された変数の大きさ(バイト数)です。
蛇足かもしれませんが、
8と表示されたという事は64bit用のコンパイラを使用していると思います。
64bitのアドレスを示す値を格納する変数なので8バイトが必要になります。
アドレスとはメモリ上の位置を示す値でこの場合、0000000000000000~FFFFFFFFFFFFFFFF の値です。
(実際には全てを使えませんし、勝手に割り当てはできません)
ポインタ変数はアドレスを保持するもので、当然その値を記憶しておくメモリ領域が割り当てられています。
このコンパイラが処理するポインタ変数は8バイトのメモリ領域が割り当てられているという事です。
このプログラムでのpは、mallocで確保したメモリ領域のアドレスを保持するメモリ領域で、
mallocで確保したメモリ領域とは別もので(場所も違います)。
自分の認識ですと、pには確保されたメモリ領域の先頭が16進数でhaitteori,p[1]などすると指定されたpにプラス1された値が表示されるのかなと思いました。
従って上記の解釈も少し違うかもしれません。
「pには確保されたメモリ領域の先頭」のアドレス(の値)が入っているまでは良いのですが、
「pにプラス1された値が表示」ではなく、pの示す先頭アドレスから2つ目の「int」の値を参照する
という事です。
また、下記について
そして、sizeofでpの確保領域の8となっておりました。領域の長さを5で指定したはずですが、int型の場合は1領域に1.6メモリ使う、と言うようなイメージでしょうか?
この処理系の場合、int型のサイズは32bit(0~FFFFFFFF)と思います。サイズは4バイト必要です。
「sizeof(int)*5」としていますので、int型を5個分、4(バイト)×5=20バイトの領域を確保しています。
for(int i=0;i<10;i++){
printf("%d\n",p[i]); //←ここのp[1]では0と表示される
}
上記では確保した領域以外の場所にアクセスしている事になります。本来なら問題が発生します。
(今回は参照しているだけなのでたまたま問題にならなかっただけ。そもそも値が設定されていないので全て無意味な値です)
p[0]は、pが示すアドレスの先頭(0番目)のintの値を参照し、p[1]はその次(1番目)intの値を
参照します。pが示す先頭アドレスから4バイトプラスされた位置にあります。
(p+4ではありません。pが示すアドレスの値+4という事です。)
sizeofで返される値は処理系やコンパイルオプションによっても変わるので注意が必要です。
もう一つ気になった事があります。
メモリ領域の先頭が16進数でhaitteori(入っており?)
16進数はあくまで値を表現する方法で、値が16進数で入ってのでは無いと思います。
今回のポインタの場合は、64bitのサイズのアドレスの値で、
16進数で表すと 0000000000000000~FFFFFFFFFFFFFFFFで表現されるという事です。
なので一回目に大きな値が表示されるのはわかるのですが、
上記も少し違い、たまたま入っていた値でメモリ領域の先頭のアドレス値でもありません。