0

「unsignedint*」の値があり、それを単純な「unsigned int」に変換して、関数に転送できるようにする必要があります。しかし、残念ながら、単純なキャストを実行しようとすると、値が変更されます。

Code:

unsigned int * addr;

...

fprintf(stdout, "=== addr: %08x ===\n", addr); fflush(stdout);
fprintf(stdout, "=== casted addr: %08x ===\n", (unsigned int)addr);


Output:

=== addr: fc880000 ===
=== casted addr: 400eff20 ===

この値を正しく変換して、変換中に変更されないようにする方法を教えてください。

4

4 に答える 4

4

単に使用して*addrください。これは有効であり、常に機能するはずです。ポインタが指す値ではなく、ポインタのを取得する必要がある場合は、より大きな型が必要になります。通常、anの値は64ビットですが、 32ビットのみです。unsigned int*unsigned int

于 2013-02-18T14:12:40.290 に答える
1

ポインタを宣言すると、

unsigned int * addr;

そのポインタの値は、unsigned intそれが指すアドレスになります。

unsigned intitが指す値を取得する場合は、間接参照演算子を使用し*ます。

unsigned int value = *addr;

addrしたがって、2番目の出力行に表示されるのは、ポイントの内容です。

于 2013-02-18T14:13:04.763 に答える
1

あるタイプのポインターがあり、それをそのタイプだけに変換する必要がある場合は、ポインターを尊重する必要があります。

void foo(unsigned int some_value);

...

int main()
{

    unsigned int * addr = 0x12345678; // some address holding an unsigned int
    foo(*addr);  // some function taking a unsigned int

タイプを変更しないので、ここで何もタイプキャストする必要はありません。コード内の「値」は変更されないことに注意してください。

// prints the address
fprintf(stdout, "=== addr: %08x ===\n", addr); 

// prints the value at that address
fprintf(stdout, "=== casted addr: %08x ===\n", *(unsigned int *)addr);
于 2013-02-18T14:13:04.833 に答える
1

値を変更していません。の

fprintf(stdout, "=== addr: %08x ===\n", addr); fflush(stdout); 

ポインタのアドレスにアクセスしています。

fprintf(stdout, "=== casted addr: %08x ===\n", *(unsigned int *)address);

指している値にアクセスしています。

于 2013-02-18T14:14:08.777 に答える