C语言知识补充之结构体和共用体
结构体和共用体
一个事物往往都有多个方面的属性,比如学生就有名字、升高、各科成绩等等。用来描述此类数据的数据类型----结构体和共用体
一、结构体
1. 结构体类型
结构体类型是一种数据类型,和整型、字符型、浮点型等一样。我们之所以可以用关键字int、char来定义变量,是因为C编译系统事先定义好了。但是C编译系统没有事先定义结构体类型,所以我们要先定义结构体类型才可以用。定义形式如下:
struct 结构体类型名 { 数据类型1 成员名1; 数据类型2 成员名2; ...... 数据类型n 成员名n; };
其中,数据类型可以任意,且可以嵌套定义结构体变量,嵌套又可以嵌套自己。如:
struct date { int year; int month; int day; }; struct student { char name[10]; char sex; struct date birthday; int age; float score; };
注意,如果结构体类型的定义在函数体内部,那么这个函数名的作用域仅为该函数;如果在函数外部,则可以在整个程序中使用。结构体类型的定义只是由用户构造了一个结构体,但定义结构体类型时候系统并不为其分配存储空间。
2. 结构体变量
先定义结构体类型,然后定义结构体变量,此时系统才会给结构体变量分配存储空间,此时结构体变量的存储空间等于成员所有存储空间之和,结构体变量的首地址就是首个成员的地址。结构体变量定义有三种格式:
- Struct 结构体类型名
{
数据类型n 成员名;
…………
};
Struct 结构体类型名 结构体变量1,结构体变量2,……;
- Struct 结构体类型名
{
数据类型n 成员名;
…………
}结构体变量1,结构体变量2,……;
- 第三种就是没有结构体类型名的,这样使用typedef打字更方便。
3. 结构体变量的初始化
类似于数组元素的初始化,例:
struct student { char Name[20]; float Math; float English; float Physical; }stu[2]={{"zhang",78,89,95},{"wang",87,79,92}};
4. 结构体变量的引用
- 对结构体变量成员的引用:结构体变量名.成员名
这是一个整体,就相当于一个变量了。
- 对结构体变量本身的引用:赋值运算
只有两个变量是相同结构体类型才可以,成员之间一一对应赋值。
5. 结构体变量为数组的情况:略
6. 结构体变量为指针的情况
- 定义:struct 结构体名 *指针变量名;
- 初始化:结构体指针变量在使用之前必须进行初始化,其初始化的方式与基本数据类型指针变量的初始化相同,就是stu的首地址。如下:
struct student { char name[10]; char sex; struct date birthday; int age; float score; }stu,*p=&stu;
- 引用结构体指针变量:只讨论一种,如:stu->sex, stu->age;
- 当该指针指向的是结构体数组时:
struct ucode { char u1; int u2; }tt[4],*p=tt;
p指向的是tt[0]的首地址
7. 结构体与函数
- 函数本身可以是结构体类型的,此时返回的值也必须是结构体类型的。
- 函数的形参与实参传递之间可以是结构体变量,也可以是结构体指针变量。
- 要想使函数有多个返回值,除了可以使用全局变量或者指针来解决,还可以是结构体类型返回值
二、共用体(联合体)
由于这个时代的内存容量暴涨,目的是节约内存而存在的共用体技术已经显得不太重要了,所以,联合体目前实际上使用的并不多。(可能在单片机运用中得注意)

浙公网安备 33010602011771号