我是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;
}
答案 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 功能