2011-09-27 9 views
2

私は、コードを持っている:実際にこのコード行 `ptr =(char *)&a;`はどうしますか?

#include<stdio.h> 
void main(){ 
    int i; 
    float a=5.2; 
    char *ptr; 
    ptr=(char *)&a; 
    for(i=0;i<=3;i++) 
     printf("%d ",*ptr++); 
} 

私は102 102 -90 64として出力を得ました。私はそれが来た方法を予測できなかった、私はこの行と混乱するptr=(char *)&a;。誰が私にそれが何を説明することができますか?他の変数と同様に、コード*ptr++はインクリメントされますか?または、この場合のポインタのための他のルールがあります。

私はCの初心者ですから、その答えを簡単に説明してください。前もって感謝します。

答えて

5

これはcastと呼ばれます。 Cでは、キャストを使用してあるタイプから別のタイプへ値を変換または再解釈することができます。 floatの住所を取得すると、float*が得られます。 char*にキャストすると、メモリ内の同じ場所を参照するポインタが表示されますが、floatデータではなく、charというデータが存在すると思われます。

sizeof(float)4なので、その位置から4バイトを出力すると、IEEE-754 single-precision formatに従って、浮動小数点を構成するバイトが得られます。バイトの一部には上位ビットが設定されているため、signed charと解釈されてintに変換されると、two's-complement representationのアカウントで負の値として表示されます。

*ptr++は、*(ptr++)に相当し、最初にptrをインクリメントして、その前の値を逆参照します。同時に逆参照して進化していると考えることができますptr

2

ptr=(char *)&a;は、float変数のアドレスをタイプcharのポインタにキャストします。したがって、floatが1バイトで構成されている4バイトを解釈しています。この値はforループで出力されます。

*ptr++ステートメント*ptr++は、値を読み取った後にポインタをポストインクリメントします。つまり、(フロートの1バイトを指す)値を読み取り、1バイトのオフセットだけポインタを進めます。

5

この行は、&aと表示されたaのアドレスをchar*の文字/バイトへのポインタにキャストします。 printfループは、aという4つの構成バイトの値を10進数で出力します。

は(ループが

for (i=0; i<sizeof(a); i++) 
    printf("%d ", ptr[i]); 

されていた場合はところで。、それがすっきりされているだろう)

1

&aaのアドレスを取得し、つまり、それはタイプfloat *のポインタを生成します。次に、タイプfloat *のこのポインタは、タイプchar *のポインタにキャストされます。

sizeof(char) == 1のように、aは、バイトシーケンスとしてptrから見ることができます。

これは、変数の型を抽象化し、シリアル化やハッシングで特に適用できる、バイトの有限シーケンスとして扱う場合に便利です。

関連する問題