3

C ++の複雑さを理解しようとしているだけなので、文字列やポインタをいじっています。しかし、私は本当に理解できない何かに出くわしました。

まず、私は同じ関数を使用しており、私が知る限り、毎回同じ引数を指定しています。私はそれをメイン関数と別の関数から呼び出しており、それぞれからわずかに異なるアドレスを取得しています。メモリの特定の部分からデータを読み取る機能は次のとおりです。

void printDataFromAddressForLength(char* pointer, long length)
{
    cout << "\n" << endl;

    for (int i=0; i<length; i++)
    {
        cout << "&pointer: " << &pointer + i << "\tData: " << pointer + i << endl;
    }
}

この関数の目的は、各行に現在のアドレスと値を出力し、同じことを実行する場所から繰り返して使用できるようにすることです。これは、実際の目的のない非常に単純な関数です。

これは私のmain()にあるコードです

MessageData messageData = returnStruct();
printDataFromAddressForLength(messageData.pChar, messageData.length);

returnStruct()関数からprintDataFromAddressForLengthも呼び出しています。このコードは以下のとおりです。

// Returns MessageData from function 
MessageData returnStruct()
{
static string staticTestString = "Time and time again";

MessageData metaData;
MessageData* pMetaData = &metaData;

pMetaData->pChar = &staticTestString[0];
pMetaData->length = staticTestString.length();

printDataFromAddressForLength(pMetaData->pChar, pMetaData->length);

return metaData;
}

以下の出力は、return構造体の内部から呼び出されたprintDataFromAddressForLength()関数からのものです。注:0x0027F * 7 *

&pointer: 0027F7BC      Data: Time and time again
&pointer: 0027F7C0      Data: ime and time again
&pointer: 0027F7C4      Data: me and time again
&pointer: 0027F7C8      Data: e and time again
&pointer: 0027F7CC      Data:  and time again
&pointer: 0027F7D0      Data: and time again
&pointer: 0027F7D4      Data: nd time again
&pointer: 0027F7D8      Data: d time again
&pointer: 0027F7DC      Data:  time again
&pointer: 0027F7E0      Data: time again
&pointer: 0027F7E4      Data: ime again
&pointer: 0027F7E8      Data: me again
&pointer: 0027F7EC      Data: e again
&pointer: 0027F7F0      Data:  again
&pointer: 0027F7F4      Data: again
&pointer: 0027F7F8      Data: gain
&pointer: 0027F7FC      Data: ain
&pointer: 0027F800      Data: in
&pointer: 0027F804      Data: n

この出力は、メイン自体から呼び出されたprintDataFromAddressForLength()関数から取得されます。注:0x0027F * 8 *

&pointer: 0027F8BC      Data: Time and time again
&pointer: 0027F8C0      Data: ime and time again
&pointer: 0027F8C4      Data: me and time again
&pointer: 0027F8C8      Data: e and time again
&pointer: 0027F8CC      Data:  and time again
&pointer: 0027F8D0      Data: and time again
&pointer: 0027F8D4      Data: nd time again
&pointer: 0027F8D8      Data: d time again
&pointer: 0027F8DC      Data:  time again
&pointer: 0027F8E0      Data: time again
&pointer: 0027F8E4      Data: ime again
&pointer: 0027F8E8      Data: me again
&pointer: 0027F8EC      Data: e again
&pointer: 0027F8F0      Data:  again
&pointer: 0027F8F4      Data: again
&pointer: 0027F8F8      Data: gain
&pointer: 0027F8FC      Data: ain
&pointer: 0027F900      Data: in
&pointer: 0027F904      Data: n

私が知る限り、私は最初にその関数を呼び出し、ポインターと長さを渡します。

次に、これら2つのパラメーターを含む構造体をメインに返し、同じパラメーターであると予想したものを使用して同じ関数を呼び出します。長さは明らかに同じですが、pCharのアドレス増分が奇妙です。

どんな洞察にも感謝します!

乾杯

4

2 に答える 2

6

文字列のアドレスではなく、正式なパラメータ「ポインタ」のアドレスを出力しています。

void printDataFromAddressForLength(char* pointer, long length)
{
    cout << "\n" << endl;

    for (int i=0; i<length; i++)
    {
        cout << "&pointer: " << (void*)(pointer + i) << "\tData: " << pointer + i << endl;
    }
}
于 2013-03-25T16:22:08.517 に答える
4

あなたはあなたが思っているものを印刷していません。のタイプ&pointerchar * *次のとおりです。ポインタへのポインタ。次に、それに追加します。これにより、ポイントされたタイプのサイズ(ではなく)iで増分されます。charchar *

これを試して:

cout << "&pointer: " << (void*)&pointer[i]    
于 2013-03-25T16:21:53.240 に答える