6

void ポインターを返す関数があります。指しているデータのブロックが int の配列であることを知っているとしましょう。どうすれば印刷できますか?

別のスレッドから、この方法で void を目的のデータ型としてキャストしたことがわかりました。

printf("%i",*((int*)data));

しかし、私が言ったように、データは int の配列です。私はこれをやろうとしましたが、有効な表現ではありません:

for(i = 0; i<3; i++){
    printf("%i \n", *((int*)(data+sizeof(int)*i)));
}

これを印刷する適切な方法は何ですか?

4

2 に答える 2

8

一時的なものを使用してint*ください:

int *p = data;
for (int i=0; i<3; i++)
    printf("%i\n", p[i]);

最初の行には明示的なキャストがないことに注意してください。これは、明示的なキャストを使用する必要がなくvoid*、回避することが適切な C スタイルと見なされるためです。ループ内では、配列自体であるかのように、配列へのポインターにインデックスを付けることができるという事実を使用しました。

于 2013-06-05T21:48:47.217 に答える
3

ポインター演算はポインターには適用できないため、「正式な」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 *して、コードをさらに読みやすくすることができます。しかし、それはあなた次第です。

于 2013-06-05T22:02:17.577 に答える