大多数现有的运行时内存函数接受或返回void *,它允许传递参数而不显式地转换指针类型。在创建自定义内存函数时是否应该复制此模式?
换句话说,以下哪项更正确,以及为什么:
int read_bytes( void * dest, size_t count );
或
int read_bytes( uint8_t * dest, size_t count );
?
答案 0 :(得分:4)
我建议使用void*
。否则,对函数的每次调用都将如下所示:
int n = read_bytes((uint8_t*)&myVar, sizeof(myVar));
而不仅仅是
int n = read_bytes(&myVar, sizeof(myVar));
答案 1 :(得分:2)
void *是C / C ++中的通用指针。它用于您不希望使用数据指定的特定类型并且无需转换指针的情况。它也是您希望与原始地址一起使用的指针。
你可以使用uint_t来指定你真正处理的是无符号整数。
答案 2 :(得分:1)
如果将内存仅视为原始的,不透明的内存而不是字节序列,那么void *
是一种合适的类型。这可能是惯用的,例如,当使用placement-new在内存中创建对象时。还有一些传统的C API使用void指针进行内存引用,例如memcpy
或memchr
,所以偶尔使用相同的类型会很方便。
另一方面,如果你认为内存是一个字节数组,特别是如果你想访问内存中的随机字节(即执行指针或迭代器算术),你绝对应该使用char指针类型。关于哪一个是最好的,存在一定的争论;通常,对于I / O,您希望将char
作为“系统的I / O数据类型”(例如,读/写I / O)。另一方面,如果要对算术字节值进行操作,unsigned char
更合适。但是这两种类型是布局兼容的,所以如果有必要,可以随意将其中一种视为另一种。