- ベストアンサー
ポインタ
ポインタの勉強をはじめたばかりの者なのですが、たとえば int *p などでポインタを宣言する場合には、メモリ上で変数pにはアドレスを格納するだけの領域が与えられます、このとき何バイトの領域が与えられるのでしょうか?
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
回答番号:No.2の補足です。 (環境によって変わってきますが、32bitまたは64bitという前提で書いていきます) 「CPUが情報を処理する単位」 それも関係しますが、 どちらかというと、yama-takuさんが言っている「コンパイラ(や実行OS)によって異なる」という事とCPUも絡んできます。 32ビットCPUと32ビットOSで動作する物(アプリケーションやゲーム等)ならば、ポインタのサイズは4バイト 64ビットCPUと64ビットOSで動作する物ならば、ポインタのサイズは8バイト ということです。 CPUに関してですが、32bitや64bitというのはアドレスバスやデータバスのサイズが32bit/64bitになっているということです。 アドレスバス ・・・ メモリ内のどこの場所をRead/Writeするかを差す(ポインタと同じ意味) データバス ・・・ アドレスバスで差した所にデータをRead/Write となっています。 ですから、32bitCPUで扱えるメモリのサイズは4バイト(0x00000000 ~ 0xFFFFFFFF)まで 64bitCPUで扱えるメモリのサイズは8バイト(0x00000000 ~ 0xFFFFFFFFFFFFFFFF)まで となっています。 で、OSに関してもCPUと同様に、扱えるメモリサイズが変わります。(32bit OS/64bit OS) さらに、コンパイラによっても32bit/64bitが変わります。 32bitで動作する物を作成する場合は、32bitのCPU,OS,コンパイラが必要になります。 64bitで動作する物を作成する場合は、64bitのCPU,OS,コンパイラが必要になります。
その他の回答 (5)
- chie65536
- ベストアンサー率41% (2512/6032)
「C言語的」に答えを書くと「処理系に依存する。不定」が答え。 例えば、コマンドライン用のBorland C++ 4.5で #include <stdio.h> void main(void) { printf("%d\n",sizeof(char *)); printf("%d\n",sizeof(short *)); printf("%d\n",sizeof(int *)); printf("%d\n",sizeof(long *)); } をコンパイルして実行する場合、以下のようになります。 ・オプションスイッチのメモリモデルを「スモール」に指定して、アドレス空間をワンセグメントの16ビットオフセットにした場合の実行結果 2 2 2 2 ・オプションスイッチのメモリモデルを「ラージ」に指定して、アドレス空間をセグメント+オフセットにした場合の実行結果 4 4 4 4 このように「同じパソコン、同じOS、同じコンパイラ」で実行しても「オプションスイッチの違い」つまり「処理系の違い」により、結果が変わります。 上記のように「2になったり、4になったりする」ので「2か4か判らんから、不定」って事になる訳です。 因みに「sizeof()」とは「引き数に指定したモノが、メモリ上で、何バイトの領域を必要とするか?」を返すマクロです。
お礼
ありがとうございました。
- titokani
- ベストアンサー率19% (341/1726)
32bitCPUか64bitCPUかということではなく、純粋にメモリ空間の大きさによるといえます。 Win32環境ではメモリ空間は4GB=32bit=4byteですが、昔の8bitCPUの場合は、メモリ空間64KB=16bit=2byteでした。 また、Win16環境だと、nearポインタとfarポインタとでサイズが違ったりしましたね。 なので、そのポインタが扱えるメモリ空間の大きさで決まると考えたほうが間違いがないと思います。
お礼
ありがとうございました。
- Tacosan
- ベストアンサー率23% (3656/15482)
sizeof p バイト. この値がいくつになるかは処理系に依存します. 4バイトかもしれないし 8バイトかもしれないし 1バイトかもしれない.
お礼
回答ありがとうございます。 ええっと、つまりアドレスの大きさによると考えてよいのでしょうか?
- tohru999
- ベストアンサー率49% (76/154)
32bitで動作するものならば、32bit(4バイト) 64bitで動作するものならば、64bit(8バイト) となります。
お礼
回答ありがとうございます。しかしよくわかりません。 bitはcpuが情報を処理する単位ですよね。 しかし、ポインタの場合はアドレスを格納するわけです。cpuのアドレスとデータは別物なのではないでしょうか?
言語・コンパイラ(や実行OS)によって異なると思います。 普通のWindowsクライアントマシンで、C++やVB6などの言語では 4バイト。 .NET Framework、Stored Procedureは8バイトだったかと思います。
お礼
回答ありがとうございます。状況によって異なるのですね。
お礼
ありがとうございました。