我有一个返回数组的函数Data.数组的类型是int或float.我想用void指针.如果outputType为0,则Data指向整数数组的指针,如果不是,则指向浮点数组.
是否可以在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;
}
Run Code Online (Sandbox Code Playgroud)
在主要代码中:
int16_t output[3];
getData(output, 0);
Run Code Online (Sandbox Code Playgroud)
你可以这样做:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
所有假设您将其称为:
int16_t output[3];
getData(output, 0);
Run Code Online (Sandbox Code Playgroud)
要么 :
float output[3];
getData(output, 1);
Run Code Online (Sandbox Code Playgroud)
请特别注意不要超出阵列的范围.
说明
任何指向对象类型的指针都可以转换为a void*并再返回原始类型,结果指针将与原始指针进行比较.
这可以用来(如本例所示)来实现可以处理任何指针类型的泛型函数(例如,什么是void*意味着什么以及如何使用它?).
但有一点需要注意:a void*不能解除引用(也不能对其执行指针算法),因此必须在解除引用之前将其转换回原始指针类型.该outputType参数确切地说明原始指针类型是什么,因此该函数可以执行正确的转换.
之后,该函数可以对转换后的指针进行处理,就好像它是原始指针一样.如果原始指针指向数组,则转换后的指针也可用于访问该数组的所有项.