c - 关于C中指向指针的指针

标签 c pointers

谁能告诉我它们的区别:

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

  2. target_addr.sin_addr.s_addr = (无符号整数)(*(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;
    为什么这条线不起作用?我觉得这行的意思和上面两行一模一样……

变量来自:

struct hostent *target; 
struct sockaddr_in target_addr;

最佳答案

我并不完全熟悉这些结构,但我可以对这些指针进行评论。小心所有的转换 - 您真的确定h_addr正在存储您认为的内容吗?

在你的第三行代码中,s_addr不是一个指针,并且你试图像指针一样取消引用它。你的三行代码的含义不同。

  1. 在这里,您将转换 target->h_addr_list[0] 到一个指针 struct in_addr。转换之后,您现在正在操作指针struct in_addr。然后,您取消引用指针,加载 将值写入sin_addr

  2. 在这里,您取消引用target->h_addr(作为某人 提到的是 target->h_addr_list[0] 的别名),然后 将其转换为无符号整数。

  3. 在这里,您将转换 target->h_addr_list[0]指针 struct in_addr,到目前为止,与 #1 相同。然后,您访问该字段 struct in_addrs_addr。这次访问的结果是 struct in_addr.s_addr 的值。
    然后,您尝试取消引用该值,但它不是 指针。我假设您遇到了间接相关错误

关于c - 关于C中指向指针的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29291821/

相关文章:

c - 如何使用指针读取和打印数字和字符串?

c++如何创建一个使用它自己类型的变量的类

c++ - 在 amd64 Debian 上编译 i386 二进制文件?

c - libesmtp 和文件附加

c - BST C语言如何删除子树?

c - 在 ANSI C 中从 OpenSSL 接收输出的不同方式

c++ - 很难理解 char (*p)[sizeof(c)]; 的优先级原则;

c - 我无法编译带有动态二维数组和指针的 C 文件

c++ - 双对齐

c - C 中的日期格式