int型のpというアドレスを作成し,そのアドレスにint i のアドレスを代入する
おそらくここに既に誤解があるような気がします。
まずは、変数の概念から、
int i;
とすると、int型の変数i
が宣言されます。
これは具体的には、メモリ上にint型のサイズ文の空間を予約して、i
という変数をそれに割り当てることを指します。
変数とは、メモリ上の一定の領域の事なのです。
(実際にはレジスタの場合も~とかはありますが、ここはあくまで概念としての『メモリ』という事で)
変数の領域のサイズは型によって決まります。変数の宣言時に型の指定が必要なのはそのためです。
int型のサイズは環境によっても変わりますが、32bit(4Byte)という環境が多いです。
次にポインタ変数の場合はどうなるのか、
int *p;
とすると、int型を指すポインタ変数p
が宣言されます。
具体的には、ポインタ変数が格納すべきアドレスのサイズに合わせた空間がメモリ上に確保され、それにp
という変数が割り当てられます。
アドレスのサイズはプログラムのbit数によっても変わり、32bitのプログラムであれば32bit、64bitのプログラムであれば64bitの領域が確保されます。
int *p
と書いた時の型は、ポインタが指す先の型の指定であり、ポインタのサイズはこれには影響されません。
char*
もdouble*
もサイズは皆同じです。
ここから元のソースを見てみます。
C
1int *p, i; //int型の変数iとint型のポインタ
2 p = &i;//pにiのアドレスを代入
int *p;
これで、メモリ空間上に64bitの領域が確保されます。仮にそのアドレスを0100
だとします。 (実際には64bitなので16桁あります)
int i;
これで、メモリ空間上に32bitの領域が確保されます。仮にそのアドレスを0108
だとします。
p=&i;
&i
は、i
のアドレスなので、0108
です。なのでこれは
p=0x0108;
になります。
p
のために確保した、0100
から始まる64bitのエリアに、0x0108
という値が書き込まれるのです。
つまりは、ポインタ変数とは、ポインタというアドレスの値を格納するための領域なのです。
「pというアドレスを作成」ではなく、「pというアドレスを記録するエリアを確保する」
と考えると、分かりやすいかと思います。
またp = new int();に関してnewはメモリを確保するというイメージだったのですが,
pはすでにメモリが確保されているのではと思ったのですが?
p = new ~;
というのもそれと同じです。
**「確保したpというアドレス置き場」に「newで確保した別のメモリのエリアの先頭アドレス」**を書き込む。
という動作になります。
p
もnew
で確保したエリアも、両方メモリ上に確保されているのです。
ちなみに、
int *p = 0とは何をやっているのでしょうか?
これ自体にはあまり意味はありません。C言語やC++では変数の初期値は不定なので、明示的に0=NULLでクリアしているだけかと思います。
変な値が入っていると、それが何か意味のあるアドレスなのかな?と勘違いする可能性もありますので。
NULLを入れておけば、確実に空なんだなと分かります。
(今回は直後で使っているのでほんとに意味はないですが、たぶん念のためでしょう)
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。