一.结构体的使用
结构是一些值的集合,这些值称为成员变量。而结数组与结构体最大的区别在于,数组中存储的只能是同一种类型的元素集合,结构体中的成员变量可以是各种数据类型的成员变量。
1.结构体的创建形式
struct tag { //struct tag是结构体的类型名称
member-list; //member-list是成员变量(可以是一个,也可以是多个)
};
struct是结构体的关键字,就好比int ,float,double这些数据类型一般 ,后面的tag才是结构体的名字。
//结构体
struct Peo {
char name[20]; //姓名,(字符数组)--限制了输入字符的字符数
int age; //年龄
char tale[12]; //电话号
char sex[5]; //性别
};
注:结构体的成员类型可以是变量、数组、指针或者其他结构体(嵌套)。
2.结构体的初始化
结构体的初始化并不能在结构体中进行,需要在在结构体的外面,或者main函数内部执行操作。
struct Peo {
char name[20]; //姓名,(字符数组)--限制了输入字符的字符数
int age; //年龄
char tale[12]; //电话号
char sex[5]; //性别
};
struct Peo pe = { "zhangsan",25,"15792132",'男' };
int main() {
struct Peo p1 = { "小橙",22,"1456544654","男"};
return 0;
}
上图代码中,通过编写结构体,我在其外部创建了结构体的变量(实际上称之为对象更好一些,但C语言是面向过程的编程语言,是没有对象可言的。),通过变量可以给结构体的成员变量初始化赋值。
其实结构体就好比一张盖房子的图纸,而结构体变量的创建就是盖房子。只有把图纸的方案修订好,我们才能根据图纸的意思去造房子。图纸永远是虚幻的,它是不占房子的一丝空间,只是决定了房子修盖的方向与类型,所以说结构体的创建不会在内存中留有位置,只有在创建变量赋值的时候才会被拿来用。
3.嵌套结构体
//结构体
struct Peo {
char name[20]; //姓名,(字符数组)--限制了输入字符的字符数
int age; //年龄
char tale[12]; //电话号
char sex[5]; //性别
};
struct List {
int num;
float pai;
struct Peo p1;//嵌套结构体
};
嵌套一词,我们在学习循环的时候就已经了解,一层套一层,结构体也是同理。所以赋值的时候内层的结构体中的成员变量要单另用花括号括起来。
struct List l1 = { 100,3.14,{"小圆",21,"1785610","女"} };
二.结构体的访问方式(两种)
1.结构体变量访问成员 结构变量的成员是通过点操作符(.)访问的。
struct Peo {
char name[20]; //姓名,(字符数组)--限制了输入字符的字符数
int age; //年龄
char tale[12]; //电话号
char sex[5]; //性别
};
struct List {
int num;
float pai;
struct Peo p1;//嵌套结构体
};
int main() {
struct Peo p1 = { "小橙",22,"1456544654","男"};
struct List l1 = { 100,3.14,{"小圆",21,"1785610","女"} };
printf("%s %d %s %s\n", p1.name, p1.age, p1.tale, p1.sex);
printf("%d %f,%s %d %s %s\n", l1.num,l1.pai,l1.p1.name, l1.p1.age, l1.p1.tale, l1.p1.sex);
对象.成员变量即可访问结构体变量初始化后的所有数据。
2.结构体传址
结构体变量通过地址传递给指针,指针可以通过指针(->)箭头访问成员变量。
struct Peo {
char name[20]; //姓名,(字符数组)--限制了输入字符的字符数
int age; //年龄
char tale[12]; //电话号
char sex[5]; //性别
};
struct List {
int num;
float pai;
struct Peo p1;//嵌套结构体
};
void Print2(struct List* ps) {
printf("%d %f %s %d %s %s \n", ps->num, ps->pai, ps->p1.name, ps->p1.age,ps->p1.tale,ps->p1.sex);
}
int main() {
struct List l1 = { 100,3.14,{"小圆",21,"1785610","女"} };
//结构体访问方式 :对象.成员名,指针->成员名
Print2(&l1);
void Print1(struct Peo ss) {
printf("%s %d %s %s\n", ss.name, ss.age, ss.tale, ss.sex);
}
void Print2(struct List* ps) {
printf("%d %f %s %d %s %s \n", ps->num, ps->pai, ps->p1.name, ps->p1.age,ps->p1.tale,ps->p1.sex);
}
对于结构体变量传参,函数传参的时候,参数是需要压栈的。 如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。所以需要用到地址传递方式--省空间,所以在编写过量程序的时候,大家尽量用到地址传递方式。
结构体就讲到这里,谢谢观看!