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バイトになっていることです。
宜しく願います。
No.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/ …
No.3ベストアンサー
- 回答日時:
例えば
char a = 1;
の場合メモリの特定のアドレスに1という値が保存されます。
アドレスを0x20000000番地とすると
0x20000000 : 01
という具合です。
この場合アドレスは4バイトなのでsizeof(char*)は4になります。
アドレスのサイズはCPUにより決まると考えていいと思います。
スモールモデル(アドレス2バイト)やラージモデル(アドレス4バイト)を切り替えられるCPUもありました。
No.2
- 回答日時:
ポインタには、メモリ上のアドレスが入っています。
そして、データ本体はそのアドレスのところに格納されます。
ポインタに入っているのは、データ型に関らずデータの入っているアドレスですので、全て同じサイズになります。
32ビットのOSですと、アドレスは4バイトで表されますので、全てのポインタ型のサイズは4バイトになります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- C言語・C++・C# C言語 共用体について コマンドライン引数で値を2つ入力したときに、argv[2]の値をUNI u1 4 2022/04/25 20:34
- C言語・C++・C# C言語について コマンドラインで >変数 12.00 (char型) と、小数点付きの値を共用体に渡 1 2022/04/22 16:56
- C言語・C++・C# 100バイトのバイナリファイルを読み込んで別のファイルに書き込みたいのですが、型をどうすればいいのか 1 2022/11/03 17:11
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- C言語・C++・C# C言語: ポインタ 5 2022/06/01 08:33
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# 関数ポインタの高速化のメリット 7 2023/05/05 20:15
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
10Mバイトて文字数に すると何...
-
UTF-8で5~6バイトになる文字コ...
-
COBOLのCOMP形式について
-
エクセルシート名の制限を変更...
-
ビットスワップとバイトスワッ...
-
バイナリとBCDコード
-
memcmp バイナリデータの比較方法
-
char str[256]の256の意味は?
-
Javaで日本語1文字のバイト数
-
機種依存文字をチェックしたい。
-
3バイト文字(UTF-8)をprintfで...
-
unicode←→JISコード
-
ビットからバイトへの変換
-
2byte文字の判定
-
[VBScript][wsh]byte単位でのデ...
-
varchar(M)のMは文字数ですかバ...
-
バイト列とバイナリ列の違いが...
-
【VB】文字列を50バイトづつに...
-
ソケット通信の受信サイズ
-
0.5バイトづつ読み込みたいので...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
10Mバイトて文字数に すると何...
-
UTF-8で5~6バイトになる文字コ...
-
char str[256]の256の意味は?
-
エクセルシート名の制限を変更...
-
COBOLのCOMP形式について
-
バイナリとBCDコード
-
バイト列とバイナリ列の違いが...
-
ビットスワップとバイトスワッ...
-
ピクセル,dpiから容量(バイト...
-
SQLで1バイト、2バイト混在...
-
Javaで日本語1文字のバイト数
-
「1TB」のHDDに日本語は何字入...
-
機種依存文字をチェックしたい。
-
VBAでShift-JISのURLエンコード
-
GetWindowTextでアドレスバーか...
-
COBOL PICTUREで X,S,Vの意味
-
【VB2005】テキストボックス内...
-
URLは最高何文字まで可能なので...
-
1KBが1024byteな理由
-
ワイド文字のバイト数が取得で...
おすすめ情報