2
int i=0;
int *p = &i;
std::cout<<sizeof(i)<<" vs "<<sizeof(p)<<"\n";

char c='0';
char*pc = &c;
std::cout<<sizeof(c)<<" vs "<<sizeof(pc)<<"\n";

double d=0.123456789;
double *pd = &d;
std::cout<<sizeof(d)<<" vs "<<sizeof(pd)<<"\n";

ポインターのサイズが常に 4 の整数のサイズと等しいのはなぜですか?

4

4 に答える 4

6

ポインターには、ポインターが指すデータは含まれていません。

ポインタは、指すデータを指すだけです

sizeof( double* )aが配置されている場所を説明するために使用されるデータのサイズdoubleです。家の住所が書かれた紙は、家が大きくても小さくてもサイズが変わらないのと同じように、ポインターのサイズは、ポイントされたデータのサイズの関数ではありません。

まあ、通常。あなたは国際的な住所がより長く、より多くの紙を必要とすることを想像することができます。同様に、アパートの建物内の住所は、他の場所の住所と比較して「ユニット番号」に余分な行が必要な場合や、「ユニット番号」のみが含まれているため短い「アパート内」の住所を想像することができます。この標準では、さまざまなタイプへのポインターのサイズを変更できます。一部のアーキテクチャー(最も有名なのは8086)には、ニアポインターとファーポインター(それぞれ16ビットと32ビット)の両方の概念があります。

これはもう一般的ではありません(おそらくメンバー関数ポインターを除いて、しかしそれらはどれくらい一般的ですか?)

于 2013-03-21T02:08:18.657 に答える
2

ポインタは、実際にはアドレスを含む変数です。32ビットマシンでは、アドレスは常に32ビットであるため、4バイトになります。16ビットまたは64ビットマシンの場合と同じロジック。

C99標準を調べたところ、次のようになっています。

ポインタのサイズは、必ずしも整数型のサイズと同じである必要はありません。実装は、複数のサイズのポインタをサポートする場合があります。

したがって、ポインタのサイズを知る最も安全な方法はsizeof()です。

于 2013-03-21T02:09:10.813 に答える
1

ポインタのサイズは、コンパイルするアプリケーションの種類によって異なります。

ポインタは32-bit unsigned int、メモリ位置を格納するため、32ビットアプリケーションのに似ています。

アプリケーションがアプリケーションの場合、メモリ位置を格納するのに十分な大きさである必要があるためN-bit、ポインタのサイズは長くなります。N bits

アプリケーションを実行できるすべてのN-bitコンピューターにN-bitは、RAM制限があり2^N bytesます。これにより、最大のメモリロケーションIDがに等しくなります2^N - 10x00000000有効なメモリアドレスであるため)。

2^N - 1はバイナリで表す必要N bitsがあります。私の友人は、32ビットアプリケーションでポインタのサイズが4バイトである理由です。

例として単純化のためのアプリケーションを取り上げ3-bitます:(私はむしろ多数を扱いたくない)

3-bitマシン上で実行されていると仮定しましょう。はで2^3 - 12進数で表すことができる最大数である3 bitsため、システムが処理できる最大メモリは2^3バイトになります。(これらは符号なしです。負のメモリアドレスは存在しません)

可能なメモリアドレスは次のとおりです。

  • 0x0(バイナリ表現000:)
  • 0x1(バイナリ表現001:)
  • 0x2(バイナリ表現010:)
  • 0x3(バイナリ表現011:)
  • 0x4(バイナリ表現100:)
  • 0x5(バイナリ表現101:)
  • 0x6(バイナリ表現110:)
  • 0x7(バイナリ表現111:)

したがって、このような場合、メモリアドレスを指すポインタが必要になります3 bits

に置き換え332ください。これは、ここで行っていることに適用されます。

(やり過ぎの答えは多いですか?はい。なぜですか?退屈だったからです。)

于 2013-03-21T02:08:36.103 に答える
1

ポインタが必要とするメモリ量は 4 バイトだからです。

これが 64 ビット アプリケーションの場合、8 が返されます。

于 2013-03-21T02:05:56.510 に答える