结构体与共用体小结
一,结构体的概念和定义
1,结构体的定义
struct 结构体名
{
数据类型 成员名1;
数据类型 成员名1;
...
};
这里数据类型可以是复合类型,例如又是一个结构体类型,即嵌套;
2,结构体变量的定义
struct 结构体名 变量名1,变量名2,,,变量名n;
或:
struct 结构体名
{
数据类型 成员名1;
数据类型 成员名1;
...
}结构体变量1,结构体变量2;
或:
struct
{
数据类型 成员名1;
数据类型 成员名1;
...
}结构体变量1,结构体变量2;
三种方式,第三种方式的话,每次要定义这个类型的结构体变量都要重复的写这
一段代码;
其实定义了结构体后,struct 结构体名就是一种新的类型,上述语句就像声明
变量一样;
3,结构体变量的引用
只能对结构体变量中的各个成员分别输出,不能对一个结构体变量作为一个整体
输出;
嵌套的结构体类型的引用:
结构体变量名.结构体类型成员名.内嵌结构体的成员名;
4,结构体变量的初始化
struct 结构体名 变量名 = {初始化数据};
或者在定义的时候就初始化:
struct 结构体名
{
数据类型 成员名1;
数据类型 成员名1;
...
}变量名 = {初始化数据};
二,结构体数组
1,结构体数组的定义举例
struct stu
{
int stu_nu;
char name[20];
float score;
};
struct stu student[5];
或者:
struct stu
{
int stu_nu;
char name[20];
float score;
}student[5];
或者:
struct
{
int stu_nu;
char name[20];
float score;
}student[5];
跟定义结构体变量的三种形式是一样的,只不过这里每次定义的结构体变量是一
个数组;每一个student[i]都是struct stu类型的;
2,结构体数组的初始化和引用
略;
三,结构体与指针
1,指向结构体的指针的定义,同上,也是三种形式;
struct employees employee1,*p1;
或者:
struct employees
{
...
}employee1,*p1;
或者:
struct
{
...
}employee1,*p1;
然后可进行如下操作:p1 = &employee1;此时p1指向首地址;
2,用结构体变量指针来引用结构体成员的两种操作:
(*结构体变量的指针名).成员名;
如:(*p1).name;括号不能省略,.的优先级是最高的;
或:
结构体变量的指针名->成员名;
如:p1->name;
注意.和->的优先级是最高的;
employee1.name;
(*p1).name;
p1->name;
是等价的;
3,结构体数组与指针
struct stu
{
int stu_nu;
char name[20];
float score;
}student[5],*p;
此时可以
(1)把数组student的起始地址赋给p:
p = student;此时p指向student[0];
(2)也可把student的其他元素的地址赋给p
p = &student[3];
(3)利用指针移动如p++使p指向结构体数组的不同元素;
四,结构体作为函数参数
1,结构体变量作为函数参数
2,指向结构体变量的指针作为函数参数
略,在后续文章里将给出一个例子;
五,共用体(联合体)
它可以表示几种不同类型的变量共用同一起始地址的内存单元,其定义形式,变
量说明,引用方式都类似于结构体,本质差别在于两者的存储方式不一样:结构
体变量的各个成员变量在存储时,各占不同起始地址的内存单元,而共用体的各个成员在存储时,共用同一起始地址的存储单元;
1,共用体的定义
三种方式和结构体一样
union data
{
int i;
float f;
char ch;
};
union data a,b,c;
或者:
union data
{
int i;
float f;
char ch;
}a,b,c;
或者:
union
{
int i;
float f;
char ch;
}a,b,c;
在类型定义时,系统并未给共用体分配具体的存储空间,只有当定义了这种共用
体类型的变量时,系统才为这种共用体类型的变量分配空间;一个共用空间的大
小相同,大小为成员项中占空间最大的那一个;
2,共用体变量的引用
union data a,*p;
其引用形式:
a.i;a.f;a.ch;或者
p = &a;p->=5;p->=4.3;p->='A';
由共用体的存储特性,知道&a,&a.i,&a.f,&a.ch都是同一个值;
C规定,不能把共用体变量作为函数参数或函数返回类型;
在某一时刻,共用体的存储空间只能存储一个成员的数据,在给不同的成员数据
赋值时,要注意最后引用的时候存储的是哪一个成员变量;
如下面的赋值就是不对的:
union
{
int i;
float f;
char ch;
}a = {5,4.3,'A'};一次只能给一个成员赋值,且共用体空间保存的是最后的那个成员的值;
另外,共用体也能嵌套,也可定义共用体数组,在这里不再详述,形式和结构体一样;