同様のロジックを使用して2つの異なるポインタータイプをインクリメントするときに、異なるアドレスを取得するのはなぜですか?

jameswoo

フロートのサイズが4のときに、フロートのアドレスが16増える理由がわかりません。誰か説明してもらえますか?

コード:

char* mychar   = new char[SIZE];
float* myfloat = new float[SIZE];

for(int i = 0; i < SIZE; i++)
{
    mychar[i] = 'A' + i;
    myfloat[i] = 101 + i; 
}

for(int i = 0; i < SIZE; i++)
    {
        cout << setw(12) << "new char @ <"  << static_cast<void*>(mychar) + sizeof(char)*i  << ">=<" << mychar[i]  << ">" 
             << setw(14) << "   new float @ <" << myfloat + sizeof(float)*i                    << ">=<" << myfloat[i] << ">\n"; 
    }

cout<< "Size of float: " << sizeof(float) << endl << "Size of char: " << sizeof(char);

出力:

new char @ <0x800102e8>=<A>   new float @ <0x800102f8>=<101>
new char @ <0x800102e9>=<B>   new float @ <0x80010308>=<102>
new char @ <0x800102ea>=<C>   new float @ <0x80010318>=<103>
new char @ <0x800102eb>=<D>   new float @ <0x80010328>=<104>
Size of float: 4
Size of char: 1
templatetypedef

お知らせmyfloatですfloat*つまり、次のような式を書くと

myfloat + n

結果はへのポインタになりますfloatnのアレイにおけるダウン位置floatアドレス開始時刻S myfloatつまり、ポインタの追加はオブジェクトのサイズを認識しているためn、ここに追加すると、ポインタがn * sizeof(float)バイト単位で自動的にインクリメントされます。

したがって、あなたが書く場合

myfloat + n * sizeof(float)

あなたはn * sizeof(float)バイト単位でジャンプするのではなくn * sizeof(float) * sizeof(float)、たまたま16nバイトであるバイト単位ではありません

お役に立てれば!

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ