- ベストアンサー
ポインタのサイズ
ポインタのサイズは、 int型のポインタでも、char型のポインタでも、 doubleのポインタでも、構造体のポインタでも、 全部サイズは4バイトです。 というのを見かけましたが、ほんとうですか? 教えてください。
- みんなの回答 (11)
- 専門家の回答
質問者が選んだベストアンサー
PIC等のマイクロコンピュータでは、メモリモデルにより違いますが、16ビットと24ビットがポインタのサイズでした。 (参考URLをご覧下さい) 「C言語では」と聞かれると、処理系(CPU,アーキテクチャ,コンパイラ,OS)に依ってマチマチになりますし、 「これこれの処理系」と聞かれれば、こうです、と定まった答えが出ます。 C言語は高級言語の皮をかぶったアセンブラみたいなものですから、不親切に思える「なぜ、なに」がたくさん出てきます。 Cの言語仕様とライブラリAPIを超えた範囲にも目を向けて勉強していただきたいと思います。 (特にCPUとメモリ、スタックの使われ方など)
その他の回答 (10)
- MrBan
- ベストアンサー率53% (331/615)
失礼。longだとLONG_MINには拘束されますね。 (ISO/IEC14882 $18.2.2, ISO/IEC9899 $5.4.2.1あたり) # 蛇足:intptr_t等の定義はC99以降、現状では処理系を選びます。 # (とはいえstdint.hくらいなら仕様片手に自作できるでしょうが)
- Tacosan
- ベストアンサー率23% (3656/15482)
確かに個々の型の大きさは処理系定義ですが, 最低の大きさが規格にあります. で, long は最低 32bit なので「long が 24bit」はアウトです>#9 あと, 「どうしてもポインタの値を整数型の変数に入れたい」というときには intptr_t または uintptr_t を使うのがベスト.
- MrBan
- ベストアンサー率53% (331/615)
> この型名は規格上は OK なんでしょうか? これがもしも「shortが24bit」または「longが24bit」なら処理系定義なのでOKですが、 「short long」という型名は言語仕様的には違反ですね。 「標準の型を提供。さらに、独自の型を提供」という説明ですし、 処理系の独自拡張ということになると思います。一般性はありません。
- noocyte
- ベストアンサー率58% (171/291)
#7 さんの参考 URLを見ると,short long 型 (24ビット) なんてのがあるんですね! (11ページ) この型名は規格上は OK なんでしょうか?
- t_nojiri
- ベストアンサー率28% (595/2071)
皆さん書かれてる通り、OS、コンパイラ、実記環境(32bit、64bit)等に左右されます。 とはいえ、32ビット環境に限った話をすると質問条件に合うポインタは4バイトとなるケースが多いとは言えます。 但し、こういう定義されてない物は必ずsizeof()等でサイズ取得した方がコードの汎用性高くなります。(グレー扱いするのが常套手段です。)
お礼
すばやい回答ありがとうございます! 的確なご指摘参考になりました!
- MrBan
- ベストアンサー率53% (331/615)
常に同じである保証がないのは、既に書かれている通りです。 言語仕様上のサイズ保証はありませんし、クラスメンバのポインタが別サイズとかもありえます。 ポインタと整数のマッピングはimplementation-definedなので、 基本的には処理系(通常はコンパイラ)が決定します。 そのCPU上でもっとも効率的なサイズを使うのが普通ですが、 例えばvoid*へのキャスト時などにコンパイラが変換コードを 生成するなどの手段もないとはいえません。 # Win32等しか使ってないと、大抵4なので常に4だと思っちゃう人もいますし、 # 全てのポインタサイズを4にしてるコンパイラもあるので、 # 見かけた情報は何らかの条件が付いていたのかもしれません。
お礼
すばやい回答ありがとうございます! いろいろ詳しい回答ありがとうございます!
- sakusaker7
- ベストアンサー率62% (800/1280)
この説明がなされる前に、なにか限定条件がついていませんでしたか? すでにいくつか例も挙がっていますが、ほかにも char * と その他のポインタ型でサイズの違う環境がありました (多分現役ではないので過去形)。 ですから、いついかなる場合でもなりたつというものではありません。 また、64bit CPUが使われている環境の場合、int は 64bitではなく 32bitのままというものもありますので(たとえばWindowsがそう)、 int のサイズがポインタのサイズと常に等しいということもありません。
お礼
すばやい回答ありがとうございます! いろいろ情報ありがとうございます!
- noocyte
- ベストアンサー率58% (171/291)
プログラム用のメモリとデータ用のメモリが分かれているプロセッサでは, データ (int,char,double 等) へのポインタと,プログラム (関数) への ポインタのサイズが異なる場合があります. 16ビット時代の x86 はプログラム用とデータ用のメモリのサイズがそれぞれ, ・64KB 未満 (ポインタは2バイト) ・64KB 以上 (ポインタは4バイト) の2つの場合があり,4通りの組合せ (それぞれをメモリ・モデルと呼んでいた) が ありました.どのメモリ・モデルを使用するかは,プログラムのサイズと扱うデータ量 に応じて決定していました. 現在でも,DSP (デジタルシグナルプロセッサ) のようにプログラムメモリと データメモリが分かれているプロセッサではそうなっている可能性があります. (DSP を使ったことがないのでわかりませんが.) デジタルシグナルプロセッサ (Wikipedia) http://ja.wikipedia.org/wiki/%E3%83%87%E3%82%B8%E3%82%BF%E3%83%AB%E3%82%B7%E3%82%B0%E3%83%8A%E3%83%AB%E3%83%97%E3%83%AD%E3%82%BB%E3%83%83%E3%82%B5
お礼
すばやい回答ありがとうございます! いろいろ参考になりました! ありがとうございます!
- tatsu99
- ベストアンサー率52% (391/751)
>というのを見かけましたが、ほんとうですか? 本当です。 正確に言えば、それは32ビットモードの話で、 64ビットモードのコンパイラではすべて8バイトになります。 ポインターは、アドレスを示すもので、そのアドレスの示す先に、 charがあろうが、intがあろうが、なにがあってもアドレスを示すサイズは 変わりません。その為に、全て4バイトになります。
お礼
すばやい回答ありがとうございます! 何となくつかめました! ありがとうございます!
- snow765
- ベストアンサー率26% (8/30)
CPUとかコンパイラとかによっていろいろです。 基本的にはINT型といっしょかな?
お礼
すばやい回答ありがとうございます! 参考にします!
お礼
回答どうもありがとうございます! 詳しい解説ありがとうありがとうございます。 自分には難しそうですが、参考になります! ありがとうございます!