(struct in_addr **)
和*(struct in_addr *)
之间有什么区别?请用一个例子清楚解释。
答案 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
的指针,然后取消引用指针。