6

私は C++ の初心者で、コードの理解に問題があります。

のサイズを返す関数を作成しint、 and を使用しないという演習がsizeof()ありreinterpret_castました。誰かが私に解決策を教えてくれましたが、それがどのように機能するのかわかりません。それを理解するのを手伝ってもらえますか?これはコードです:

int intSize() {
  int intArray[10];
  int * intPtr1;
  int * intPtr2;

  intPtr1 = &intArray[1];
  intPtr2 = &intArray[2];

  //Why cast int pointer to void pointer?
  void* voidPtr1 = static_cast<void*>(intPtr1);

  //why cast void pointer to char pointer?
  char* charPtr1 = static_cast<char*>(voidPtr1);

  void* voidPtr2 = static_cast<void*>(intPtr2);
  char* charPtr2 = static_cast<char*>(voidPtr2);

  //when I try to print 'charPtr1' there is nothing printed
  //when try to print charPtr2 - charPtr1, there is correct value shown - 4, why?
  return charPtr2 - charPtr1;
}

私が理解していないことを要約すると、なぜこのタスクを実行するために変更int*void*、次に変更する必要があるのですか? char*と を減算するcharPtr2と結果が得charPtr1られるのに、 のみを印刷しようとすると何も表示されないのはcharPtr1なぜですか?

4

6 に答える 6

1

C++ のポインター減算は、ポイントされたオブジェクト間の要素の数を示します。つまり、これら 2 つのポインターintPtr2 - intPtr1 の間の数を返します。intプログラムはバイト数 ( char) を知りたいので、 を に変換int*char*ます。どうやら、作者はどちらも使いたくないらしいreinterpret_cast。Andは からへstatic_castの直接変換を許可しないので、彼は通過します(これは許可されます)。int*char*void*

関数の名前とポインターが実際にどのように初期化されるかから判断すると、これのはるかに単純な実装は次のようになります。

int
intSize()
{
    return sizeof( int );
}
于 2013-07-04T13:45:58.573 に答える