【问题标题】:Help understanding -> operator in C [duplicate]帮助理解-> C 中的运算符 [重复]
【发布时间】:2011-09-27 00:37:46
【问题描述】:

可能重复:
Arrow operator (->) usage in C

我是 C 新手,我正在尝试理解这个函数(见下文)。

让我困惑的主要部分是:

sp->s_port = htons(SP->s_port); 

p = sp->s_port;

我不确定我是否理解 -> 运算符。

这是整个函数... HOSTBUFFERLENGTH 设置为 1024(不确定是否重要)

int gi_get_port (char *serv, char *prot)
/* obtain the port for the named service */
{
  int p, s;

  /* Data for resolving service name to a socket description. */
  struct servent *sp = NULL;

  char            GSBN_servbuf[HOSTBUFFERLENGTH] = {0};                     
   struct servent  GSBN_sp;                                                  
   struct servent *GSBN_serv_result;                                         
   int             GSBN_s = 0;                                               
   GSBN_s = getservbyname_r(serv,                                         
                       prot,                                             
                       &GSBN_sp,                                             
                       GSBN_servbuf,                                         
                       sizeof(GSBN_servbuf),                                 
                       &GSBN_serv_result);                                   
   sp = GSBN_serv_result;                                                    
   sp->s_port = htons(SP->s_port);                                           
   if (sp && SOCKET_DEBUG) {                                                 
      printf("%s GET_SERVICE_BY_NAME - Service: %s Port: %d Protocol: %s\n", 
                 get_timestamp(), sp->s_name, sp->s_port, sp->s_proto);          
       }                                                                         
   if (sp == NULL) {                                                         
      fprintf(stderr, "%s GET_SERVICE_BY_NAME - Service %s not found.\n",    
              get_timestamp(), serv);                                     
   }

  if (sp != NULL) {
    p = sp->s_port;
  } else {
    p = -1;
  };

  return p;
}

【问题讨论】:

    标签: c gcc


    【解决方案1】:

    -> 运算符是取消引用指针然后访问它指向的结构的成员的简写。

    foo->x

    可以代替

    (*foo).x

    【讨论】:

      【解决方案2】:

      p->y(*p).y 的简写


      在 C 中至少有三种方法可以在给定指向结构的指针的情况下获取特定字段:

      p->y
      (*p).y
      p[0].y
      

      总的来说,-> 操作符的需求源于 C 的解引用操作符是前缀而不是后缀,所以它很难用于结构解引用的常见情况。

      Pascal 语言确实有一个不错的功能:^,它是一个后缀取消引用运算符。如果 C 有同样的东西你可以写:

      p^.y // or perhaps...
      p*.y
      

      DMR 似乎在一篇论文中声明1,他会在早期切换到后缀解引用,但 C 已经非常成熟。无论哪种方式,表达式语法都是合理可行的,但它也可以解开 C 声明语法,并消除以人们一直难以理解的由内而外的方式阅读它们的大部分需要:

      int *fp();
      int fp()*;    // alternate universe
      
      int (*pf)();
      int pf*();    // alternate universe
      
      int *(*pfp)();
      int pfp*()*;  // alternate universe
      

      1. See The Development of the C Language., Dennis M. Ritchie

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-08-27
        • 2020-10-19
        • 1970-01-01
        • 2013-07-10
        • 2017-11-14
        • 2011-05-13
        • 1970-01-01
        相关资源
        最近更新 更多