免费制作个人简历的网站,鱼鱼cms,事业单位网站建设方案策划书,东营网站建设dysem1#xff0c;结构体基本概念
结构体属于用户自定义的数据类型#xff0c;允许用户存储不同的数据类型。像int#xff08;整型#xff09;#xff0c;浮点型#xff0c;bool型#xff0c;字符串型等都是属于系统内置的数据类型。而今天要学习的结构体则是属于我们自定义…1结构体基本概念
结构体属于用户自定义的数据类型允许用户存储不同的数据类型。像int整型浮点型bool型字符串型等都是属于系统内置的数据类型。而今天要学习的结构体则是属于我们自定义的一种数据类型
2结构体定义和使用
语法struct 结构体名 { 结构体成员列表 }
通过结构体创建变量的方式有三种struct关键字不可省略
struct 结构体名 变量名struct 结构体名 变量名 {成员1值成员2值...}定义结构体时顺便创建变量
#includebits/stdc.h
using namespace std;
//1创建学生数据类型 学生包括姓名年龄分数
//自定义数据类型一些类型集合组成的一个类型
//语法 struct 类型名称{ 成员列表 }
struct Student{//成员列表//姓名string name; //年龄 int age;//成绩 int score;
}s3;//顺便创建结构体变量s3.
//2通过学生类型创建具体学生
int main(){//2.1 struct Student s1Student s1;s1.name张三;s1.age18; s1.score100;cout姓名 s1.name年龄 s1.age成绩 s1.scoreendl; //2.2 struct Student s2{...}Student s2{李四,19,80};cout姓名 s2.name年龄 s2.age成绩 s2.scoreendl; //2.3 在定义结构体时顺便创建结构体变量 s3.name王五;s3.age20;s3.score90;cout姓名 s3.name年龄 s3.age成绩 s3.scoreendl;
} 结构体在具象化的时候可以通过三种方式创建具体的类型 struct Student s1 struct Student s2{...} 在定义结构体时顺便创建结构体变量
3结构体数组
作用将自定义的结构体放入到数组中方便维护也就是数组中的每一个元素都是我们自定义的同一种数据结构类型也就是结构体。
语法struct 结构体名 数组名[元素个数]{ {}{}{}...{} }
示例
#includebits/stdc.h
using namespace std;
//结构体数组
struct student{string name;int age;int score;
};
int main(){struct student stuarry[3]{{july,18,100},{miss.li,20,90},{zhang,21,130}};stuarry[1].namesan;stuarry[1].age21;stuarry[1].score100;for(int i0;i3;i){cout姓名stuarry[i].nameendl;cout年龄stuarry[i].ageendl;cout成绩stuarry[i].scoreendl;}
}
4结构体指针
作用利用指针访问结构体中的成员
利用操作符-可以通过结构体指针访问结构体属性
struct student{string name;int age;int score;
};
int main(){//创建学生结构体变量student s{zhang,18,100}; //通过指针指向结构体变量student *ps;//通过指针访问结构体变量中的数据 p-age20;coutname p-nameage p-agescore p-scoreendl; }
通过上述例子我们可以总结出来 指针在定义时指针等号左右的数据结构要对应int对intfloat对floatstruct对struct。 指针通过-操作符可以访问成员
5结构体嵌套结构体
作用结构体中的成员可以是另一个结构体
例如每个老师辅导一个学员一个老师的结构体中记录一个学生的结构体
嵌套示意图 #includebits/stdc.h
using namespace std;
struct student{string name;int age;int score;
};//定义学生结构体
struct teacher{int id;string name;int age;student stu;//代表这个老师所带的学生
};
int main(){teacher t;t.id1000;t.age50;t.nameMr.li;t.stu.age10;t.stu.namexiaowang;t.stu.score60;coutteachers name is t.nameendl;coutteachers age is t.ageendl;coutteachers id is t.idendl;coutstudents age is t.stu.ageendl;coutstudents score is t.stu.scoreendl;coutstudents name is t.stu.nameendl;
} 6结构体做函数参数
作用将结构体作为参数向函数中传递
传递方式有两种
值传递形参修饰不会改变实参地址传递(如果函数形参发生改变实参也会跟着改变
示例
#includebits/stdc.h
using namespace std;
struct student{string name;int age;int score;
};//定义学生结构体
void printstudent1(struct student s){s.age100;cout子函数1中姓名s.name年龄为 s.age成绩为 s.scoreendl;
}
void printstudent2(struct student *p){p-age100;cout子函数2中姓名p-name年龄为p-age成绩为p-scoreendl;
}
int main(){student s;s.nameBob;//实参 s.age20;s.score85;printstudent1(s);// 值传递形参修饰实参不会改变实参的值 printstudent2(s);//地址传递 coutmain函数中姓名s.name年龄为 s.age成绩为 s.scoreendl;
} 主函数里的赋值为实参函数中的赋值为形参大家可以相应修改两种参数传递方式的参数值看看主函数里的实参会怎么变化得出的结论亦是上面两种结论。值传递修改形参不会改变实参的值地址传递则会修改实参的值具体原理参照C——函数-CSDN博客。
最根本的原理在于值传递参数时是独立开辟了一些内存空间而地址传递则是用指针直接指向实参地址
7结构体中const使用场景
作用用const来防止误操作
struct student{string name;int age;int score;
};//定义学生结构体
void printstudent(const student *stu){stu-age30; 加入const之后一旦有修改的操作就会报错可以防止我们的误操作coutname is stu-age;
}
上述函数中指针结构体加入const后结构体中的数据变不允许修改一旦修改便会报错。
8结构体案例
案例1
描述学校正在做毕设项目每名老师带领五个学生总共有三名老师需求如下
设计学生和老师的结构体其中在老师的结构体中有老师姓名和一个存放5名学生的数组作为成员
学生的成员有姓名考试分数创建数组存放3名老师通过函数给每个老师及所带的学生赋值
最终打印出老师数据以及老师所带的学生数据。 #includebits/stdc.h
using namespace std;
struct student{string name;int score;
};//定义学生结构体
struct teacher{string name;student arrstudent[5];
};
//给老师和学生赋值的函数
void teacher(struct teacher array[],int len){string nameseedABCDE;for(int i0;ilen;i){array[i].nameteacher_;array[i].namenameseed[i];for(int j0;j5;j){array[i].arrstudent[j].namestudent_;array[i].arrstudent[j].namenameseed[j];int randomrand()%6040;array[i].arrstudent[j].scorerandom;}}}
void print(struct teacher array[],int len){for(int i0;ilen;i){cout teachers name is array[i].nameendl;for(int j0;j5;j){coutstudents name is array[i].arrstudent[j].namescore is array[i].arrstudent[j].scoreendl;} }
}int main(){struct teacher array[3]; int lensizeof(array)/sizeof(array[0]);teacher(array,len);print(array,len);
}
案例2
设计一个英雄的结构体包括成员姓名年龄性别创建结构体数组数组中存放5名英雄。
通过冒泡排序的算法将数组中的英雄按照年龄进行升序排序最终打印排序后的结果。 {刘备,23,男}, {关羽,22,男}, {张飞,20,男}, {赵云,21,男}, {貂蝉,19,女}
#includebits/stdc.h
using namespace std;
struct hero{string name;int age;string sex;
};//定义学生结构体
void bubble(struct hero harray[],int len){for(int i0;ilen-1;i){for(int j0;jlen-i-1;j){if(harray[j].ageharray[j1].age){struct hero tempharray[j];//再次定义一个结构体接收。 harray[j]harray[j1];harray[j1]temp;}}}for(int i0;i5;i){cout排序后姓名为harray[i].name;cout\t排序后年龄为harray[i].age;cout\t排序后性别为harray[i].sex;coutendl;}}
int main(){struct hero harray[5]{{刘备,23,男},{关羽,22,男},{张飞,20,男},{赵云,21,男},{貂蝉,19,女} }; int lensizeof(harray)/sizeof(harray[0]);bubble(harray,len);} 此案例的关键在于冒泡排序中要定义一个新的结构体代替作为temp临时代替量接收被替换的全部内容。