定义一个将在内存上运行的函数时,将地址作为void *或uint8 *传递更正确吗?

时间:2014-06-21 22:26:09

标签: c++ pointers syntax types casting

大多数现有的运行时内存函数接受或返回void *,它允许传递参数而不显式地转换指针类型。在创建自定义内存函数时是否应该复制此模式?

换句话说,以下哪项更正确,以及为什么:

int read_bytes( void * dest, size_t count );

int read_bytes( uint8_t * dest, size_t count );

3 个答案:

答案 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指针进行内存引用,例如memcpymemchr,所以偶尔使用相同的类型会很方便。

另一方面,如果你认为内存是一个字节数组,特别是如果你想访问内存中的随机字节(即执行指针或迭代器算术),你绝对应该使用char指针类型。关于哪一个是最好的,存在一定的争论;通常,对于I / O,您希望将char作为“系统的I / O数据类型”(例如,读/写I / O)。另一方面,如果要对算术字节值进行操作,unsigned char更合适。但是这两种类型是布局兼容的,所以如果有必要,可以随意将其中一种视为另一种。