取得、これは労働組合のcharへのポインタの正しい構文である場合、私はちょうど思っていた:は、組合内の変数へのポインタ
union myunion {
char character[4];
}
... = &(myunion.character[0])
私のアプリケーションでは、正しい結果を生成するようで、私はインターネット上で正しい構文を見つけることができないようです。
ありがとうございました。
取得、これは労働組合のcharへのポインタの正しい構文である場合、私はちょうど思っていた:は、組合内の変数へのポインタ
union myunion {
char character[4];
}
... = &(myunion.character[0])
私のアプリケーションでは、正しい結果を生成するようで、私はインターネット上で正しい構文を見つけることができないようです。
ありがとうございました。
正しい構文です。しかし、あなたが知っておく必要がある1つの問題があります:x86プロセッサーはlittle-endianです。これはつまり、あなたは、x86プラットフォーム上で展開(これはちょっとありそうである)、または任意の他のリトルエンディアンのプラットフォーム、および整数を持っている場合は、そのようなこと:次に
int value = 0x01020304;
、次のように読みますあなたのchar
配列:
character[0] == 04;
character[1] == 03;
character[2] == 02;
character[3] == 01;
つまり、バイトはメモリから逆の順序で読み込まれます。エンディアンが異なるアーキテクチャー間でアプリケーションを移植可能にする必要がある場合、これはすぐに醜くなります。
ただし、これを考慮している場合や、エンディアンが異なるアーキテクチャをサポートする予定がない場合は、問題ありません。
答えとヘッドアップの両方に感謝します! – JonaGik
union myunion
{ char ch[4]; };
...
union myunion u;
void *ptr = (void*)&u;
このコードはptr
に組合変数u
のアドレスが配置されます。
「正しい結果が得られないようですか?また、結果と期待される結果とは何ですか?それはコンパイルされますか?それはあなたがポインターから得るものがあなたが期待したものではないのですか? – zneak
私は「正しい結果を生むようです」という意味です。予想外のことをしていないことを確認したいだけです。 – JonaGik
申し訳ありませんが、質問を誤解しました。 myunionは宣言された変数ではないので、上記はコンパイルされません。代わりに、union myunion unのようなunion myunionの実際のインスタンスが必要です。 void * ptr =(void *)(&(un.character [0])); – Chris