如何从类型“ void *”发送指向数组中元素的指针?

时间:2018-06-28 13:52:41

标签: c arrays pointers void

给出以下数组(例如):

int arr[6] = {1 , 2 , 3 , 4 , 5, 6};

如果我将其发送给具有以下功能的函数:

int func(void* array, int n);

如何从func发送到以下功能:

int f(void* element);

数组中某些元素的地址?

我试图做这样的事情:f(array + i);(为了发送&array[i]),但是出现以下错误:

  

算术中使用的'void *'类型的指针

那么,我该怎么办?

2 个答案:

答案 0 :(得分:4)

出于任何原因接受您不会写

int func(int* array, int n);

您需要将array的类型改回为指针算术有效的内容:

int* real_array = (int*)array;

然后,您可以使用易记符号real_array[i]来访问元素。

如果从某种意义上说您不知道func是通用的,则必须将元素大小和数组大小一起传递:

int func(void* array, int/*ToDo - use size_t here too*/ n, size_t element_size)

那么您可以使用

f((const char*)array + i * element_size)

尽管我担心这只是将解决通用性的问题进一步推向了调用堆栈。

答案 1 :(得分:2)

如果func需要能够处理不同类型的数组,那么您需要在size_t上添加一个新的func自变量来告诉它数组的大小项目。否则,诸如array[1]之类的定义不明确:您是说array + 4 bytesarray + 8 bytesarray + 1 byte还是其他?

如果具有项目大小参数,则可以将array强制转换为char*,并偏移i * item_size以获得指向第i个元素的指针。

(请注意,您的商品尺寸参数可能应该是size_t,而不是int。)