数据

本文深入解析C语言中的结构体和共用体,包括定义、操作、初始化及在函数中的应用。结构体允许组合不同类型的变量,而共用体则让多个成员共享同一存储空间,有效节省内存。

结构体(Structure)

又叫聚合体(Aggregate)

是统一在一个名字下的一组相关变量的集合,属于派生数据类型(Derived data type)

特点:可以包含不同数据类型的变量——与数组相反

定义

格式:struct 结构体标记(Structure tag)

{成员} ;

结构体标记:对结构体定义进行命名——可以省略

结构体类型:struct 结构体标记

成员(Member):同一个结构体类型中的成员必须有不同的名字,但两个不同的结构体中的成员可以有相同的名字

引用:一个结构体不能包含它自身类型的实例,但指向同一个结构体的指针可以出现在定义中——自引用结构体(Self-referential structure)

定义不占用内存

声明

  1. struct 结构体标记

{成员} (变量名);

  1. struct 结构体标记
    变量名;

操作

将结构体变量赋值给其他具有相同类型的结构体变量

用运算符&取得结构体变量的地址

访问一个结构体变量的成员

用运算符sizeof确定结构体变量的大小

提醒:不能用==或!=比较两个结构体——保安未定义数据的字节单元,只能对单个成员进行比较

提醒:

为满足边界对齐的要求,变量大小不等于其成员变量大小之和——用sizeof确定一个结构体变量所占用的内存字节数

在一个结构体变量中,未定义的字节单元可能包含于安全有关的,上次使用这些单元遗留下的数据——应禁止访问

初始化

采用初始值列表—不同的初始值用“,”隔开——若列表中初始值的个数少于结构体成员的个数,则剩余的没有初始值与之对应的成员被自动初始化为0(指针为NULL)

通过赋值语句

对结构体变量的成员分别赋值

访问

结构体成员运算符(Structure member operater),也叫圆点运算符(Dot operater)

结构体指针运算符(Struture pointer operater)(->)——等价于(*变量名).成员名

注意:.和->的两边不要加上空格

在函数中的应用

作为形参传递的方式

传递结构体的个别成员

传递整个结构体

传递一个指向结构体的指针

传递

结构体或其成员按值传递

按引用传递,实际传递结构体变量的地址——效率更高——结构体数组自动按引用传递

通过使用结构体,可以按值传递一个数组——先创建一个以该数组为成员的的结构体,再按传值的方式传递结构体

共用体(Union)

一种派生数据类型

特点:所有成员共享一个存储空间——避免了当前不再使用的变量仍占用内存的浪费

  任意数据类型——每次只允许访问一个成员

声明: union 共用体名

  {成员名};

操作 1.两个具有相同类型的共用体之间的赋值

 2.用&运算符取得一个共用体变量的地址

 3.用结构体成员运算符或结构体指针运算符访问共用体成员

提醒:不能用==或!=比较两个共用体

初始化:只能对其成员赋值

位运算符

用于处理有符号或无符号的整形操作数的各个数位

特点:依赖于机器

类型

& 按位与 仅当两个操作数相应的二进制数位都为1时,结果相应的二进制数位为1

| 按位或
若两个操作数相应的二进制数位至少有一个为1,结果相应的二进制数位为1

^ 按位异或 仅当两个操作数相应的二进制数位只有一个为1,结果相应的二进制数位为1

<< 左移 将第一个操作数按位向左移,移动的位数由第二个操作数决定。右边腾出的数位补0

右移 将第一个操作数按位向右移,移动的位数由第二个操作数决定。左边腾出的数位填补方式取决于机器

~ 按位取反 将操作数中所有为0的数位置成1,1的数位置成0

&要与一个掩码(Mask)一起使用——某些特定位被置成1的一个整数——在选取某些数位的同时将其他数位隐藏

提醒:

对int 整数进行某些位操作与系统实现相关,只能对无符号数进行微操作

对一个比int小的整型数据进行按位操作,会出现意想不到的结果

位域(Bit field)

定义:当结构体或共用体中包含无符号整数(unsigned)或有符号整型(int)成员,C允许用户指定这些成员所占用的存储位数

声明:在unsigned和int的成员名字后面加一个:和一个整数——位域的宽度(这个成员将占用的存储位数)

特点:1.有助于减少程序所需的存储空间

  2.依赖于机器

无名位域(Unnamed bit field),作为结构体中的补位(Padding)

宽度为0的无名位域(unnamed bit field with a zero width)使下一个位域对齐在一个新的存储单元的边界

枚举常量(Enumeration
constant)

关键字:enum

特点:1.除非专门定义,枚举类型中的枚举值都是从0开始且依次递增1

  2.一个枚举类型中出现的标识符必须互不相同

  3.一个枚举类型中的多个成员可以拥有相同的常量值——允许多个枚举常量具有相同的值,会导致很难发现的逻辑错误

Typedef

为已定义的数据类型创建同义词

将定义的类型名的第一个字母大写,强调它们是其他类型名的同义词

优点:

更简短

可提供程序的可移植性

提供程序的可读性和可维护性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值