C 结构体与共用体的用法
来源:互联网 发布:火车票软件哪个好 编辑:程序博客网 时间:2024/05/16 10:25
struct(结构体)
C 语言允许用户建立有不同类型数据组成的组合型的数据结构,它成为结构体(structure)。
建立自己的结构体
结构体的声明
struct 结构体名
{成员列表};结构体类型的名字是由一个关键字 struct 和结构体名组合而成的。结构体名是由用户指定,又称“结构体标记”(strcuture)。
各成员都应进行类型声明,即:
类型名 成员名
成员列表也成为域表,每一个成员是结构体中的一个域。成员名命名规则与变量名相同。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
Tips: 习惯于将结构体名、共用体名和枚举名的第 1 个字母用大写表示,以表示和系统提供的类型名相区别。
定义结构体类型变量
- 先声明结构体类型,在定义该类型的变量。
- 1
定义了两个 Student 结构体类型的变量 student1 和 student2。
- 在声明类型的时候同时定义变量
- 1
- 2
- 3
- 4
- 5
一般形式:
- 1
- 2
- 3
- 不指定类型名而直接定义结构体类型变量
一般形式:
- 1
- 2
- 3
说明:(1)、只能对变量赋值、存取或运算,而不能对一个类型赋值、存取或运算。在编译时,对类型不分配空间,只对变量分配空间。(2)、结构体类型中的成员名可以与程序中的变量名相同,但二者不代表同意对象。
结构体变量的初始化和引用
(1)在定义结构体变量时可以对它的成员初始化。初始化列表用花括号括起来,依次赋给结构体变量各成员。
C99 标准允许对某一成员初始化,如:
- 1
“.name” 隐含代表结构体变量 a 中的成员 a.name 。其他未被指定初始化的数值型成员被系统化为 0 ;字符型初始化为 ‘\0’,指针型初始化为 NULL。
(2)结构体变量中的成员值引用方式为:
结构体变量名.成员名
如a.name 表示引用 a 变量的 name 成员值; “.” 是成员运算符,它在所有的运算符中优先级最高。
(3)如果成员本身又是一个结构体类型,则要用若干个成员运算符,一级一级地找到最低一级的成员,只能对最低一级的成员进行赋值或存取以及运算。
- 1
(4)对结构体成员变量可以向普通变量一样进行各种运算。
- 1
(5)同类结构体变量可以相互赋值。
- 1
(6)使用 scanf 函数输入结构体变量时,必须分别输入各成员的值,不能再 scanf 函数中使用结构体变量名一揽子输入全部成员的值。
- 1
注意 student.name 前没有 & 运算符,因为 name 是数组名,本身就代表地址。
Example:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
Run result:
- 1
- 2
- 3
- 4
使用结构体数组
结构体数组与数值型的数组的不同之处在于每个数组元素都是一个结构体类型的数据,都分别包含各个成员项。
定义结构体数组的一般形式:
(1)
- 1
- 2
- 3
(2)先声明一个结构体类型,然后在用此类型定义结构体数组:
结构体类型 数组名[数组长度];
(3)对结构体数组初始化的形式是在定义数组的后面加上:
={初值表列};
Example:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
Run result:
- 1
- 2
- 3
结构体指针
结构体指针就是指向结构体变量的指针,一个结构体变量的起始地址就是这个结构体变量的指针。
指向结构体变量的指针
指向结构体对象的指针变量既可指向结构体变量,也可指向结构体数组中的元素。
Example:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
Run result:
- 1
- 2
- 3
(*p) 表示 p 指向结构体变量, (*p).name 是 p 指向的结构体变量中的成员 score 。注意 *p 两侧的括号不可省略,因为成员运算符 “.” 优先于 “ * ” 运算符。*p.score 等价于 *(p.score) 。
说明: 为了方便和直观,C 语言允许把 (*p).name 用 p->name 来代替, “->” 代表一个箭头,p->name 表示 p 指向的结构体变量中的 name 成员。“->” 称为指向运算符。
指向结构体数组的指针
可以用指针变量指向结构体数组的元素。
Example:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
Run result:
- 1
- 2
- 3
用结构体变量和结构体变量的指针做函数参数
将一个结构体变量的值传递给另一个函数,有三个方法:
1、用结构体变量的成员作参数;(值传递)
2、用结构体变量做实参;(值传递)
3、用指向结构体变来那个的指针作实参,将结构体变量的地址做实参。(址传递)
Example:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
Run result:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
union(共用体)
使几个不同的变量共享同一段内存的结构,称为“共用体”类型的结构。
共用体的定义
定义共用体类型的一般形式为:
- 1
- 2
- 3
Example:
- 1
- 2
- 3
- 4
- 5
也可以将类型声明与变量定义分开:
- 1
- 2
- 3
- 4
- 5
- 6
共用体与结构体的定义形式相似,但其含义不同。
结构体变量所占内存长度是各成员长度之和,每个成员分别占有自己的内存单元。而共用体变量所占的内存长度等于最长的成员长度。
共用体的引用
只有先定义了共用体变量才可以引用它,但应注意,不能引用共用体变量而是变量中的成员。其引用方式与结构体相似,使用成员运算符 “ . ”。如:
- 1
共用体类型数据的特点
(1)同一段内存段可以用来存放几种不同类型的成员,但在每一瞬时只能存放其中的一个成员,而不是同时存放几个。因为在同一瞬时存储单元只能有唯一的内容,即在共用体变量中只能存放一个值。
(2)可以对共用体变量初始化,但初始化表中只能有一个常量。如:
- 1
- 2
(3)共用体变量中起作用的成员是最后一次赋值的成员,在对共用体变量中的一个成员赋值后,原有变量存储单元的值就被取代。
(4)共用体变量的地址和它的各成员地址都是同一地址。如 &a.i, &a.ch, &a.f 都是同一值。
(5)不能对共用体变量名赋值,也不能企图引用变量名来得到一个值。
(6)共用体类型可以出现在结构体类型中,也可以定义共用体数组。
使用情况: 需要对同一段空间安排不同的用途,这时使用共用体类型比较方便。
Example:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
Run result:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
enum(枚举)
如果一个变量只有几种可能的值,则可以定义为枚举类型,所谓“枚举”就是把可能的值一一列举出来,变量的值只限于列举出来的值的范围内。
声明枚举类型用 enum 开头。
enum [枚举名] {枚举元素列表}
- 1
- 2
- 3
说明:
(1)C 编译对枚举类型的枚举元素按常量处理,故称枚举常量。
(2)每一个枚举元素都代表一个整数,C 语言编译按定义的顺序默认他们的值为 0, 1, 2, 3…。也可以人为地指定枚举元素的数值,在定义枚举类型时显示地指定。
如: enum Weekday {sun=7, mon=1, tue, wed, thu, fri, sat}weekday;
指定枚举常量sun 的值为 7 ,mon 为 1, 以后顺序加 1, sat 值为 6。
(3)枚举元素可以用来作判断比较。
Example:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
Run result:
- 1
- 2
- 3
- 4
- 5
- 6
- C 结构体与共用体的用法
- C 结构体与共用体的用法
- C 结构体与共用体的用法
- C语言共用体和与结构体的区别
- C-结构体与共用体
- C语言结构体与共用体
- C语言结构体与共用体
- C语言 结构体与共用体
- 结构体与共用体的妙用
- 结构体与共用体
- 结构体与共用体
- 共用体与结构体
- 结构体与共用体
- 结构体与共用体
- C语言中结构体与共用体(一)
- C语言中结构体与共用体(二)
- C语言中结构体与共用体(三)
- C语言中结构体与共用体(四)
- IOS学习(二十)归档解档
- MySQL的分表和分区介绍
- Netty权威指南学习笔记1
- CSDN-UWP测试博客
- API GATEWAY API 网关
- C 结构体与共用体的用法
- Android 表情面板切换键盘闪烁问题的解决
- 强大的捉包工具Fiddler
- Java递归调用测试小demo
- mysql dba系统学习(1)mysql各版本编译安装
- 一个在线练习编程的网站
- 对基类与派生类对象和指针赋值的小结
- 开发项目eclipse的配置
- Python循环