给出以下数组(例如):
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 *'类型的指针
那么,我该怎么办?
答案 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 bytes
,array + 8 bytes
,array + 1 byte
还是其他?
如果具有项目大小参数,则可以将array
强制转换为char*
,并偏移i * item_size
以获得指向第i
个元素的指针。
(请注意,您的商品尺寸参数可能应该是size_t
,而不是int
。)