定义的方法:
方法一:
struct 结构体类型名称
{
数据类型 成员名1;
数据类型 成员名2;
......
}; 这里的分号一定不能少了。
方法二:
struct 结构体类型名称
{
数据类型 成员名1;
数据类型 成员名2;
.......
} 结构体变量名1,结构体变量名2 ; --------->这里的结构体变量名可以对结构体中的成员变量初始化,如
struct STU
{
数据类型 成员名1;
数据类型 成员名2;
......
}stu={成员1的值,成员2的值,.....};分号不能少
也可以是一个数组 stu[3] = {{成员1的值,成员2的值,......},
{成员1的值,成员2的值,.....}
{成员1的值,成员2的值,.......}};这里分号不能少了
也可以是一个指针 *stu; 但是不能直接给初值,只能在在函数里赋值。
也可以直接给一个结构体变量名但是不赋初值,到使用时才赋初值。
也可以在函数里定义一个结构体变量 struct 结构体类型名 结构体变量名;(结构体变 量 名可以是以上的任何一种形式)
对结构体成员的访问方法:
结构体变量名.成员名1;
结构体变量名.成员名2; 如stu.成员名1;
如果变量名是数组的话:
结构数组名[下标].成员名1; 如 stu[0].成员名1;
如果变量名是指针的话: 这里值得注意的是 结构体指针变量指向的是结构体的首地址
(*结构体指针变量).成员名;或者
结构体指针变量 -> 成员名; 如 (*stu).成员名1;或 stu ->成员名1;
结构体定义的位置:
结构体可以定义在函数之外。当工程量小的时候可以直接定义在同一个文件,但是在函数的前面;当工程量大的时候可以另外建立一个新的 .h 文件来存放结构体,以后其它的 .c 文件需要的时候可以在头文件引用时引用结构体所在的头文件。
如 struct { }; #include <XXX.h> 结构体所在的 .h 文件名
int main() main()
{ {
这里函数内就可以对结构体的成员进行访问了
} }
结构体也可以定义在函数内,如 int main()
{
struct { };
return 0 ;
}
结构体和共用体的区别:
共用体的定义:允许集中不同类型的变量存放到同一段内存单元中,也就是使用覆盖技术,几个变量互相覆盖。这种几个不同的变量共同占用一段内存的结构,被称为共用体类型结构,简称公用体。
定义的形式和结构体定义基本类似:
union 公用体名
{
数据类型 成员名1;
数据类型 成员名2;
.......
}变量名;
共用体具有的特点:
1. 在同一个内存段可以存放有几种不同类型的成员,但是每一瞬间只能有一个成员起作用,其它成员不起作用,即不是同时都存在和起作用的。就是说每次要调用共用体的成员都只能使用其中一个,使用完之后才能使用另外一个。(结构体中可以同时使用不同的成员变量)
2. 公用体变量默认起作用的成员是最后一次存放的成员,在存入新的成员后,原有成员就失去了作用。(结构体中每个成员都起作用)
3.公用体变量的地址和它个成员的地址都是同一个地址。这和定义相关,因为是集中不同类型的变量存放到同一段内存单元中。公用体的长度等于最长的成员长度。(结构体每个成员都有自己的内存空间,可以同时起作用,一个struct的总长度等于所有成员长度之和)
4.不能对公用体变量名赋值,也不能企图引用变量名来得到一个值 (这点和结构体类似),并且,不能再定义公用体变量时对它进行初始化 (结构体是可以在定义结构体变量是进行初始化的)。
5.不能把公用体变量作为函数参数(结构体变量可以做函数的参数),也不能使函数返回公用体变量(结构体可以使用),但是可以使用指向公用体变量的指针(结构体可以使用指向结构体变量的指针)。
6.公用体类型可以出现在结构体类型的定义中,也可以定义公用体数组。反之,结构体也可以出现在公用体类型的定义中,数组也可以作为公用体的成员。