结构体:
数组:数据类型相同的一组数据的集合。
结构体:数据类型不同的一组数据的集合(数据量多,大,丰富)。
结构体四种定义方式:
提醒:新手容易忘记在结构体右括号后面带上分号。
1.先定义结构体类型,再定义结构体变量
struct student{
int data;
};
struct student stu1;//stu1为student的结构体变量
2.定义结构体变量的同时,定义结构体变量
struct student{
int data;
}stu1;
如果想要继续定义结构体变量
struct student stu2;//这样既可以再次定义结构体变量
3.不定义结构体类型,而直接定义结构体变量
struct{
int data;
}stu1;
这样做的缺陷很大,这样的话我们就不能再次定义stu1该类型的结构体变量了,可移植性非常差,也不灵活。
4.用typedef 来定义结构体变量及类型
typedef sturct node{
int data;
}Binode (*pstu);
这样定义的话,结构体类型的名字就有了两(三)个分别为node和Binode,(pstu)自然定义结构体变量的方式也就有了两(三)种
1.struct node val1;
2.Binode val2;
3.pstu val3;(这个是命名成指针的用法)
结构体常犯的致命错误:
- 当结构体中定义了指针变量,使用指针变量时要用malloc开辟空间,不然就会出现段错误。
结构体数组:
结构体数组定义方式:
struct studet stu[3];
使用方式:
它的使用和数组一样,用下标法遍历。
优点:
结构体可以多次使用,但不用多次定义。
结构体指针:
定义方式:
struct student *p;//野指针
p.score = 100; //这样写是错的,如果要用结构体指针,就不能用点运算符,访
问结构体中的变量就要用->(建号)。
p = (struct student *)malloc(sizeof(struct student));//野指针要赋予空
间才能使用,很重要。
free(p);//释放开辟的空间,不会造成浪费。
p = &stu1;//指针式存放地址的变量,之前指向的是malloc开辟的空间,现在指
针变量存放的是stu1的地址。
p++;//指针++后会偏移整个结构体的大小,计算结构体的大小去看收藏的老师写的
结构体的计算方式。
结构体的初始化方式:
这种方式在Liunx内核的代码中经常的使用,只不过有的编译器不支持这样写。
struct Animal{
char name[128];
int age;
int sex;
int others;
void(*peat)();
};
int main()
{
//struct Animal dog1 = {"阿黄",1,100,1,Dogbeat};
struct Animal dog{
.name = "阿黄",
.age = 1//这里是没有逗号的
};
}
这个定义方式,你想要哪个变量初始化,直接就可以初始化,不用在意顺序,也不用在意其他变量。