型キャストがポインターでどのように機能するかを理解するのに途方に暮れています
double x = 0.7;
int *ptr = (int *)&x;
*(byte )&xで何が起こっていますか? &x は、変数xのアドレスを意味します。では、アドレスを型キャストすることは何を意味するのでしょうか? ptr は x も参照できるようになりましたか? はいの場合、データは失われませんか?
また、 ptrのサイズは?
型キャストがポインターでどのように機能するかを理解するのに途方に暮れています
double x = 0.7;
int *ptr = (int *)&x;
*(byte )&xで何が起こっていますか? &x は、変数xのアドレスを意味します。では、アドレスを型キャストすることは何を意味するのでしょうか? ptr は x も参照できるようになりましたか? はいの場合、データは失われませんか?
また、 ptrのサイズは?
行は変数のアドレスを取得し、そのx
値を に保存しますptr
。double* から int* への割り当ては許可されていないため、割り当てをキャストする必要があります。
代入後に逆参照ptr
すると、エイリアシング規則に違反し、プログラムが未定義の動作を表示する原因になります。
のサイズはor式ptr
の結果と同じです。sizeof( ptr )
sizeof( int* )
コードを少しリファクタリングしましょう。
#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 ビット) とエンディアンに応じて、マシンによって出力が異なる場合があります。