ポインター演算はポインターには適用できないため、「正式な」C では元の試みは正しくありませんvoid *
。void *
ただし、一部のコンパイラは、非標準拡張機能としてポインターのポインター演算をサポートしています(GCC が注目すべき例です)。このようなコンパイラでは、ポインターは算術目的のポインターvoid *
として扱われます。char *
そしてあなたの
for(i = 0; i < 3; i++)
printf("%i\n", *((int *) (data + sizeof(int) * i)));
実際には、そのようなコンパイラで意図したとおりに機能します。
よりペダンティックなコンパイラを使用すると、次のようにしてその日を節約できます
for(i = 0; i < 3; i++)
printf("%i\n", *((int *) ((char *) data + sizeof(int) * i)));
しかし、いずれにせよ、上記の 2 つのコードは絶望的に複雑すぎます。ポインター演算を学習しているだけの場合の例としては、ある程度の価値がありますが、それだけで十分です。
本当に必要なのはただ
for(i = 0; i < 3; i++)
printf("%i\n", ((int *) data)[i]);
他の回答が示唆しているように、追加のポインターを導入int *
して、コードをさらに読みやすくすることができます。しかし、それはあなた次第です。