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
相关产品推荐
相关产品推荐

