在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚合数据类型(aggregate data type)的一类。结构体可以被声明为变量、指针或数组等,用以实现较复杂的数据结构。结构体同时也是一些元素的集合,这些元素称为结构体的成员(member),且这些成员可以为不同的类型,成员一般用名字访问。
一、结构体的声明和定义
在嵌入式系统中,对内存很敏感。所以在使用结构体时要注意“声明结构体类型”和“定义结构体变量”的区别。声明结构体类型只是指定了一个结构体的类型,它相当于一个模型,但其中并无具体数据,系统对之也不分配实际的内存单元。
声明一个结构体类型的一般形式为:
struct 结构体名
{成员列表};
要定义结构变量,则一般形式是:
struct 结构体名 结构体变量名;
在使用结构体时要注意结构体类型名和结构体变量名。构体类型名相当于“int a”里面的int,结构体变量名相当于a。
注意区分下面几个定义:
struct Student{ //声明结构体
char name[20]; //姓名
int num; //学号
float score; //成绩
};
声明一个结构体类型Student,此时未分配内存单元。
struct Student stu1; //定义结构体变量
定义一个结构体变量stu1,此结构体变量的类型为Student,此时为变量stu1分配了内存单元。
truct Student{
char name[20];
int num;
float score;
}stu1; //在定义之后跟变量名
在声明一个结构体类型Student的时候也定义一个结构体变量stu1,此时为变量stu1分配了内存单元。
struct { //没有结构名
char name[20];
int num;
float score;
}stu1;
使用匿名结构体来直接定义了一个结构体变量stu1,此时为变量stu1分配了内存单元。
在结构体的定义中经常使用typedef,typedef struct 是为了使用结构体更方便。
typedef struct
{
int no;
char name[12];
}Student;
此处定义了一个结构体类型,此时未分配内存单元。利用此结构体类型进行定义时不需要带struct,可直接定义。相当于先定义了一个匿名结构体,然后将该匿名结构体类型定义为别名Student。
利用该结构体类型定义结构体变量的方法如下:
Student stu1; //定义结构体变量
还有一种结构体定义方法如下:
typedef struct Student
{
int no;
char name[12];
}my_student;
此处定义了结构体类型,并不分配内存变量。相当于定义了结构体类型Student,然后Student类型又定义为Stu1。利用该结构体类型定义结构体变量的方法可以有两种分别如下:
struct Student stu1; //定义结构体变量
my_student stu2;//定义结构体变量
下面这种定义方法是错误的
typedef struct Student
{
int no;
char name[12];
};
二、结构体指针
当一个指针变量用来指向了一个结构变量,这个指针就成了结构指针变量。结构指针变量中的值是所指向的结构变量的首地址。可以通过指针来访问结构变量。
定义结构指针变量的一般形式:
struct 结构名 * 结构指针变量名
struct Student *pstu; //定义了一个指针变量,它只能指向Student结构体类型的结构体变量
结构指针变量的定义也可以与结构体的定义同时。而且它必须先赋值后使用。数组名表示的是数组的首地址,可以直接赋值给数组指针。但结构变量名只是表示整个结构体变量,不表示结构体变量的首地址,所以不能直接赋值给结构指针变量,而应该使用 & 运算符把结构变量的的地址赋值给结构指针变量。
通过结构指针间接访问成员值,访问的一般形式:
(*结构指针变量). 成员名 或 结构指针变量 -> 成员名
(*pstu).name
pstu->name