1、结构体的定义及初始化

通过数据类型来定义一个一个的变量,当需要很多相同类型的变量时有数组。 基本数据类型在使用时很方便,但是利用它们来描述现实世界就显得捉襟见肘。 例如需要保存一个班学生的信息”姓名,年龄,分数”,按照前面的学习需要单独 定义三个数组,一个保存姓名,一个保存年龄,一个保存分数。这样定义对于后面 的维护,修改,删除会带来麻烦。好比你用三个记事本一个记录学生姓名,一个记 录年龄,一个记录分数,如果删除姓名记事本中的第十个学生,而在年龄,分数记 事本中却删除了第十一个,这是很容易发生的。实际中并不会这么做,我们会利用 一个 Excel 表来记录学生的信息,一行就是一个学生的所有信息,修改,添加,删 除都非常清晰。而这就是今天学习的内容-自定义数据类型。

自定义数据类型:根据自己的需要定义新的数据类型。

自定义数据类型包括结构体,位段,共用体和枚举。当然最重要的就是一号选 手-结构体。

例如:定义一个学生结构体,包含姓名和年龄

struct Student //定义学生结构体
{char name[20];//姓名int age; //年龄
}; //类型定义完成

这个类型定义好了之后就和基本类型一样使用,可以用来定义单个变量,数 组,指针或者作为另一个结构体的成员。

结构体变量定义好之后该如何访问它的成员呢?如何输出 stu3 中的信息呢? 结构体变量通过”.”号访问其成员。

输出 stu3 信息的代码如下:

printf("%s,%d\n",stu3.name,stu3.age);//通过.号访问成员

struct Student //定义学生结构体
{char name[20];//姓名int age; //年龄
}; //类型定义完成int main()
{struct Student stu1;struct Student stu2 = {"caocao"};struct Student stu3 = {"刘备",25};printf("%s,%d\n",stu3.name,stu3.age);//通过.号访问成员//修改成员的数据strcpy(stu1.name,"孙权"); //字符串复制需要用 strcpystu1.age = 18; //通过.号访问成员printf("%s,%d\n",stu1.name,stu1.age);//通过.号访问成员strcpy(stu2.name,"曹操"); //通过.号访问成员stu2.age = 24; //通过.号访问成员printf("%s,%d\n",stu2.name,stu2.age);return 0;
}


2、结构体指针定义及使用

结构体指针定义

结构体不仅能定义普通的变量,也可以定义指针,例如:

struct Student //定义学生结构体
{char name[20];//姓名int age; //年龄
};int main()
{int a = 10;int *p = &a;struct Student stu = {"曹操",23};struct Student *ps = &stu;//类似 pstruct Student *ps2; //没有初始化,野指针return 0;
}

结构体指针变量和整型指针变量类似,用于保存同类型变量的地址

结构体指针访问其成员 结构体指针 ps 如何访问结构体的成员呢?一个笨办法就是(*ps).age 这种形 式。注意一定要加”()”,因为”*”的优先级低于”.”,这个办法不仅容易出错, 写起来也繁琐,C 语言有一种更简洁的表达形式。

结构体指针通过”->”访问其成员。

例如下面代码。

int main()
{int a = 10;int *p = &a;struct Student stu = {"曹操",23};struct Student *ps = &stu; //类似 pstruct Student *ps2; printf("%s,%d\n",(*ps).name,(*ps).age);//这个方法繁琐,易错printf("%s,%d\n",ps->name,ps->age); //结构体指针访问其成员ps2 = &stu;ps2->age = 30; //通过 ps2 修改 stu 的年龄printf("%s,%d\n",ps2->name,ps2->age);return 0;
}

总结:结构体变量通过”.”访问其成员,结构体指针通过”->”访问其成员。


3、结构体数组定义及使用 结构体数组定义 结构体定义完成后和内置类型一样使用,能定义变量,指针当然也可以定义数组。

struct Student
{char name[20];int age;
};int main()
{//内置类型,定义变量,指针和数组int a = 10;int *p = &a;int arr[10] = {1,2,3};//结构体类型,定义变量,指针和数组struct Student stu = {"曹操",23};struct Student *pstu = &stu;struct Student brr[3];struct Student crr[3] = {{"曹操",23},{"刘备",25},{"孙权",18}};struct Student drr[3] = {"曹操",23,"刘备",25,"孙权",18};struct Student err[] = {"曹操",23,"刘备",25,"孙权",18};return 0;
}


5、typedef 的使用

在 C 语言中使用结构体时必须加上 struct 这个关键字,那有没有办法省略这 个呢?要想达到这个目的就需要用到关键字 typedef,顾名思义”类型定义”。

typedef 数据类型 新的别名;

它是用来操作数据类型。其主要作用有两个:

1.给一个较长较复杂的类型取一个简单的别名。

2.给类型取一个和问题相关的别名。

如何在使用结构体时省略 struct 这个关键字呢?可以 按照如下方法定义结构体。例如:

//第一个方式
struct A
{int a;char b;
};
typedef struct A A;//给 struct A 起个别名叫 A//第二种方式
typedef struct B
{char a;int b;
}B; //给 struct B 起个别名叫 Bint main()
{A aa = {10,'x'}; //直接使用 AB bb = {'y',20}; //直接使用 Breturn 0;
}

6、共用体,位段和枚举

共用体

共用体也称为联合体,使用关键字 union,它的所有成员共用同一段内存。例如:

typedef struct A
{int a;int b;
}A;typedef union B
{int a;int b;
}B;int main()
{A aa = {10,20};//B bb = {10,20};//错误,B 中所有成员共用同一段内存,不能同时赋值B bb;bb.a = 10;bb.b = 20;printf("%d,%d\n",aa.a,aa.b);printf("%d,%d\n",bb.a,bb.b);return 0;
}

注意在上图中 bb.a = 10,但是在输出结果时却是 20,为什么会这样呢?见下 面的内存图:

原因还是因为共用体所有成员共用同一段内存,如上图在联合体 union B 中 a 和 b 的内存相同。第 19 行代码 bb.b = 20 时会将前面 bb.a 的值也修改成 20。

总而言之使用联合体的准则是:联合体定义的一个变量一定只使用其中的一 个成员。


位段

位段和结构体非常的类似,它成员表示一个或者多个位。由于不同平台,它的 定义有差异(C 标准没有详细定义),所以它不可移植,使用起来不如位运算方便, 在这不做过多介绍,大家只需要认识并知道它的大小即可。

struct A
{int a;int b;
};struct B //定义位段
{int a:10;//表示 a 占用 10 个位int b:20;//表示 b 占用 20 个位
};int main()
{printf("sizeof(struct A)=%d\n",sizeof(struct A));printf("sizeof(struct B)=%d\n",sizeof(struct B));return 0;
}

位段的大小一定是 sizeof(int)的倍数,上例中位段 B 为 10+20 共 30 位,最 小为 4 字节(32 位)。


枚举

枚举:使用关键字 enum,把可能的值全部列举出来,变量的取值只能在列举 的值范围内。 例如枚举星期类型:

enum Weekday{sun,mon,tue,wed,thu,fri,sat};int main()
{enum Weekday day1; //定义变量,未初始化enum Weekday day2 = sun; //初始化为星期天enum Weekday day3 = mon; //初始化为星期一return 0;
}

C语言 自定义数据类型(结构体 typedef 共用体 位段 枚举)相关推荐

  1. C语言集锦 | 03 - C语言的复合数据类型(typedef关键字、结构体、枚举体、共用体)

    文档版本 更新时间 更新内容 v1.0 2020-09-14 初稿完成 文章目录 一.typedef关键词 二.结构体(重点) 1. 为什么需要结构体 2. 什么是结构体 3. 如何定义结构体 4. ...

  2. C语言之结构体和共用体

    C语言之结构体和共用体 算上这篇笔记加上之前的四篇笔记,C语言基础我们也就告一段落了,对于刚刚接触c语言的童鞋们来说,这些以及足够了,稍后我会发布数据结构,对于想要深入学习的童鞋可以继续关注.本人也算 ...

  3. C语言入门系列之10.结构体和共用体

    文章目录 一.结构体变量的基本使用 1.概述 2.定义结构体类型变量的方法 3.结构体变量的引用 4.结构体变量的初始化 二.结构体的高级应用 1.结构体数组 Ⅰ定义结构体数组 Ⅱ结构体数组的初始化 ...

  4. C语言-结构体与共用体

    int 4字节:char 1字节:short 2字节:float 4字节: 1字节bytes=8位bits(2^8): struct date {int month;int day;int year; ...

  5. 结构体与共用体07 - 零基础入门学习C语言59

    第十章:结构体与共用体07 让编程改变世界 Change the world by program 用typedef定义类型 用typedef声明新的类型名来代替已有的类型名   声明INTEGER为 ...

  6. 【C语言】结构体、共用体、位域

    结构体 1. 结构体的声明方法 struct struct_name {data_type member1;data_type member2;.. }; 这是其中一种声明方式~ 2.定义一个结构体变 ...

  7. 结构体与共用体C语言

    结构体与共用体 结构体的定义 引例 比如学生是一个整体,学生有姓名.性别.学号--我们更希望把一个事物整体的操作 自定义数据类型 基础数据类型是电脑定义好了的,默认的数据类型 自定义数据类型意义:需要 ...

  8. 重温C语言十四-----结构体与共用体

    文章目录 结构体和共用体 1.基本介绍 -1,需求: 2.走向结构体 -1.结构体关系图 -2,面向对象的方式(struct)解决养猫的问题 -3.结构体和结构体变量的区别与联系 -4,结构体在内存中 ...

  9. c语言指针变量输出不了共用体,瘋子C语言札记(结构体/共用体/枚举篇)

    瘋子C语言笔记(结构体/共用体/枚举篇) (一)结构体类型 1.简介: 例: struct date { int month; int day; int year; }; struct student ...

  10. C语言——结构体、共用体

    结构体.共用体 1.结构体 基础知识 代码基本写法 内存对齐 2. 共用体 引论 定义 基础写法 共用体大小 1.结构体 基础知识 类似于Java中的javaBean,可以将一些变量封装成一些对象.同 ...

最新文章

  1. hdu1576 mod 运算的逆元
  2. jsp+urlrewrite实现html分页简单粗暴实现
  3. python获取控制台输出_Python | 用Python获取Windows控制台输出
  4. OpenFire源码学习之二十一:openfie对用户的优化(上)
  5. 双目视觉几何框架详解(玉米专栏8篇汇总)
  6. [置顶] Z-STACK之OSAL_Nv非易失性存储解读上
  7. pytorch Embedding模块,自动为文本加载预训练的embedding
  8. 网络安装Citrix XenServer
  9. 还原数据库SQL语句
  10. 工控自动化通讯测试工具总结之--串口
  11. 今天结束了ie被劫持的生活
  12. Fite-C02-1班成员学习进度记录
  13. 明日之后说正在连接服务器,手游明日之后一直正在连接服务器
  14. arch firefox
  15. iPhone尺寸规格
  16. 搜索网络中的计算机名,怎样搜索一个局域网里全部机器的名字和IP地址
  17. 第七讲:1.物联网敲击桌面打开小台灯
  18. 腾讯企业邮箱通过Python自动发送邮件
  19. 黑马视频学习笔记-for循环
  20. 基于matlab的汽车牌照识别研究

热门文章

  1. 人民币的符号的正确表示法?一杠?两杠?¥还是¥呢?
  2. 初识XUL用户界面UI开发
  3. YOLO系列模型,yolov3-yolov7全方位对比实验参照,包括参数量Params,计算量GFLOPs,复杂度,mAP以及FPS等参照
  4. WPS中用mathtype插入公式的方法
  5. 群晖虚拟机VMM定时开启
  6. 【A阶段A+2】-vinc- =-vict- 胜,征服,扩展的单词学会了?
  7. matlab中的kron函数
  8. PC机并口、并口扩展卡使用EPP模式通信,ECP SPP等
  9. 计算两点间距离C++
  10. 思岚rplidar A1激光点云数据读取