6

我有一个返回 void 指针的函数。假设我知道指向的数据块是一个整数数组。我怎样才能打印它们?

从另一个线程中,我看到我以这种方式将 void 转换为所需的数据类型:

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

但就像我说的那样,数据是一个整数数组。我试图这样做,但它不是一个有效的表达式:

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)));

但无论如何,以上两段代码过于复杂是无可救药的。当您只是学习指针算术时,它们作为示例具有一些价值,但这就是它们的全部优点。

你真正需要的只是

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

正如其他答案所建议的那样,您可以引入一个额外的int *指针,以使您的代码更具可读性。但这取决于你。

于 2013-06-05T22:02:17.577 回答