You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言中如何获取传入的int或char指针的具体类型

解决方案

原生void*仅存储内存地址,本身不携带任何类型信息,无法直接从void*反推原指针类型,你可以在指针转为void*的阶段就同步记录类型信息,具体实现分C和C++两种场景:

C++ 实现(无需手动标注类型)

利用模板自动推导输入参数类型,自动匹配对应的类型标签,实现零额外感知的类型记录:

// 定义指针类型枚举
enum class PtrType {
    Int,
    Char,
    Unknown
};

// 定义存储结构体,同时存void指针和类型
struct StoredPtr {
    void* raw_ptr;
    PtrType type;
};

// 模板函数自动推导输入指针类型
template<typename T>
StoredPtr store_pointer(T* input_ptr) {
    StoredPtr res;
    res.raw_ptr = input_ptr;
    if constexpr (std::is_same_v<T, int>) {
        res.type = PtrType::Int;
    } else if constexpr (std::is_same_v<T, char>) {
        res.type = PtrType::Char;
    } else {
        res.type = PtrType::Unknown;
        // 也可以加静态断言 static_assert 禁止非int/char指针传入
    }
    return res;
}

使用时直接传入int指针或char指针即可,无需手动标注类型:

int num = 123;
char ch = 'a';
StoredPtr p1 = store_pointer(&num); // 自动识别为Int类型
StoredPtr p2 = store_pointer(&ch); // 自动识别为Char类型

C 语言实现

C语言没有模板类型推导能力,有两种可选方案:

方案A:手动传递类型标签

// 定义类型枚举
typedef enum {
    PTR_TYPE_INT,
    PTR_TYPE_CHAR,
    PTR_TYPE_UNKNOWN
} PtrType;

// 存储结构体
typedef struct {
    void* raw_ptr;
    PtrType type;
} StoredPtr;

StoredPtr store_pointer(void* input_ptr, PtrType type) {
    StoredPtr res = {
        .raw_ptr = input_ptr,
        .type = type
    };
    return res;
}

调用时手动指定传入指针的类型:

int num = 123;
char ch = 'a';
StoredPtr p1 = store_pointer(&num, PTR_TYPE_INT);
StoredPtr p2 = store_pointer(&ch, PTR_TYPE_CHAR);

方案B:宏包装简化调用

用宏拼接类型标签,减少重复代码:

#define STORE_POINTER(ptr, type) store_pointer((ptr), PTR_TYPE_##type)

// 调用示例
StoredPtr p1 = STORE_POINTER(&num, INT);
StoredPtr p2 = STORE_POINTER(&ch, CHAR);

注意事项

  • 所有类型记录逻辑必须在指针转为void*之前完成,一旦转为无类型的void*就无法再获取原始类型信息
  • 如果后续需要扩展支持更多指针类型,只需要扩展枚举值和对应的类型判断逻辑即可

内容的提问来源于stack exchange,提问作者procoder35

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 21:54:02