C++11 C++;11指针(无效**)和;数据 我还在学习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++;

C++11 C++;11指针(无效**)和;数据 我还在学习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++;,c++11,pointers,C++11,Pointers,有人能解释一下那个空指针是怎么回事吗?我看到它被定义了,它在res行中做了一些事情(可能初始化了?),然后它被复制到一个uint32指针,并在num中取消引用。有人能帮我解析(void**)和数据声明吗?首先:什么是npt 第二:猜测npt可能是什么解释: // Declare a pointer to void named data void* data; // npt.receive takes as 5th parameter a pointer to pointer to void, /

有人能解释一下那个空指针是怎么回事吗?我看到它被定义了,它在res行中做了一些事情(可能初始化了?),然后它被复制到一个uint32指针,并在num中取消引用。有人能帮我解析(void**)和数据声明吗?

首先:什么是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)
receive(uint16\u t code、uint32\u t*参数、uint8\u t nparam、容器和响应、void**数据、uint32\u t和大小)
因此,数据参数的类型已经是void**,因此不需要使用(void**)将显式类型转换为void**

考虑到使用情况,在本例中,接收的数据似乎是uint32_t值的数组

Void作为一种类型意味着
没有类型
,并且没有关于大小和对齐的类型信息可用,但对于词汇和语法的一致性是必需的

与*结合使用时,它可以用作指向未知类型数据的指针,并且在使用之前必须显式转换为另一种类型(添加类型信息)

如果您不知道特定的数据类型或只接收到纯字节数据,那么在API中通常会有一个void*或void**

要理解这一点,请阅读使用void*的C类型擦除

请先通读以下基础知识:

  • 动态分配的C数组
  • 指针和指针算法 第一:什么是核不扩散条约

    第二:猜测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)
    
    receive(uint16\u t code、uint32\u t*参数、uint8\u t nparam、容器和响应、void**数据、uint32\u t和大小)
    
    因此,数据参数的类型已经是void**,因此不需要使用(void**)将显式类型转换为void**

    考虑到使用情况,在本例中,接收的数据似乎是uint32_t值的数组

    Void作为一种类型意味着
    没有类型
    ,并且没有关于大小和对齐的类型信息可用,但对于词汇和语法的一致性是必需的

    与*结合使用时,它可以用作指向未知类型数据的指针,并且在使用之前必须显式转换为另一种类型(添加类型信息)

    如果您不知道特定的数据类型或只接收到纯字节数据,那么在API中通常会有一个void*或void**

    要理解这一点,请阅读使用void*的C类型擦除

    请先通读以下基础知识:

  • 动态分配的C数组
  • 指针和指针算法
    使用空指针时请注意:

    void类型的指针是一种特殊类型的指针。在C++中,空隙表示类型的缺失。因此,void指针是指向没有类型的值(因此也是未确定长度和未确定解引用属性)的指针。 这为void指针提供了极大的灵活性,因为它能够指向任何数据类型,从整数值或浮点到字符串。在交换中,它们有一个很大的限制:它们指向的数据不能直接去引用(这是逻辑的,因为我们没有要去引用的类型),因此,在去引用之前,空指针中的任何地址都需要转换为指向具体数据类型的其他指针类型


    中,使用无效指针时请注意:

    void类型的指针是一种特殊类型的指针。在C++中,空隙表示类型的缺失。因此,void指针是指向没有类型的值(因此也是未确定长度和未确定解引用属性)的指针。 这为void指针提供了极大的灵活性,因为它能够指向任何数据类型,从整数值或浮点到字符串。在交换中,它们有一个很大的限制:它们指向的数据不能直接去引用(这是逻辑的,因为我们没有要去引用的类型),因此,在去引用之前,空指针中的任何地址都需要转换为指向具体数据类型的其他指针类型


    从代码中,ntp.receive告诉您它是否成功地接收到返回代码中的任何内容,但它还需要提供它接收到的内容。它有一个要传回的指针,因此您必须告诉它该指针的位置,以便它可以填充它,因此(void**),一个指向指针的指针,即指针的地址和数据

    当您收到它时,作为开发人员,您知道它所指向的实际上是一个uint_32值,因此您可以将void指针复制到一个指向uint_32的指针中。事实上,这一步是不必要的,因为您可以在上面的调用中将uint_32指针强制转换为void**,但我们将顺其自然

    现在,您已经告诉编译器指针指向一个32位的数字,您可以获取该指针另一端的数字(*op)并将其存储在局部变量中。同样,不必要,因为*op可以在随后使用num的任何地方使用


    希望这能有所帮助。

    从代码中,ntp.receive会告诉您它是否在返回代码中成功接收到任何内容,但它还需要向您提供它接收到的内容。它有一个要传回的指针,因此您必须告诉它该指针的位置,以便它可以填充它,因此(void**),一个指向指针的指针,即指针的地址和数据

    当您收到它时,作为开发人员,您知道它所指向的实际上是一个uint_32值,因此您可以将void指针复制到一个指向uint_32的指针中。事实上,这一步是不必要的,因为您可以在上面的调用中将uint_32指针强制转换为void**,但我们将顺其自然

    既然你已经告诉我了