结构体
同一类问题讨论时需要定义多个同类型变量,可用结构体避免定义多个变量麻烦
结构体的定义:
1.常规定义 2.声明的同时定义
struct time{ struct student{
int........... char........
int.......... char........
}; }Alan,Tom;
struct time t;
*这里的struct time相当于int,char等,是定义类型,而t是定义类型后面的变量
这里的Alan,Tom相当于变量
3.使用结构体作为成员 4.匿名结构体
struct DATE{ struct{
int.......... int............
int.......... char...........
} }Alan,Tom;
struct person{
char........
struct DATE birthday;
};
struct time t;
*struct DATE是定义结构体变量,可以嵌套进结构体
结构体的调用:的.是成员运算符,用来获取结构体中的成员
结构体的初始化:struct student Alan = {xxx,xxx,xxxxxx,xx};
!!!!!意外之喜欸!!!!!
b站的课讲到了一个我一直出错的东西,就是给char string[ ]里加入字符串,之所以不能直接用=是因为,一般来说,二者数组的内存大小不同,所以不能用,但是用strcpy就行了
结构体数组:
struct student{
int.........
char.........
int.........
};
main()
{
struct student class_02[5] = {
{01,"Alan",18};
{02,"Tom",17};
};
}
导出各个学生资料时,用for循环,把结构体名换成class_02[i];
结构体指针:
使用分量运算符 -> 来获取成员 , 而不是 .
struct DATE{
int...........
char........
}date = {2012, 11, 27 }, *d ;
main()
{
d=&date;
printf("%d",d->year)
}
结构体添加成员:
struct time{
int hour;
};
struct time now{1};
struct time past; //定义一个结构体名称
= - 1;
此时struct time past为{0}
*自己敲结构体函数
定义: struct time add(struct time now,struct time pass)
{
struct time rel;
= .................
return rel;
}
int main()
{
struct time result;
result = add(now,pass);
}
结构体的定义:
只有结构体变量才分配地址,而结构体的定义是不分配空间的
结构体中各成员的定义和之前的变量定义一样,但在定义时也不分配空间
c语言中的结构体不能直接进行强制转换,只有结构体指针才能进行强制转换(struct xxx *)
*用sizeof关键字求结构体长度时,返回的最大基本类型所占字节的整数倍比方说我们上面求得的为44 为 float(4个字节)的整数倍,但是我们把title修改为title[22]; 这时正常长度为46 ,但是你会发现实际求得的为48(4的整数倍)
结构体的存储:
1.结构体整体空间是占用空间最大的成员(的类型)所占字节数的整数倍
2.结构体的每个成员相对结构体首地址的偏移量(offset)都是最大基本类型成员字节大小的整数倍,如果不是编译器会自动补齐
结构体变量的引用:
如果结构体的成员本身是一个结构体,则需要继续用.运算符,直到最低一级的成员
结构体的初始化:
注意结构体数组要在定义时就直接初始化,如果先定义再赋初值是错误的
进行数组初始化的时候如果定义的数组过长,而我们只初始化了一部分数据,对于未初始化的数据如果是数值型,则会自动赋值为0,对于字符型,会自动赋初值为NULL,即‘\0’ 即不足的元素补以默认值
struct student { char* Name; int number; char csex; }stu, * stu; stu = (struct student*)malloc(sizeof(struct student));. / * 结构体指针初始化*/ stu->name = (char * )malloc(sizeof(char)); / * 结构体指针的成员指针同样需要初始化*/
结构体与指针:
(++p) .xxxx指向结构体数组下一个元素的地址
swap函数里,如果不用指针,则只能改变局部变量而不能改变全局变量,因此需要运用指针。
清空结构体:
struct Student { char cName[20]; int number; char csex;
}stu1;
memset(&str,0,sizeof(struct Student)); 如果是数组: struct Student stu[10]; 就是 memset(stu,0,sizeof(struct Student)*10);