C 数组允许定义可存储相同类型数据项的变量,
结构
是 C 编程中另外一种自定义的可用的数据类型,它允许您存储不同类型的数据项;由基本数据类型构成的、并用一个标识符来命名的各种变量的组合。
结构说明和结构变量定义
在 C 编程中,结构也是一种数据类型,可以使用数据变量,因此,像其他数据类型的变量一样,在使用结构变量以前要先对其定义。
定义结构变量的一般格式为:
- 结构名是结构的标识符而不是变量名。
- 类型为C编程里面的五种常见数据类型(整型、浮点型、字符型、指针型 和 无值型)
构成结构的每一个类型变量称为结构成员,它像数组的元素一样,但是区别是数组是根据成员下标进行访问,而结构是按照变量名字来访问成员的。
下面举个栗子来说明怎样定义结构变量:
这个栗子定义了一个结构名为 string 的结构变量 persion,如果省略变量名 persion,则变成对结构的说明。用已说明的结构名也可定义结构变量。这样定义时上面就变成:
如果需要定义多个具有相同形式的结构变量时用这种方法比较方便,它先作结构说明,再用结构名来定义变量。
例如:struct string Wettper, Leidy, Geita;
如果省略结构名,则称之为无名结构,这种情况常常出现在函数内部,用这种结构时前面的例子就变成了:
结构变量的使用
结构是一个新的数据类型,因此结构变量也可以像其他类型的变量一样进行赋值、调用、运算,不同的是结构以成员作为基本变量。
结构成员的表达方式为:结构变量.成员名
如果将 “结构变量.成员名” 看作一个整体,则这个整体的数据类型与结构中该成员的数据类型相同,这样就可以像前面说的变量那样使用了。
举个栗子:
结构数组 和 结构指针
结构是一种新的数据类型,同样拥有 结构数组
和 结构指针
。
结构数组
结构数组就是具有相同结构类型的集合。假如要定义一个班级40个同学的姓名、性别、年龄和住址,可以定义为一个结构数组,如下所示:
也可以定义为:
需要指出的是结构数组成员的访问是以数组元素为结构变量的,其形式为:结构数组元素.成员名
,例如:
实际上结构数组相当于一个二维构造,第一维是结构数组元素,每个元素是一个结构变量,第二维是结构成员。注意~敲黑板了
:结构数组的成员也可以是数组变量。例如:
为了访问结构 string 中结构变量 library[2] 的这个变量,可以写成:
结构指针
结构指针 是 指向结构的指针,它由加在结构变量名前的 * 操作符来定义,例如前面已经说明的结构定义一个结构指针如下:
也可以省略结构指针名只作结构说明,然后用如下语句定义结构指针:
使用结构指针访问结构成员,跟结构变量访问成员的表达式上有所不同,结构指针访问成员的表达方式为:结构指针名->结构成员
,类似其他高级语言的对象获取方法,而结构成员的赋值方式可以使用如下:
实际上 students->name
就是 (*students).name
的缩写形式。
需要指出的是结构指针是指向结构的指针 ,即结构中第一个成员的首地址,因此使用之前应该对此结构指针进行初始化,即分配整个结构长度的地址空间(字节),这个可以用如下函数完成:
malloc
函数:定义了一个大小为结构长度的内存区域,然后将其地址作为结构指针返回。
注意~敲黑板了
:
- 结构作为一种数据类型, 因此定义的结构变量或结构指针变量同样有局
部变量和全程变量, 视定义的位置而定 - 结构变量名不是指向该结构的地址, 这与数组名的含义不同, 因此若需
要求结构中第一个成员的首地址应该是&[结构变量名]
结构的复杂形式
嵌套结构
嵌套结构是指结构成员中可以包含其他一个结构。例如,下面就是一个嵌套结构:
如果要给 students 结构中成员 address 结构中的 zipcode 赋值,可写成:
每一个结构成员名从最外层到最内层逐个被列出,即嵌套式结构成员的表达式是:结构变量名.嵌套结构变量名.结构成员名
位域(位段)
有些信息在存储时,并不需要占用一个完整的字节,而只需占几个或一个二进制位。例如在存放一个开关量时,只有 0 和 1 两种状态,用 1 位二进位即可。为了节省存储空间,并使处理简便,C 语言又提供了一种数据结构,称为”位域”或”位段”。
所谓”位域”是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位域来表示。
典型的实例:
- 用 1 位二进位存放一个开关量时,只有 0 和 1 两种状态。
- 读取外部文件格式——可以读取非标准的文件格式。例如:9 位的整数。
位域定义的一般形式为:
其中,数据类型必须是int(unsigned或者signed)。整型常量必须为非负的整数,方位是 0 ~ 15,表示二进制的个数,即表示多少位。变量名是个可选项,可以不命名。让我们再来举个栗子:
这里 packed_struct 包含 6 个成员:四个 1 位的标识符 f1…f4,一个 4 位的 type 和 一个 9 位的 my_int,访问上方位域的 type 成员可以使用 pack.type
。
注意~再次敲黑板了
:
- 位域中的成员可以定义为 usigned 或者 signed ,但当成员长度为 1 时,会被认定为 usigned 类型,因为单个位不会有符号
- 位域中的成员不可以使用 数组 或者 指针,当时位域变量可以是数组或者指针,访问方式等同 普通结构
- 位域总长度(位数),为各个位成员定义的位数之和,可以超过两个字节
- 位结构成员可以同其他结构成员一起用,例如:12345678struct info{char name[8];int age;struct adr address;unsigned state:1;unsigned pay:1;} workers;
参考资料
: 位域的详细信息可以参照 runoob 的详细教程说明 位域部分 关于位域的说明。
本文作者: wettper
本文链接: http://www.web-lovers.com/c-structures.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!