我仍然在学习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**)&数据声明吗?
发布于 2017-06-12 07:39:12
第一:什么是“不扩散条约”?
第二:猜测“不扩散条约”可能是什么解释:
// 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值的数组!
虚空作为一种类型意味着no type,没有关于大小和对齐的类型信息是可用的,但是对于词法和句法的一致性是强制性的。
与*一起,它可以用作未知类型数据的指针,并且必须在任何使用之前显式转换为另一类型(添加类型信息)。
如果您不知道特定的数据类型或只接收到普通字节数据,则API中通常有一个void*或void**。
要理解这一点,请阅读C type erasure using void*
请先阅读基本知识,然后:
发布于 2017-06-12 07:42:25
使用空指针时请注意:
指针的空类型是一种特殊类型的指针。在C++中,void表示类型的缺失。因此,空指针是指向没有类型的值的指针(因此也是一个未定的长度和未确定的去引用属性)。这为空指针提供了很大的灵活性,因为它能够指向任何数据类型,从整数值或浮点数到字符串。作为交换,它们有一个很大的限制:它们所指向的数据不能直接取消引用(这是合乎逻辑的,因为我们没有要取消引用的类型),因此,空指针中的任何地址都需要转换为指向具体数据类型的其他指针类型,然后才被取消引用。
来自C++参考
发布于 2017-06-12 07:46:33
从代码中,ntp.receive告诉您它是否在返回代码中成功地接收到了什么,但它也需要给出它所收到的内容。它有一个它想要传回的指针,所以你必须告诉它指针在哪里,这样它才能填充它,因此(void **)是指向指针的指针,它是指针的地址&数据。
当您收到它时,您知道作为开发人员,它所指向的实际上是一个uint_32值,因此您将空指针复制到指向uint_32的指针中。实际上,这个步骤是没有必要的,因为您可以在上面的调用中将uint_32指针转换为void**,但是我们会让它滑过。
既然您已经告诉编译器指针指向一个32位数,您就可以将指针的另一端的数字(*op)存储在一个局部变量中。同样,没有必要,因为*op可以在随后使用num的任何地方使用。
希望这能有所帮助。
https://stackoverflow.com/questions/44493675
复制相似问题