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
保证是有符号的,所以这是一个明显的区别。当我从太空给它传递一组我的地球照片时,它失败了,