代码片段的说明(结构)

Explanation For code snippet (Structures)

#include<stdio.h>
#include<stdlib.h>

struct s
{
 int i ;
 struct s *p ; 
} ;

int main( )
{
 struct s var1, var2 ;
 var1.i = 100 ;
 var2.i = 200 ;
 var1.p = &var2 ;
 var2.p = &var1 ;
 printf ( "\n%d %d", var1.p -> i, var2.p -> i ) ;
 return 0;
}

我需要了解有关此行的一些信息:

printf ( "\n%d %d", var1.p -> i, var2.p -> i ) ;

为什么要用箭头运算符,为什么箭头运算符后面只有i,而不是这样:

printf ( "\n%d %d", var1.p -> var2.i, var2.p -> var1.i ) ;

var1.p是指向var2的struct s的指针。这意味着 var1.p->i 就像 var2.i

此外,-> 运算符类似于 . 运算符,只是您将 -> 用于指向结构的指针,将 . 用于结构。

那是因为 p->a 表示 (*p).a

这么想,

你想得到 p 指向的结构,所以你写 var1.p 但那是指针 - 所以你取消引用它以获得 struct*(var1.p).

然后你有另一个 struct,你想得到它的 i 变量。所以你

*(var1.p).i 相当于 var1.p->i.

也正如 alk 指出的那样——它是

struct s
{
 int i ;
 struct s *p ;
} ; 

var2.p -> var1.i

这是非法的,因为 struct s 没有名为 var1 的成员。