(struct in_addr **)
和 和有什么不一样*(struct in_addr *)
?请举例说明清楚。
2 回答
该表达式(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);
(struct in_addr **)
是一个 C 风格的强制转换运算符,将其右侧的任何内容转换为指向类型结构in_addr
(通用网络地址)的指针的指针。
*(struct in_addr *)
是一个 C 风格的强制转换运算符,后跟一个取消引用运算符(从右到左读取),将其右侧的任何内容转换为指向 an 的指针in_addr
,然后取消引用该指针。