C语言的学习(十七)---结构体、联合体、枚举

目录

一、结构体

1.定义:

2.结构体初始化:

3.结构体变量的引用:

4.结构体大小

二、共用体(联合体)

注意:

用途:

三、枚举

注意:

枚举和宏定义的区别: 

四、类型定义


一、结构体

1.定义:

struct student 
{
	int score; 
	char name[20];
	int age;
};   //告诉编译器 ,我定义了一个 新的数据类型 --- 代表学生数据的 -数据类型 
     //自定义数据类型 
	 

类型名: struct student  

             //等价 int ,short,float 等

有三种定义方式:

方式一:


	 先定义结构体类型,再定义结构体变量名 
	 struct stu
	 {
		 ....
	 };//先定义类型
	 struct stu s; //再定义变量名

方式二:

 定义类型的同时定义变量名 
	 struct stu
	 {
		 ....
	 }s={初始化};//先定义类型

方式三:

 //如果这个类型只用一次 
	 定义类型的同时定义变量名,但是省略类型名  
	 struct 
	 {
		 ....
	 }s={初始化};//先定义类型

2.结构体初始化:

struct stu s = {按照成员变量的的顺序,依次初始化};
                  //方式,按照成员变量本身方式初始化
                   //初始化值之间 以 逗号 分隔

    可以初始化:

1.结构体变量 
2.结构体数组

    struct stu s[3] = {{"tom",100,18},{"tom",100,18},{"tom",100,18}};
3.结构体指针 :

目的提高效率 :结构体指针->结构体成员变量名 //指针访问结构体成员的方式

                       

 struct stu s[3] ={{"tom",100,15},{"jack",90,18},{"jerry",80,20}};



 printf("name = %s\n",s[2].name);
 printf("score = %d\n",s[2].score);
 printf("age = %d\n",s[2].age);
                                                                         
 printf("name = %s\n",(s+2)->name);
 printf("score = %d\n",(s+2)->score);
 printf("age = %d\n",(s+2)->age);

3.结构体变量的引用:

访问数据 不能访问整个结构体 ,必须访问到具体成员 
 s.
       .    结构体成员运算符 //表示访问成员 
结构体变量名.成员变量名 --- 访问到了具体成员 
 s.name 
 s.age 
 s.score

4.结构体大小

内存对齐:
    1.结构体成员的对齐 要在自然边界对齐 
    2.整个结构体以最大的成员对齐
 必须被4整除

例如:只有两个char大小就是4,一个int、一个char就是8

例如这个s1和s2的结构体大小是多少

结果是8,12

二、共用体(联合体)

   多个变量共用同一块内存空间

关键字:

union    //与struct使用方法类似

union demo
{
	int a;
	short b;
	char c;
}; //共用体类型 
//表示 
//a b c 公用了同一块内存空间 

这里只占了4个字节。

注意:


  1.共用体的空间大小 == 等于 最大的成员的大小 
  2.共用体初始化  默认是给到 第一个成员的 --- 按第一个成员的方式进行初始化 
  3.各个成员的起始位置一样 
    根据各个成员的类型大小,拿到的字节数(空间大小)是不一样的
  4.如果对共用体多次赋值 
    每个成员,只能影响到自己对应的空间 
    最终赋值的结果是多次赋值后的综合结果 

  通过union本身特点,实现大小端判断?

 #include <stdio.h>
 
 union demo
 {
     int a;
     char b;
 
 };
 
 int main(void)
 {
     union demo d = {0x12345678};
 
     if(d.a ==0x78)
     {
         printf("小端");
     }else
     {
         printf("大端");
     }
 }                                                   
                                                     
                                                     

用途:

 a.节省空间  

 b.协议 ---- 很多字段,都是用共用体来实现空间的公用 
 c.实现数据转换

定义一个老师和学生的数据类型:

struct stu
	{
	   char name[20];
       int age;

	      int score;
   		  
	};
	
   struct teacher
	{
	   char name[20];
       int age;
       int salary;	   
	};
	
	
	struct member
	{
	   char name[20];
       int age;
       union data
	   {
	      int score;
		  int salary;	   
       }d;		  
	};
	
	struct member s;
	s.name
	s.age
	s.data.score
	
   struct member t;
	t.name
	t.age
	t.data.salary

三、枚举

--- 一枚一枚的列举 

枚举是一个有限集合 ,C语言中,将一组相关的值 集合在一起 形成枚举类型 

语法:
  enum 类型名
  {
	//枚举相关的值 --- 标识符 标识符与标识符之间用,(逗号) 隔开   
  };
  
例如:
  enum weekday
  {
	 MON =1,
	 TUES,
	 WED,
	 THURS,
	 FRI,
	 SAT,
	 SUN
  };

注意:


   1.枚举类型 --在C语言,本质上是用整型来处理的 
     枚举值--标识符,默认从0开始,依次往后 (每个比前一个大1)//可以赋值来改变
   2.枚举类型的变量的取值范围  本质上,只要是整数,都可以接收 
     只是我们在使用时,一般,只是用,定义在枚举类型中的值 
   3.枚举类型的值,也可以指定 

枚举和宏定义的区别: 

    枚举是编译时处理      枚举有类型    枚举把相关的值集合起来 更可读   
    宏定义时预处理阶段    宏定义无类型   宏定义没有这样的效果 

所以枚举可以做类型检查,当类型不匹配时,报警

四、类型定义

typedef 是 C/C++ 语言中的一个关键字,它的全称是 "type definition"(类型定义)。但它实际的作用并不是定义新类型,而是为已有的类型创建别名

typedef  //type define  
         //给已有类型起别名 
         
typedef int a;  //此时给int起了一个别名 --别名就叫a

a  a;//就可以实现这样的定义了

一般是这样使用的,简化结构体声明:

typedef struct stu 
{ 
   char name[10];
   int age;   
}stu_t;



struct stu s; 
stu_t s;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值