设计程序
时,最重要的步骤之一是选择表示数据
的方法。
在许多情况下,简单变量甚至是数组还不够。为此,C提供了结构体变量
提高表示数据
的能力,它能让你创造新的形式。
1、结构体 的定义
struct book { //book:结构体名
char title[40]; //成员
char author[40]; //成员
float price; //成员
};
在结构体声明
中,用一对花括号括起来的是结构体成员
列表,声明定义了结构体
的布局
,其中【book】称为结构名
,title、author、price称为成员
。
右花括号
后面的分号
是声明所必需的,表示结体构
布局定义结束。
下面我们定义结构体变量
:
struct book HarryPotter; //定义结构体变量 HarryPotter
我们可以使用typedef
简化结构体变量
的定义,这里可以省略结构名
【book】:
typedef struct {
char title[40];
char author[40];
float price;
} BookCartoon;
BookCartoon harryPotter; //定义结构体变量 harryPotter
我们操作【结构体变量】:
harryPotter.title = "Harry Potter";
harryPotter.author = "J.K. Rowling";
2、指向结构体 的指针
定义指向结构体
的指针:
BookCartoon * pHarryPotter = &harryPotter; //定义结构体指针 pHarryPotter
pHarryPotter->title = "Harry Potter";
pHarryPotter->author = "J.K. Rowling";
3、向函数 传递结构体的信息
ANSI C
允许把结构体
作为参数
使用。所以程序员可以选择是传递结构体
本身,还是传递指向结构体
的指针
。
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA , &GPIO_InitStructure);
把指针作为参数的优缺点:
(1)优点:执行起来很快,只需要传递一个地址;
(2)缺点:无法保护数据。
被调函数中的某些操作可能会意外影响原来结构中的数据。不过,ANSI C
新增的const 限定符
解决了这个问题。
4、结构体的特性(结构体 赋值)
现在的 C 允许把一个【结构体】赋值给另一个【结构体】,但是数组不能这样做。
5、认识 共用体
共用体
(union
)是一种数据类型,它能在同一个内存空间
中储存不同的数据类型
(不是同时储存)。可以初始化共用体
,共用体
只能储存一个值
,这与结构体
不同。
union person {
int height; //身高
double weight; //体重
};
共用体变量:
union person ZhangSan; //张三
union person Class[40]; //班级
(1)第1个声明创建了一个单独的共用体变量ZhangSan,编译器分配足够的空间以便共用体
变量能储存共用体声明
中占用最大字节
的类型:double类型。double类型占64位,即8字节。
(2)第2个声明创建了一个数组Class,内含40个元素,每个元素都是8字节。