2012-07-15 13 views

答えて

6

簡単例:あなたはあまりにも整数を使用することができますが、その後、あなたが一度に設定されているバイトの量について注意を払う必要がありますunsigned char型の配列として

void *memory = malloc(1000); //allocate a pool of memory 
uint8_t *ptr = memory+10; 
*ptr = 1 //set an integer value at byte 10 
uint8_t i = *ptr; //read an integer value from the 10th byte 

をメモリを扱います。

+0

"中間"の型付きポインタを作成する代わりに、voidポインタをキャストすることでこれを行うことはできますか? – dtech

+0

もちろん、わかりやすくするために中間表現を使用します – ziu

3

、「仕事」で私はあなたが「どのように私は/ void*にポインタ演算を行う間接参照ください」という意味と仮定?できません;あなたはちょうどメモリのチャンクを読むことに関心があるならば、それをキャストする必要があります、通常char*に。もちろん、その場合は、それを単にchar*と宣言してください。

+0

私は、charだけでなく、あらゆるタイプの読み書きに興味があります。 – dtech

+0

@ddriver:それは何も変わりません。ポインタを投げる必要があります。タイプが不明な場合に、逆参照や算術演算がどのように機能すると思いますか?意味がない。基になるタイプが何であるかを知るためには、追加情報を渡す必要があります。 –

4

ルールは単純です:

  • (関数ポインタを除く)すべてのポインタ型は損失なしに、ボイド*にしてからキャストすることができます。
  • void *ポインタに対してポインタ演算を実行することはできません。逆参照することはできません。
  • sizeof(char)は1になります。したがって、charポインタをインクリメントすることは、 "生の"ポインタ値に "1"を加算することを意味します。

これにより、生のポインタ演算を実行する場合、char *との間でキャストする必要があると結論づけられます。

関連する問題