将void指针作为C中的函数参数返回

Ima*_*n H 1 c pointers void

我有一个返回数组的函数Data.数组的类型是intfloat.我想用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)

San*_*ker 7

你可以这样做:

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参数确切地说明原始指针类型是什么,因此该函数可以执行正确的转换.

之后,该函数可以对转换后的指针进行处理,就好像它是原始指针一样.如果原始指针指向数组,则转换后的指针也可用于访问该数组的所有项.