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

Difference between (struct in_addr **) and *(struct in_addr *)

本文关键字:addr struct in 区别      更新时间:2023-10-16

(struct in_addr **)*(struct in_addr *)的区别是什么?

表达式(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);

(struct in_addr **)是c风格的强制转换操作符,将其右边的内容转换为指向in_addr类型结构体(通用网络地址)的指针。

*(struct in_addr *)是c风格的强制转换操作符,后跟一个解引用操作符(从右向左读),将其右边的内容转换为指向in_addr的指针,然后对该指针解引用。