说明对于代码段(结构)

时间:2017-12-29 10:24:59

标签: c pointers structure dereference

#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 ) ;

2 个答案:

答案 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

此外,->运算符与.运算符类似,只有->用于指向结构的指针,而.用于结构。