-3

(struct in_addr **)和 和有什么不一样*(struct in_addr *)?请举例说明清楚。

4

2 回答 2

6

该表达式(struct in_addr **)正在将某些内容转换为指向指向 a 的指针的指针struct in_addr

该表达式*(struct in_addr *)将某些内容转换为指向 a 的指针struct in_addr,并取消引用该指针。


示例:假设您有一个接受void指针的函数,即它可以接受指向任何东西的指针,并且您知道它实际上是指向其他东西的指针,您可以将该指针转换为正确的指针类型:

void some_fun(void *ptr)
{
    /* I know that `ptr` is really a pointer to a pointer to a `struct in_addr` */
    /* In other words, an array of pointers to `struct in_addr` */
    struct in_addr **addresses = (struct in_addr **) ptr;

    /* Do something with the array of pointers in `addresses` */
}

其他示例:如果您有另一个函数也需要指向 的指针void,但您知道它指向 a struct in_addr,并且您希望将其转换为普通结构而不使用指针访问:

void some_other_fun(void *ptr)
{
    /* I know that `ptr` is really a pointer to a `struct in_addr` */
    /* Copy the data from that structure into my own structure */
    struct in_addr addr = *(struct in_addr *) ptr;

    /* Use `addr`... */
}

在第一个示例中,您告诉编译器一种类型的指针实际上是一种类型的指针。

在第二个示例中,您首先告诉编译器该指针是不同类型的指针((struct in_addr *)部分),然后您取消引用该指针以使用一元运算符获取实际结构*


请注意这里使用的类型转换是旧的 C 样式类型转换。在 C++ 中,您将使用 egreinterpret_cast代替,例如:

in_addr** addresses = reinterpret_cast<in_addr**>(ptr);
于 2013-03-13T05:57:45.457 回答
2

(struct in_addr **)是一个 C 风格的强制转换运算符,将其右侧的任何内容转换为指向类型结构in_addr(通用网络地址)的指针的指针。

*(struct in_addr *)是一个 C 风格的强制转换运算符,后跟一个取消引用运算符(从右到左读取),将其右侧的任何内容转换为指向 an 的指针in_addr,然后取消引用该指针。

于 2013-03-13T05:58:49.890 回答