2011-07-19 3 views
38

ポインターのサイズは、ポインターの種類と同じサイズですか、またはポインターは常に固定サイズですか?たとえば...ポインタのサイズは?

int x = 10; 
int * xPtr = &x; 
char y = 'a'; 
char * yPtr = &y; 

std::cout << sizeof(x) << "\n"; 
std::cout << sizeof(xPtr) << "\n"; 
std::cout << sizeof(y) << "\n"; 
std::cout << sizeof(yPtr) << "\n"; 

これの出力はどのようになりますか? sizeof(xPtr) return 4とsizeof(yPtr) return 1、または2つのポインタが実際に同じサイズを返しますか?私がこれを尋ねる理由は、ポインタがそれぞれの格納されたアドレスの値ではなくメモリアドレスを格納しているからです。

答えて

55

ポインタは一般に固定サイズです。 32ビットの実行ファイルでは、通常は32ビットです。古い16ビットウィンドウのように、32ビットポインタと16ビットを区別しなければならないようないくつかの例外があります...現代のデスクトップOSでは、実行可能ファイル内で統一されていると仮定するのはかなり安全です。

編集:それでも、この仮定をのコードにすることに強く注意してください。あなたが絶対に特定のサイズのポインタを持っていなければならない何かを書くつもりなら、それをチェックするのが良いでしょう!

機能ポインタは別の話です。詳細はJens' answerを参照してください。

+5

真実ではない、でも、同じマシンのポインタのサイズに彼らができるcf16 @ – 4pie0

+2

を異なりますが、私の答えは唯一の近代的なデスクトップOSののために、すなわちのWin32/64には、Linuxは...あなたは私を与えることができることを主張することができますそれらのシステムの1つでは異なる例がありますか? –

+0

あなたはいくつかの例外を自分自身で言いましたが、たとえばOK – 4pie0

10

ポインタ上の32ビットマシンのサイズは32ビット(4バイト)ですが、64ビットマシンでは8バイトです。どのデータ型を指していても、サイズは固定です。

+1

どうしたの?質問はデータ型ポインタについて尋ねられました... – peeyush

+1

64ビットマシン上で実行可能な32ビットはどうでしょうか? – Ident

0

ポインタのサイズは4から固有のメモリアドレスを保持するために、あなたのシステムが必要とするサイズ(ポインタはちょうどそれが指すアドレスを保持しているため)

+0

単語を扱うマシン上のcharのようなものを指す場合を除いて。 –

54

関数ポインタは非常に異なるサイズを有することができる、ですコンパイラによっては、X86マシンで20バイトまでです。だから答えはNOです - サイズは変わることがあります。

もう1つの例:8051プログラムを実行すると、3つのメモリ範囲を持つため、ターゲットのサイズが常に同じでも、ターゲットがどこにあるかによって8ビット、16ビット、24ビットの3種類のポインタサイズがあります(例えばchar)。

+2

ありがとう、私はfuntionのポインターを検討するとは思わなかった。 – MGZero

+1

これは、アセンブリを見ている場合にのみ適用されます。 C++では、さまざまなサイズが表示されません。 – Jay

+2

@Jay:まったくそうではありません。 'sizeof(p)'は異なるタイプのポインタに対して異なる結果を与えることができます。 – Nemo

6

他の質問にお答えします。ポインタのサイズとポインタのサイズは関連していません。良いアナロジーは、それらを郵便住所のように考えることです。家の住所の大きさは、家の大きさと関係がありません。

+1

しかし、郵便番号は異なる領域で異なるサイズを持つことができます。[同じサイズのすべてのデータポインタですか?](http://stackoverflow.com/questions/1241205/are-all-data-pointers-of-the-same -size-one-platform)を使用します。異なる型へのポインタが異なるサイズを持つことができる点で、いくつかの関係があります。 –

+1

CPUを見ると、さまざまな種類のアドレス指定方法があります(プロセッサによって異なります)。最小のものは、絶対アドレスを与える代わりに、命令がどこにあるかに関連してアドレスを符号化する。いくつかはCPUレジスタを基準にしています。それらは最初のタイプよりも少し大きめです(レジスタを含める場合)。最大のものは絶対アドレスです。これらは通常、プロセッサアドレス空間全体をエンコードするのに十分なビットを必要とするため、最大です。 CとC++はこれらの詳細をあなたから隠します。あなたは絶対アドレスを使用し、コンパイラはあなたが望むものを得る方法を決定します。 – Jay

2

を「はるか」、「近くに」をコンセプトに、よりを読んで、「巨大な」ポインタをすることができますワードアドレス可能なマシン(例えば、Cray PVPシステム)上では異なっていてもよい。

現在、ほとんどのコンピュータはバイトアドレス可能なマシンで、各アドレスは1バイトのメモリを参照します。そこでは、すべてのデータポインタは通常同じサイズ、すなわちマシンアドレスのサイズです。

ワードでアドレス可能なマシンでは、各マシンアドレスは1バイトより大きなワードを参照します。これらの上で、メモリのバイトへの(char *)または(void *)ポインタは、addresedワード内のワードアドレスとバイトオフセットの両方を含む必要があります。

http://docs.cray.com/books/004-2179-001/html-004-2179-001/rvc5mrwh.html

関連する問題