初识结构体
1.结构体的意义
结构体:存放不同类型数据的集合。
struct student //结构体类型为struct student
{
char name;
int number;
char sex;
}
我们面对的对象有各种各样数据对应着不同的类型。
2.结构体声明
结构声明在函数外时:为全局结构体,类似全局变量,在它之后声明的所有函数都可以使用。
结构声明在函数内时:为局部结构体,类似局部变量,只能放在该函数内使用,如果与全局结构体同名,则会暂时屏蔽全局结构体。
定义结构变量的一般形式是:
struct 结构体名 结构体变量名;
struct student //结构体类型为struct student
{
char name;
int number;
char sex;
}
struct Student s1; //定义结构体变量
或者可以简写为
struct student //结构体类型为struct student
{
char name;
int number;
char sex;
}s1; //定义结构体变量
后续访问里面的成员变量就可以使用 s1.name的方式来访问
接下来结构体中是否可以加入数组呢?
不止是数组,结构体也可以加入。
加入其它结构体就和加入其它类型一样
struct student
{ char name;
int number;
char sex;
struct Date birthday;
}s1
struct Date
{
int year;
int month;
int day;
}
这样就可以实现信息的分类多元化,有一个嵌套的效果。
结构体初始化
图为结构体数组,一般格式为:
struct 结构名 {
成员列表
} 数组名[数组长度];
struct student{
char *name;
int num;
char sex;
}class[5] = {
{"Li ping", 5, 'M'},
{"Zhang ping", 4, 'M'},
{"He fang", 1, 'F'},
{"Cheng ling", 2, 'F'},
{"Wang ming", 3, 'M'}
//注意初始化值的类型和顺序要与结构体声明时成员的类型和顺序一致
};
注意结构体数组要在定义时就直接初始化,如果先定义再赋初值是错误的
我们可以直接在结构体中初始化信息,可以把对成员或者整体初始化。结构体数组定义最麻烦,其他的方法差不多,不多赘述了。
结构体的空间
1.只有结构体变量才分配地址,结构体的定义是不分配空间的。
2.结构体中各成员的定义和之前的变量定义一样,但在定义时也不分配空间。
3.结构体变量的声明需要在主函数之上或者主函数中声明,如果在主函数之下则会报错
4.c语言中的结构体不能直接进行强制转换,只有结构体指针才能进行强制转换
结构体的存储
1结构体整体空间是占用空间最大的成员(的类型)所占字节数的整数倍。
2.结构体的每个成员相对结构体首地址的偏移量(offset)都是最大基本类型成员字节大小的整数倍,如果不是编译器会自动补齐。
ps:偏移量指的是结构体变量中成员的地址和结构体变量首地址的差。即偏移字节数,结构体大小等于最后一个成员的偏移量加上他的大小,第一个成员的偏移量为0。
结构体与指针
指针指向的是变量所占内存的首地址,在结构体中,指针指向的是结构体变量的起始地址,也可指向结构体变量的元素。
一共分为三种
1.指向结构体变量的指针
struct Student
{
char Name[20];
int number;
char sex;
}s1;
struct Student*p;
p=&s1;
//若为结构体数组则
struct Student class[5];
struct Student*p;
p=s1
2.指向结构体数组的指针
在我们想要用指针访问结构体数组的第n个数据时可以用
struct Student class[5];
struct Student*p;
p=class[n];
(++p).number//是指向了结构体数组下一个元素的地址
3.结构体成员是指针类型变量
它使用时可以很好地防止内存被浪费,但是注意在引用时一定要给指针变量分配地址。
struct Student
{
char* Name;
int number;
char sex;
}s1,*s1;
s1.name=(char*)malloc(sizeof(char));//内存初始化
且如果我们定义了结构体指针变量,他没有指向一个结构体,那么这个结构体指针也是要分配内存初始化的,他所对应的指针类型结构体成员也要相应初始化分配内存。
truct Student
{
char* Name;
int number;
char sex;
}s1,*s1;
s1= (struct student*)malloc(sizeof(struct student));./*结构体指针初始化*/
s1->name = (char*)malloc(sizeof(char));/*结构体指针的成员指针同样需要初始化*/