我还在学习C ++,而且我正在做一些API工作,但我很难解析这个指针安排。
void* data;
res = npt.receive(0x1007, params, 1, response, (void**)&data, size);
uint32_t* op = (uint32_t*)data;
uint32_t num = *op;
op++;
任何人都可以用这个无效指针解释发生了什么吗?我看到它被定义了,它在res行中做了一些事情(可能是初始化的?),然后将它复制到uint32指针,并在num中取消引用。任何人都可以帮我解析(void **)&数据声明吗?
答案 0 :(得分:2)
使用void指针时要注意:
指针的void类型是一种特殊类型的指针。在C ++中,void表示缺少类型。因此,void指针是指向没有类型的值的指针(因此也是未确定的长度和未确定的解除引用属性)。 这使得void指针具有很大的灵活性,能够指向任何数据类型,从整数值或浮点数到字符串。作为交换,它们有一个很大的局限性:它们指向的数据不能直接解引用(这是合乎逻辑的,因为我们没有要取消引用的类型),因此,void指针中的任何地址都需要转换为一些其他指针类型,在被取消引用之前指向具体的数据类型。
答案 1 :(得分:1)
首先:什么是npt?
其次:猜测npt可能是一些解释:
// Declare a pointer to void named data
void* data;
// npt.receive takes as 5th parameter a pointer to pointer to void,
// which is why you provide the address of the void* using &data.
// The void ** appears to be unnecessary unless the data type of the
// param is not void **
// What is "npt"?
res = npt.receive(0x1007, params, 1, response, (void**)&data, size);
// ~.receive initialized data with contents.
// Now make the uint32_t data usable by casting void * to uint32_t*
uint32_t* op = (uint32_t*)data;
// Use the data by dereferencing it.
uint32_t num = *op;
// Pointer arithmetic: Move the pointer by sizeof(uint32_t).
// Did receive fill in an array?
op++;
接收签名是:
<whatever return type> receive(uint16_t code, uint32_t* params, uint8_t nparam, Container& response, void** data, uint32_t& size)
因此数据参数的类型为void **,因此不需要使用(void **)显式类型转换为void **。
考虑到使用情况,收到的数据似乎是uint32_t值的数组IN IN CASE!
Void作为一种类型意味着no type
并且没有关于大小和对齐的类型信息,但对于词汇和句法的一致性是强制性的。
与*一起使用时,它可以用作指向未知类型数据的指针,并且必须在任何使用之前显式地转换为其他类型(添加类型信息)。
如果您不知道特定数据类型或仅接收到普通字节数据,那么API中通常会有void *或void **。
要理解这一点,请阅读C type erasure using void*
请先阅读以下基础知识:
答案 2 :(得分:1)
从代码中,ntp.receive会告诉您它是否在返回代码中成功收到任何内容,但它还需要为您提供收到的。它有一个想要传回的指针,所以你必须告诉它哪里指针是这样的,它可以填充它,因此(void **),一个指向指针的指针,是指针的地址和数据。
当你收到它时,你知道开发人员指出它实际上是一个uint_32值,所以你将void指针复制到一个指向uint_32的指针。事实上,这个步骤是不必要的,因为您可以在上面的调用中将uint_32指针强制转换为void **但我们将允许该幻灯片。
现在您已经告诉编译器指针指向32位数字,您可以在该指针的另一端(* op)取数字并将其存储在本地变量中。同样,不必要的,因为* op可以在随后使用num的任何地方使用。
希望这有帮助。