私は教科書を見ていますが、そこにあるコードについては少し混乱しています。一部では、彼らは次のようにポインタ演算を実行している:void *とchar *ポインタの算術
void* bp;
...
bp = (void*)((char*)(bp)+16);
...
が、後に、彼らは次のようにします。
void* bp;
...
bp = bp+16;
...
彼らは二つの異なるものでなければなりませんような気がしますが、彼らが扱っていますそれは同じことが好きです。 たとえば、あなたが(例えば整数配列のための)配列アクセスを行うとしたら、あなたはこの場合は、次の
int* a = malloc(n*sizeof(int));
...
q = *(a+1);
...
を行うだろう、私は次のにアクセスしていない、ので、私はこのように感じます整数配列の4バイトで、次のバイトではありませんか? 同様に、もし私がvoid * aを持っていれば、次の4バイトは*(a + 1)でなければならないと感じます... それともそうではありませんか? ありがとうございます。
この2番目の例はコンパイルすべきではありません。 –
@OliCharlesworth:準拠モードでコンパイルすると、コンパイルされません(または少なくとも警告をトリガーします)。 gccはデフォルトでは準拠しておらず、拡張として 'void *'算術を実装しています。 –