#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 ) ;
答案 0 :(得分:2)
那是因为p->a
表示(*p).a
。
所以想想,
你想得到p
指向的结构,所以你写var1.p
但这是指针 - 所以你取消引用它来获得struct
。 *(var1.p)
。
然后你有了另一个struct
,你想得到它的i
变量。所以你做了
*(var1.p).i
等同于var1.p->i
。
同样正如指出的那样 - 它是
struct s
{
int i ;
struct s *p ;
} ;
var2.p -> var1.i
这是非法的,因为struct s
没有名为var1
的记事本。
答案 1 :(得分:1)
var1.p
是指向var2
的struct的指针。这意味着var1.p->i
就像var2.i
此外,->
运算符与.
运算符类似,只有->
用于指向结构的指针,而.
用于结构。