C语言结构体--箭头运算符(“->”)和点运算符(“.”) 应用区分

1.问题描述

        学习C/C++等语言的伙伴经常遇到结构体这一词,如下所示表示 日期 的一个结构体:

        struct Date{

                int year; //年

                int month; //月

                int day; //日

        }a,b,*p; //定义 结构体变量a和b,结构体指针变量p

        

        数据的定义不会感到不好理解,问题是使用:点运算符(“.”)   还是 箭头运算符(“->”) 调用内部成员 ?

        特别是当涉及到链式存储的时候常常需要 指针运算符(“->”) 和 点运算符(“.”) 相互配合访问数据,分清两种运算符的作用实质,就可以自然的正确运用运算符访问数据。

        概述:" 访问结构体成员用 " . " 点运算符,访问结构体指针的成员用 " -> " 箭头运算符 "。

2.优先级

        在 C 语言中," ."(点运算符)" -> "(箭头运算符)具有相同的优先级,且结合性是从左向右。当它们在同一个表达式中出现时,按照从左往右的顺序依次计算。

3.实例分析

(1)“.” 运算符访问结构体成员

        ------->> 使用 " . " 访问结构体成员,即 " 变量名.元素 " ,如下代码内容:

#include<stdio.h>

//日期结构体 
struct Date{
	int year;//年 
	int month;//月 
	int day;//日 
};

//学生信息结构体 
struct student {
	int number;//学号 (为简洁理解,在这里只用学号一个数据来表示,当为多个类型数据方法相同) 
	struct Date birthday; //生日,  在学生结构体中嵌套日期结构体变量birthday
	
}s;//定义一个学生结构体类型的变量 s 

int main(){
	s.number=12;//为学生结构体类型的变量 s 中的学号number数据赋值 
	s.birthday.year=6666;//年 
	s.birthday.month=77; //月 
	s.birthday.day=88;//日 
	
	//输出信息———使用 “. ”运算符 
	printf("学生学号:%d,生日:%d---%d---%d",s.number,s.birthday.year,s.birthday.month,s.birthday.day); 
	return 0;
}

         运行结果如下:

        在上述实例中,定义日期结构体和学生信息结构体,其中日期结构体嵌套在学生结构体中,学生结构体变量s 是普通结构体变量,访问其内部元素直接使用 “.” 运算符即可。

        而日期结构体普通变量birthday嵌套在student中,对student而言birthday是一个结构体普通变量成员,因此用“.”运算符访问日期结构体变量birthday中的成员数据。

        综合即可通过 s 调用 birthday,然后 birthday 调用自身的成员 year,形成 s.birthday.year ,最终可获取到 对应的数据。

        对于 “ 将一个结构体普通变量作为另一个结构体普通变量成员 ”或其他情况,按要求调用即可。

        因此,对于 结构体成员 用 " ."(点运算符)访问,即“结构体变量.内部成员” 。

(2)“->” 运算符访问结构体成员

        --->>  " -> " 访问结构体成员,即 " 指针名->元素 " ,如下代码内容:

#include<stdio.h>

//日期结构体 
struct Date{
	int year;//年 
	int month;//月 
	int day;//日 
};

//学生信息结构体 
struct student {
	int number;//学号 (为简洁理解,在这里只用学号一个数据来表示,当为多个类型数据方法相同) 
	struct Date birthday; //生日,  在学生结构体中嵌套日期结构体变量birthday
	
}s,*p=&s;//定义一个学生结构体类型的 变量s 和 指针变量 p,并对p赋值,使p指向s 

int main(){
	p->number=12;//为学生结构体类型的变量 s 中的学号number数据赋值 
	p->birthday.year=6666;//年 
	p->birthday.month=77; //月 
	p->birthday.day=88;//日 
	
	//输出信息———使用 “. ”运算符 
	printf("学生学号:%d,生日:%d---%d---%d",p->number,p->birthday.year,p->birthday.month,p->birthday.day); 
	return 0;
}

        运行结果如下:

        在上述实例中,定义日期结构体和学生信息结构体,其中日期结构体嵌套在学生结构体中,定义了学生结构体变量s和指针变量p并用s的地址初始化指针p,因为p是指针变量,所以通过p访问指针数据时使用​ 指针运算符(“->”)。

        我们使用结构体指针p访问内部成员,因此使用 " -> " 箭头运算符。 日期结构体变量birthday嵌套在student中,对student而言birthday是一个普通的结构体变量成员,因此用“.”运算符即可访问日期结构体变量birthday中的成员数据。

        反过来,如果是 结构体普通变量 内部包含结构体指针变量。通过 结构体普通变量 使用 “点运算符”调用内部结构体指针变量成员,然后再使用 “箭头运算符”调用结构体指针变量成员内部元素即可。(说明: 这样的情况是不同 结构体变量 互相嵌套作为成员的情况,当你明白不同的 结构体变量类型 使用的  “运算符” 即可清晰的知道如果调用对应的成员)

        因此,对于 结构体指针变量用箭头运算符访问内部成员,即“结构体指针变量->内部成员” 。

4.小结

        通过上述实例,主要区分为:

         “.” 用于直接访问 结构体或联合体的成员“->” 用于访问结构体 指针的成员 

        对于复杂的情况常见的是 " 不同 结构体变量 嵌套作为 另一结构体成员 的情况 ":

       1.分清楚是什么类型的  结构体变量。

       2.这种类型的结构体变量是 使用 " ."(点运算符)" -> "(箭头运算符)调用内部成员。

        

        基本上就是这个过程。

  • 42
    点赞
  • 196
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

等日出看彩虹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值