-2

型キャストがポインターでどのように機能するかを理解するのに途方に暮れています

double x = 0.7;
int *ptr = (int *)&x;

*(byte )&xで何が起こっていますか? &x は、変数xのアドレスを意味します。では、アドレスを型キャストすることは何を意味するのでしょうか? ptr は x も参照できるようになりましたか? はいの場合、データは失われませんか?

また、 ptrのサイズは?

4

2 に答える 2

1

行は変数のアドレスを取得し、そのx値を に保存しますptr。double* から int* への割り当ては許可されていないため、割り当てをキャストする必要があります。

代入後に逆参照ptrすると、エイリアシング規則に違反し、プログラムが未定義の動作を表示する原因になります。

のサイズはor式ptrの結果と同じです。sizeof( ptr )sizeof( int* )

于 2014-06-12T11:29:24.123 に答える
0

コードを少しリファクタリングしましょう。

#include <stdio.h>
#include <stdlib.h>


int main (void)
{
    int i;
    double d = 0.7;
    unsigned char* c = (unsigned char*)&d;

    for (i = 0; i < sizeof(d); i++) {
        printf("%x ", c[i]);
    }

    unsigned int* n = (unsigned int*) &d;

    printf("\n%x", *n);

    return 0;
}

上記のプログラムは、次のように出力します。

$ ./test.exe
66 66 66 66 66 66 e6 3f
66666666

では、アドレスを型キャストすることは何を意味するのでしょうか? ptr は x も参照できるようになりましたか? はいの場合、データは失われませんか?

基本的には、double* である &d を int* に変換します。そうすることで、&d のメモリにあるものをすべて int に解釈します。double を int に型キャストするという単純な問題ではなく、メモリ レイアウト全体を再解釈する必要があります。これは、アーキテクチャ (32/64 ビット) とエンディアンに応じて、マシンによって出力が異なる場合があります。

于 2014-06-12T11:28:13.903 に答える