c - 在 C 中返回一个 void 指针作为函数参数

标签 c pointers void

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

相关文章:

c - 打印 "test"最有效的方法?

c - 在澄清简单的汇编代码和有关我的分析的反馈方面需要帮助

c - execlp() 系统调用输出错误

c - K&R 练习 1-20 - 需要一些说明

swift - 是否有任何可能的显式使用空元组 () 的实例(值),即 typealias 'Void' 的实例?

c++ - Char 数组和 uintptr_t

C 动态指针数组分配。为什么我可以访问超出范围的元素?

c - 警告 : dereferencing 'void *' pointer error - C

c - (void*) 在类型转换中意味着什么?

c - 为什么没有参数的函数(与实际函数定义相比)可以编译?