结构体,共用体以及typedef的总结
来源:互联网 发布:ps4星际战甲网络未 编辑:程序博客网 时间:2024/05/03 16:38
1.结构体:
前面的教程中我们讲解了数组,它是一组具有相同类型的数据的集合。但在实际的编程过程中,我们往往还需要一组类型不同的数据,例如对于学生信息登记表,姓名为字符串,学号为整数,年龄为整数,所在的学习小组为字符,成绩为小数,因为数据类型不同,显然不能用一个数组来存放。
在C语言中,可以使用结构体来存放一组不同类型的数据。结构体的定义形式为:
struct 结构体名{
结构体所包含的变量或数组
};
结构体是一种集合,它里面包含了多个变量或数组,它们的类型可以相同,也可以不同,每个这样的变量或数组都称为结构体的成员(Member)。请看下面的一个例子:
struct stu{ char *name; //姓名 int num; //学号 int age; //年龄 char group; //所在学习小组 float score; //成绩};
stu 为结构体名,它包含了 5 个成员,分别是 name、num、age、group、score。结构体成员的定义方式与变量和数组的定义方式相同,只是不能初始化。注意大括号后面的分号
;
不能少,这是一条完整的语句。结构体也是一种数据类型,它由程序员自己定义,可以包含多个其他类型的数据。
像 int、float、char 等是由C语言本身提供的数据类型,不能再进行分拆,我们称之为基本数据类型;而结构体可以包含多个基本类型的数据,也可以包含其他的结构体,我们将它称为复杂数据类型或构造数据类型。
2.结构体变量
既然结构体是一种数据类型,那么就可以用它来定义变量。例如:
struct stu stu1, stu2;定义了两个变量 stu1 和 stu2,它们都是 stu 类型,都由 5 个成员组成。注意关键字
struct
不能少。stu 就像一个“模板”,定义出来的变量都具有相同的性质。也可以将结构体比作“图纸”,将结构体变量比作“零件”,根据同一张图纸生产出来的零件的特性都是一样的。
你也可以在定义结构体的同时定义结构体变量:
struct stu{ char *name; //姓名 int num; //学号 int age; //年龄 char group; //所在学习小组 float score; //成绩} stu1, stu2; //这里定义变量时不要赋值如果只需要 stu1、stu2 两个变量,后面不需要再使用结构体名定义其他变量,那么在定义时也可以不给出结构体名,如下所示:
struct{ //没有写 stu char *name; //姓名 int num; //学号 int age; //年龄 char group; //所在学习小组 float score; //成绩} stu1, stu2;3.成员的获取与赋值
结构体和数组类似,也是一组数据的集合,整体使用没有太大的意义。数组使用下标[ ]
获取单个元素,结构体使用点号.
获取单个成员。获取结构体成员的一般格式为:
结构体变量名.成员名;
通过这种方式可以获取成员的值,也可以给成员赋值:#include <stdio.h>void main(){ struct{ char *name; //姓名 int num; //学号 int age; //年龄 char group; //所在小组 float score; //成绩 } stu1; //给结构体成员赋值 stu1.name = "Tom"; stu1.num = 12; stu1.age = 18; stu1.group = 'A'; stu1.score = 136.5; //读取结构体成员的值 printf("%s,%d,%d,%c,%f\n", stu1.name, stu1.num, stu1.age, stu1.group, stu1.score);}
除了可以对成员进行逐一赋值,也可以在定义时整体赋值,例如:
<span style="font-size:14px;">struct{ char *name; //姓名 int num; //学号 int age; //年龄 char group; //所在小组 float score; //成绩} stu1, stu2 = { "Tom", 12, 18, 'A', 136.5 };</span>
不过整体赋值仅限于定义结构体变量的时候,在使用过程中只能对成员逐一赋值,这和数组的赋值非常类似。
需要注意的是,结构体是一种自定义的数据类型,是创建变量的模板,不占用内存空间;结构体变量才包含了实实在在的数据,需要内存空间来存储。
4.共用体
通过前面的讲解,我们知道结构体是一种构造类型或复杂类型,它可以包含多个类型不同的成员。在C语言中,还有另外一种和结构体非常类似的语法,叫做共用体,它的定义格式为:
union 共用体名{
成员列表
};
共用体有时也被称为联合或者联合体,这也是 Union 这个单词的本意。结构体和共用体的区别在于:结构体的各个成员会占用不同的内存,互相之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。
结构体占用的内存大于等于所有成员占用的内存的总和(成员之间可能会存在缝隙),共用体占用的内存等于最长的成员占用的内存。共用体使用了内存覆盖技术,同一时刻只能保存一个成员的值,如果对新的成员赋值,就会把原来成员的值覆盖掉。
其他使用方式与结构体差不太多。
多重嵌套时采用结构变量名.结构变量名.成员变量名去访问。
5.typedef
定义格式:typedef oldName newName;
就是用新的名称代替旧的名称,一般替换已知的类型,还可以用于替换数组和指针。
它与#define的区别:
1.执行时间不同:关键字typedef在编译阶段有效,由于是在编译阶段,因此typedef有类型检查的功能。#define则是宏定义,发生在预处理阶段,也就是编译之前,它只进行简单而机械的字符串替换,而不进行任何检查。
2.功能不同:Typedef用来定义类型的别名,这些类型不只包含内部类型(int,char等),还包括自定义类型(如struct),可以起到使类型易于记忆的功能。#define不只是可以为类型取别名,还可以定义常量、变量、编译开关等。
3.作用域不同:#define没有作用域的限制,只要是之前预定义过的宏,在以后的程序中都可以使用。而typedef有自己的作用域。
4.对指针的操作不同:#define修饰指针能修改,指向的内容不能修改,typedef刚好相反。
- 结构体,共用体以及typedef的总结
- 结构体,共用体,typedef与define的区别,链表
- 结构体,共用体,枚举体,typedef
- typedef,结构体,共用体,联合体
- 结构体、共用体、枚举和typedef
- C语言结构、共用体、Typedef
- 共用体,枚举,typedef
- 结构体的定义、初始化以及typedef
- 结构体的定义和使用,以及typedef的使用。
- c/c++结构体定义以及结合typedef的应用
- typedef 的理解 typedef struct 结构体
- typedef 的理解 typedef struct 结构体
- 结构体&&共用体
- 结构体,共用体
- 结构体、共用体
- 结构体、共用体
- 结构体&共用体
- struct 结构体以及 typedef struct
- 文件路径和Uri
- dp LCS poj 1458 Commom Subsequence
- SASS用法介绍
- bzoj 2669: [cqoi2012]局部极小值
- iOS应用支持IPV6,就那点事儿
- 结构体,共用体以及typedef的总结
- C++学习笔记--关联容器
- android 开发随手记
- hdu 2571 命运
- 欢迎使用CSDN-markdown编辑器
- 第一章 vagrant简介--Installing VirtualBox(7)
- 横竖屏切换【Android】
- HDU Problem 3466 Proud Merchants【01背包】
- ORA-12537: TNS:connection closed