结构含义
结构有两层含义:一层含义是“结构布局”,结构布局告诉编译器如何表示数据,未让编译器为数据分配空间。创建一个结构变量,即为另一层含义。
建立结构声明
#include<stdio.h>
struct stuff
{
int number;
char code[4];
float cost;
};
int main(void)
{
struct stuff library; //创建了一个结构变量 library
//编译器使用 stuff 模板为该变量分配空间
//stuff book 相当于声明中的 int 或 float
//可定义多个变量,甚至是指向 struct stuff 类型的指针
return 0;
}
- 一个结构的内存分配
- 就计算机而言,下面的声明
struct stuff library;
//是以下声明的简化,声明结构的过程和定义结构变量的过程组合成一个步骤
struct stuff
{
int number;
char code[4];
float cost;
}library;
初始化结构
struct stuff library = {10,'c',12};
//访问初始化后的中用结构成员运算符"."访问成员
printf("%d", library.number);
结构数组声明
struct book library[100]; //library 是一个数组名,不是结构名,数组中每个元素都是 struct book 类型的结构变量。
- 一个结构数组的内存分配
指向结构的指针
struct stuff* p; //声明并未创建一个新的结构,可以指向任意现有 stuff 类型的结构
p = &math //如果 math 是 stuff 类型,结构名并不是结构地址,因此指向的结构前面要加上“&”
//指针访问成员,以下等价
p->number == (*p).number == math.number
typedef 关键字
利用 typedef 可以为某一类型自定义名称,通常用大写字母表示定义的名称,以提示用户这个类型名实际上是一个符号的缩写。与 #define 类似,但两者有 3 处不同:
- tyoedef 创建的符号只受限于类型,不能用于值。
- typedef 由编译器解释,不是预处理器。
- 受限范围内,typedef 比 #define 更灵活。
typedef unsigned char BYTE; //为现有类型创建一个名称
typedef char* STRING; //把 STRING 解释成类型的标识符,该类型是指向 char 的指针
char* string; //把 STRING 识别为一个指向 char 的指针变量
STRING name,sign; //相当于 char* name,*sign
typedef struct
{
double x;
double y;
}rect;
rect r1 = { 3.0,3.6 }; //被翻译成 struct{double x;double y}r1 = {3.0,3.6};
rect r2; //被翻译成 struct{double x;double y}r2;
r2 = r1; //C 认为两个结构的类型相同,所以赋值是有效操作