帮助理解 - > C中的操作员

时间:2011-07-01 20:19:41

标签: c gcc

  

可能重复:
  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;
}

2 个答案:

答案 0 :(得分:3)

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

foo->x

可以取代

(*foo).x

答案 1 :(得分:1)

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 功能