(struct in_addr **)和*(struct in_addr *)之间的区别

时间:2013-03-13 05:55:35

标签: c++ c

(struct in_addr **)*(struct in_addr *)之间有什么区别?请用一个例子清楚解释。

2 个答案:

答案 0 :(得分:5)

表达式(struct in_addr **) 投射指向指向struct in_addr的指针。

表达式*(struct in_addr *)向指向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,但您知道它指向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 ++中,您可以使用例如reinterpret_cast取而代之,如:

in_addr** addresses = reinterpret_cast<in_addr**>(ptr);

答案 1 :(得分:2)

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

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