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

use*_*634 -3 c c++

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

Som*_*ude 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` */
}
Run Code Online (Sandbox Code Playgroud)

其他示例:如果您有另一个也接受指针的函数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`... */
}
Run Code Online (Sandbox Code Playgroud)

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

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


请注意,这里使用的铸件是旧的C型铸造.在C++中,您可以使用eg reinterpret_cast,例如:

in_addr** addresses = reinterpret_cast<in_addr**>(ptr);
Run Code Online (Sandbox Code Playgroud)