web-dev-qa-db-ja.com

ポインターのサイズは?

ポインターのサイズは、ポインターが指しているタイプと同じサイズですか、またはポインターは常に固定サイズですか?例えば...

_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)は4を返し、sizeof(yPtr)は1を返しますか、2つのポインターは実際に同じサイズを返しますか?私がこれを尋ねる理由は、ポインタがメモリアドレスを保存しているためであり、それぞれの保存されたアドレスの値ではありません。

54
MGZero

たとえば、ポインターのサイズは通常固定です。 32ビットの実行可能ファイルでは、通常は32ビットです。 32ビットポインターと16ビットを区別しなければならなかった古い16ビットウィンドウのように、いくつかの例外があります。通常、最新のデスクトップOSの特定の実行可能ファイル内で均一になると想定するのはかなり安全です。 。

編集:たとえそうであっても、私はこの仮定を行うことを強く警告しますあなたのコードで。絶対に特定のサイズのポインターを持たなければならないものを作成する場合は、それを確認することをお勧めします!

関数ポインタは別の話です-詳細については Jensの答え を参照してください。

69

関数ポインタは、コンパイラに応じて、X86マシン上で4〜20バイトの非常に異なるサイズを持つことができます。答えは「いいえ」です。サイズはさまざまです。

別の例:8051プログラムを使用します。3つのメモリ範囲があり、ターゲットのサイズが常に同じ(charなど)でも、ターゲットの場所に応じて8ビット、16ビット、24ビットの3つの異なるポインターサイズを持ちます。 。

70
Jens

32ビットマシンではsizeofポインターは32ビット(4バイト)ですが、64ビットマシンでは8バイトです。指しているデータ型に関係なく、サイズは固定されています。

15
peeyush

他の質問に答えるため。ポインターのサイズとポインターが指すサイズは関係ありません。良い例えは、それらを郵便住所のように考えることです。家の住所のサイズは、家のサイズとは関係ありません。

8
Jay

ポインターは、同じアーキテクチャーで常に同じサイズであるとは限りません。

ポインタのサイズが異なる場合の例として、「近い」、「遠い」、「巨大な」ポインタの概念について詳しく読むことができます...

http://en.wikipedia.org/wiki/Intel_Memory_Model#Pointer_sizes

8
Soumajyoti

Word-addressableマシン(Cray PVPシステムなど)では異なる場合があります。

今日のほとんどのコンピューターはバイトアドレス可能なマシンであり、各アドレスはメモリのバイトを指します。そこでは、すべてのデータポインターは通常同じサイズ、つまりマシンアドレスのサイズです。

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

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

2
Markus Kuhn

ポインタのサイズは、システムが一意のメモリアドレスを保持するために必要なサイズです(ポインタはポインタが指すアドレスを保持するだけなので)

0
J T