14

教科書に目を通していますが、そこにあるコードのいくつかについて少し混乱しています。ある部分では、次の方法でポインター演算を実行しています。

void* bp;
...
bp = (void*)((char*)(bp)+16);
...

しかし、後で、彼らは次のことを行います。

void* bp;
...
bp = bp+16;
...

両者は別のものであるべきだと思いますが、同じものとして扱っています。たとえば、配列アクセス(整数配列など)を行う場合、次のようにするため、このように感じます。

int* a = malloc(n*sizeof(int));
...
q = *(a+1);
...

この場合、次のバイトではなく、整数配列の次の 4 バイトにアクセスしていませんか? 同様に、void* a がある場合、*(a+1) は次の 4 バイトである必要があると感じています... それともそうではないのでしょうか? ありがとうございました。

4

2 に答える 2

18

手違いです。算術は標準では定義されていませんが、一部のコンパイラは拡張として提供し、算術void *と同じように動作します。char *2 番目は正式には有効な C ではありませんが、おそらく (悪い) 習慣からすり抜けました。

于 2012-04-07T20:48:30.710 に答える