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

C 如何从“void*”类型向数组中的元素发送指针?,c,arrays,pointers,void,C,Arrays,Pointers,Void,给定以下数组(例如): 如果我将其发送到具有以下偏差的功能: int func(void* array, int n); 如何从func发送到以下函数: int f(void* element); 数组中某些元素的地址? int f(void* element); 我试着这样做:f(array+I)(为了发送&数组[i]),但我得到以下错误: 算术中使用的“void*”类型的指针 那么,我该怎么做呢?无论出于什么原因,接受你不能写作的事实 int func(int* array, int

给定以下数组(例如):

如果我将其发送到具有以下偏差的功能:

int func(void* array, int n);
如何从
func
发送到以下函数:

int f(void* element);
数组中某些元素的地址?

int f(void* element);
我试着这样做:
f(array+I)
(为了发送
&数组[i]
),但我得到以下错误:

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


那么,我该怎么做呢?

无论出于什么原因,接受你不能写作的事实

int func(int* array, int n);
您需要将
数组的类型更改回指针算法有效的类型:

int* real_array = (int*)array;
然后您可以使用易处理的符号
real\u 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)

尽管我担心这仅仅是把解决泛型问题的问题推到了调用堆栈的下一层。

无论出于什么原因,接受你不能写的东西

int func(int* array, int n);
您需要将
数组的类型更改回指针算法有效的类型:

int* real_array = (int*)array;
然后您可以使用易处理的符号
real\u 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)

尽管我担心这仅仅是将解决泛型问题的问题进一步推到调用堆栈的底层。

如果
func
需要能够处理不同类型的数组,那么您需要向
func
添加一个新的
size\t
参数来告诉它数组项的大小。否则,类似于
array[1]
的内容定义不清:您是指
array+4字节
array+8字节
array+1字节
,还是其他内容

如果您有一个item size参数,您可以将
array
强制转换为
char*
并偏移
i*item\u size
以获得指向
i
th元素的指针


(请注意,您的项目大小参数可能应该是
size\u t
而不是
int

如果
func
需要能够处理不同类型的数组,那么您需要向
func
添加一个新的
size\u t
参数来告诉它数组项目的大小。否则,类似于
array[1]
的内容定义不清:您是指
array+4字节
array+8字节
array+1字节
,还是其他内容

如果您有一个item size参数,您可以将
array
强制转换为
char*
并偏移
i*item\u size
以获得指向
i
th元素的指针



(请注意,您的项目大小参数可能应该是
size\t
而不是
int

仅使用
int
数组调用
func
,或者
func
array
参数可以是不同的类型吗?
func
是否知道
arr
的类型?如果不是,那么你可能就不走运了。在这种情况下,您必须传递项目大小。首先将其转换为
int*
f((int*)array+i)
@DanielPryden No,
array
不仅仅是
int
数组。@Lundin所以我需要传递额外的参数
int size\ucode>,该参数将描述数组中任何元素的大小?仅使用
int
数组调用
func
,或者
func
array
参数可以是不同的类型吗?
func
是否知道
arr
的类型?如果不是,那么你可能就不走运了。在这种情况下,您必须传递项目大小。首先将其转换为
int*
f((int*)array+i)
@DanielPryden No,
array
不仅仅是
int
数组。@Lundin所以我需要传递额外的参数
int size\uu
,它将描述数组中任何元素的大小?此参数的类型必须是
size\u t
?它不能是
int
?@Software\u t:两个
void*
之间的差异总是可以用
size\u t
表示,但不能保证用
int
表示。所以
size\u t
更正确。如果我将其定义为
int
,哪些类型会出错?(也就是说,在这种情况下,如果我将其定义为
int
?,它可能会失败)另请参阅,以进一步讨论
size\u t
int
之间的差异。还要注意的是,
size\u t
保证是无符号的,而
int
保证是有符号的,所以这是一个明显的区别。当我从太空向它传递一组地球图片时,它失败了,每个图片的大小都是16GB。每当数组元素的大小不能表示为int时,它就会失败。因此,您可能永远不会看到它失败。但是一定要编写正确的代码并使用
size\u t
。此参数的类型必须是
size\u t
?它不能是
int
?@Software\u t:两个
void*
之间的差异总是可以用
size\u t
表示,但不能保证用
int
表示。所以
size\u t
更正确。如果我将其定义为
int
,哪些类型会出错?(也就是说,在这种情况下,如果我将其定义为
int
?,它可能会失败)另请参阅,以进一步讨论
size\u t
int
之间的差异。还要注意的是,
size\u t
保证是无符号的,
int
保证是有符号的,所以这是一个明显的区别。当我从太空给它传递一组我的地球照片时,它失败了,