1、C语言中提供了一些由系统已经定义好的数据类型,如:int,float,char等,用户可以在程序中用它们定义变量,解决一般的问题,但人们要处理的问题往往比较复杂,只有系统提供的类型还不能满足应用的要求,C语言允许用户根据需要自己建立一些数据类型,用它来定义变量。
2、C语言允许用户自己指定这样一种数据结构,它由不同类型的数据组合成一个整体,以便引用,这些组合在一个整体中的数据是互相联系的,这样的数据结构称为结构体。
声明一个结构类型的一般形式如下:
struct 结构体名
{
成员列表
};
大括号内是该结构体中的各个成员,由它们组成一个结构体,对各成员都应进行类型声明。举例如下:
struct student1
{
int id;
char name[20];
}s0;//定义struct student1类型的变量s0
注:一个结构体变量中可以存放一组数据(结构体数组)
定义结构体类型的变量,并在其中存放具体的数据。举例如下:
struct student1 s1; //定义struct student1类型的变量s1
struct student1 s2 = {2, "小明"}; //定义结构体变量并直接初始化
struct student1 s3 = {4, "小红"};
注:a. 类型与变量是不同的概念,只能对变量赋值,存取或运算。不能对一个类型赋值,存取或运算。在编译时,对类型是不分配空间的,只对变量分配空间
b. 对结构体中的成员可以单独使用,它的作用相当于普通变量
c. 成员也可以是一个结构体变量
使用.引用成员,指针用“->”引用成员
printf ("id2 = %d, name2 = %s\n", s2.id, s2.name); //id2 = 2, name2 = 小明
struct student1 *ps = &s1;
s1.id = 20;
printf ("id4 = %d, name4 = %s\n", ps->id, ps->name); //id4 = 20, name4 = 小红
3、内存对齐
I、结构体成员的首地址要能被该成员的类型长度整除
II、结构体为成员分配空间原则:
a、每次分配的时候按当前最大类型分配
b、如果当前空间够用,则不再分配空间
c、如果当前类型大于系统系数的时候,按系统系数标准进行分配空间,否则按最大类型分配空间
#include <stdio.h>
struct Test
{
char c1;
int a;
char c2;
//char c3——再加上c3这一成员时,所占内存空间依旧为12字节
};
struct Test1
{
char c1;
char c2;
char c3;
int a;
};
struct Test2
{
char c1;
short s;
int a;
char c3;
struct Test t1; //成员也可以是一个结构体变量
int b[20];
};
int main()
{
printf ("sizeof Test = %lu\n", sizeof(struct Test)); //sizeof Test = 12
printf ("sizeof Test1 = %lu\n", sizeof(struct Test1)); //sizeof Test = 8
printf ("sizeof Test2 = %lu\n", sizeof(struct Test2)); //sizeof Test = 104
struct Test2 t1, t2;
t1 = t2;//通过结构体可对数组进行赋值
return 0;
}
**4、**共用体
所用成员共用一段内存,共用体大小是成员中占据最大的成员的大小
union Test
{
int a;
char c;
};
int main()
{
printf ("sizeof Test = %lu\n", sizeof(union Test)); //sizeof Test = 4
union Test t;
t.a = 10;
t.c = 'A';
printf ("%d\n", t.a); //65,原先所存的Int型的10,被后存入的char型‘A’所覆盖(‘A’==65)
return 0;
}