我有一个返回数组 Data
的函数。数组的类型是 int
或 float
。我想使用 void
指针。如果 outputType
为 0,则 Data
将指向整数数组,否则它将指向 float 组。
是否可以在 C 中执行此操作?
void getData(void *Data , uint8_t outputType)
{
...
int16_t acc[3]={0,0,0};
...
acc[0] = (int16_t) ((data[1]*256+data[0]));
acc[1] = (int16_t) ((data[3]*256+data[2]));
acc[2] = (int16_t) ((data[5]*256+data[4]));
Data = acc;
}
在主要代码中:
int16_t output[3];
getData(output, 0);
最佳答案
你可以这样做:
void getData(void *Data , uint8_t outputType) {
if (outputType == 0) {
int16_t* data = Data;
/* fill int16_t data here - eg. : */
data[0] = 42;
}
else {
float* data = Data;
/* fill float data here - eg. : */
data[0] = 42.0f;
}
}
假设您将其称为:
int16_t output[3];
getData(output, 0);
或:
float output[3];
getData(output, 1);
特别注意不要超出数组的边界。
解释
任何指向对象类型的指针都可以转换为 void*
并再次返回到原始类型,结果指针将与原始指针比较。
这可用于(如在本例中)实现适用于任何指针类型的通用函数(引用,例如 What does void* mean and how to use it?)。
但有一个警告:void*
不能被取消引用(也不能对其执行指针运算),因此必须在取消引用之前将其转换回原始指针类型。 outputType
参数准确说明原始指针类型是什么,因此该函数可以执行正确的转换。
之后,函数可以像处理原始指针一样处理转换后的指针。如果原始指针指向数组,则转换后的指针也可用于访问该数组的所有项。
关于c - 在 C 中返回一个 void 指针作为函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52257704/