关于指向C中指针的指针

时间:2015-03-27 01:28:28

标签: c pointers

有谁能告诉我这些差异:

  1. target_addr.sin_addr = *(struct in_addr *)(target->h_addr_list[0]); 这很有效。

  2. target_addr.sin_addr.s_addr = (unsigned int)(*(target->h_addr));
    //h_addr = h_addr_list[0]
    这一行没有任何语法错误,但我不知道它是否有效。

  3. target_addr.sin_addr.s_addr = *(struct in_addr *)(target->h_addr_list[0])->s_addr;
    为什么这条线不起作用?我认为这条线的含义与上面两条完全相同......

  4. 变量来自:

    struct hostent *target; 
    struct sockaddr_in target_addr;
    

1 个答案:

答案 0 :(得分:2)

我并不完全熟悉这些结构,但我可以对指针发表评论。小心所有的演员阵容 - 你真的确定h_addr存储你认为的是什么?

在你的第三行代码中,s_addr不是一个指针,你试图将它取消引用,就好像它一样。你的三行代码没有相同的含义。

  1. 在这里,您投射 target->h_addr_list[0]pointer struct in_addr。在演员之后,您现在正在使用pointerstruct in_addr。然后,取消引用 pointer,加载 值为sin_addr

  2. 在这里,您解除引用 target->h_addr(作为某人 提到的是target->h_addr_list[0])的别名然后 将它转换为unsigned int。

  3. 此处您投射 target->h_addr_list[0]pointer struct in_addr,到目前为止,与#1相同。然后,您访问该字段 s_addr的{​​{1}}。这种访问的结果是 值struct in_addr
    然后,您尝试取消引用该值,但它不是 struct in_addr.s_addr。我假设您收到间接相关错误