プロが教える店舗&オフィスのセキュリティ対策術

sizeof演算子を使ってchar int float double型のバイト数を調べると、char 型については1バイトと決まっていて、int float doubleについては2から8バイト(処理系によって違う)なのは理解できます。しかし、char* int* float* double*型(ポインタ型)のバイト数は2から4バイトになるのが多いとおもいますが、どういう理由でポインタ型のバイト数が決まるのか、その理由をお教え願いたく思います。16ビットcpuあるいは32ビットcpuと言うハードの影響なのかそれとも何かソフトによるのか、その理由を知りたいと思います。なお私の処理系ではポインタは全て4バイトになっています。特に不思議に思うのはchar型は1バイトなのに、char*型が4バイトになっていることです。
宜しく願います。

A 回答 (5件)

こんにちは



>私の処理系ではポインタは全て4バイト
あなたのパソコンはCPUが32ビットだとわかりました。
つまり、32ビットなので約42億個(2の32乗)のメモリがあつかえます。
約42億個のメモリの一つ一つを4バイトのアドレスで管理しているのです。
ではdoubleはアドレスが8個になってしまうではないか?
とまたまた疑問に思われるでしょう。
メモリの管理については
「はじめて読む Pentium マシン語入門編」アスキー出版
http://www.ascii.co.jp/books/books/detail/4-7561 …
を読まれるとよくわかります。
「アセンブラ入門 CASLII」 SCC出版局
http://www.scc-kk.co.jp/scc-books/book_data/6074 …
を読めばワード、バイトというメモリの確保の仕方もわかります。
この2冊を勉強してください。
これを読んでおけば、これから必ず出てくる構造体のアライメントの疑問も解決できます。
http://www5d.biglobe.ne.jp/~noocyte/Programming/ …
    • good
    • 1

メモリモデルを切り替えるのはCPUではなくてコンパイラでした

    • good
    • 3

例えば


char a = 1;
の場合メモリの特定のアドレスに1という値が保存されます。
アドレスを0x20000000番地とすると
0x20000000 : 01
という具合です。
この場合アドレスは4バイトなのでsizeof(char*)は4になります。

アドレスのサイズはCPUにより決まると考えていいと思います。
スモールモデル(アドレス2バイト)やラージモデル(アドレス4バイト)を切り替えられるCPUもありました。
    • good
    • 0

ポインタには、メモリ上のアドレスが入っています。


そして、データ本体はそのアドレスのところに格納されます。
ポインタに入っているのは、データ型に関らずデータの入っているアドレスですので、全て同じサイズになります。
32ビットのOSですと、アドレスは4バイトで表されますので、全てのポインタ型のサイズは4バイトになります。
    • good
    • 0

メモリモデルって言うんじゃなかったかな。


メモリを使う時に必要な「番地」を管理するのに必要なバイト数が、ポインタをsizeofで調べると返ってくるよ。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!