
软件为visual studio2017,内容为C++学习笔记,以及相关的问题处理方法,目的是方便回顾和复习。
笔记来自于:黑马程序员C++教程。
一、结构体的基本概念
结构体属于用户自定义的数据类型,允许用户存储不同的数据类型。
二、结构体的定义和使用
1.语法
语法:struct 结构体名 {结构体成员列表};
通过结构体创建变量的方式有三种:
- struct 结构体名 变量名
- struct 结构体名 变量名 = {成员1值,成员2值....}
- 定义结构体顺便创建变量
2.关键点
1、结构体定义,结构体属于用于自定义的数据类型,允许用户定义不同的数据类型
2、将许多数据类型放在一起,作为一个新的数据类型,即自定义数据类型。
3、自定义的数据类型,一些类型集合组成一个类型
3.代码(示例):
struct Student {
//成员列表
string name; //姓名
int age; //年龄
int score; //分数
}s3;//定义结构体时,顺便创建结构体变量
//2、通过学生数据类型创建具体学生
int main() {
//2.1定义方式 struct Student s1
struct Student s1; //创建一个结构体变量,相当于数据类型 + 变量名
s1.name = "张三"; //给结构体变量s1进行赋值,通过.访问结构体变量中的属性
s1.age = 24;
s1.score = 86;
cout << "姓名: " << s1.name << "年龄:" << s1.age << "分数为: " << s1.score << endl;;
//2.2结构体变量名 struct Student s2={}
struct Student s2 = {"李四", 28, 100 }; //Student s2={"李四",28,100}
//创建结构体变量时,struct变量可以省略
cout << "姓名: " << s2.name << "年龄:" << s2.age << "分数为: " << s2.score << endl;;
//2.3定义结构体时顺便创建结构体变量
s3.name = "王五";
s3.age = 26;
s3.score = 89;
cout << "姓名: " << s3.name << "年龄:" << s3.age << "分数为: " << s3.score << endl;;
4.小结
(1)定义结构体时候的关键字struct,不可省略。
(2)创建结构体变量时,关键字struct可以省略。
(3)结构体变量可以通过“.”访问成员。
三、结构体数组
1.作用
- 作用:
将自定义的结构体放入到数组中方便维护
struct 结构体名 数组名[元素个数] = {{ },{ },{ }}
结构体数组中,装的都是结构体变量,每个结构体变量中装入的都是多类型的元素。
3.示例
//1、定义结构体
struct Student {
//成员列表
string name;//姓名
int age;//年龄
int score;//分数
};
int main() {
//2、创建结构体数组
struct Student stuArray[3] = {
//将结构体变量当做一个元素放到数组中,struct Student视为数据类型
{"张三",26,86},//都是struct Student类型的结构体
{"李四",28,89},
{"王五",31,91}
};
//3、给结构体数组中的元素赋值
stuArray[1].name = "赵丽颖";//根据数组中的结构体进行数组的访问。
//4、遍历结构体数组
for (int i = 0; i < 3; i++) {
cout << "姓名: " << stuArray[i].name << "年龄: " << stuArray[i].age << "分数: " << stuArray[i].score<<endl;;
}
四、结构体指针
1.作用
通过指针访问结构体中的成员。
- 利用 *** 作符
->可以通过结构体指针访问结构体的属性。
//1.构建结构体
struct Student {
string name;//姓名
int age;//年龄
int score;//分数
};
int main() {
//1.创建学生结构体变量
struct Student s1 = { "李四",24,96 }; //将struct Student作为数据类型
//2.通过指针指向结构体变量
//指针的数据类型为struct Student,由于指定好内存后,系统才能分配好空间。
//通过结构体指针 访问结构体中的属性,需要利用'->'
struct Student *p = &s1;//指针的值为变量的地址。
//3.通过指针访问结构体变量中的数据
cout << "姓名: " << p->name << " 年龄: " << p->age << " 分数:" << p->score << endl;
五、结构体嵌套结构体
1.作用
结构体中的成员可以是另一个结构体
例如:每个老师辅导一位学员,一个老师的结构体中,记录着一个学生的结构体。
2.示例//结构体定义
//学生的结构体
struct Student {
//成员列表
string name;//姓名
int age;//年龄
int score;//分数
};
//老师的结构体
struct teacher {
//成员列表
int id;//职工编号
string name;//教师姓名
int age;//教师年龄
struct Student stu;//子结构体,学生
};
int main() {
teacher t;
t.id = 1000;
t.name = "老王";
t.age = 50;
t.stu.age = 20;
t.stu.name = "小李";
t.stu.score = 89;
cout << "老师的id:" << t.id << " 老师的名字为: " << t.name << " 老师的年龄为: " << t.age
<< " 老师带的学生的姓名:" << t.stu.name << " 老师带的学生的年龄:" << t.stu.age << " 老师带的学生的分数为:" << t.stu.score << endl;
system("pause");
return 0;
}
3.小结
在一个结构体中定义另一个结构体,已解决实际问题。
六、结构体做函数参数 1.作用- 作用:将结构体作为参数向函数中传递。
(1)值传递
(2)地址传递
//定义一个学生的结构体
struct Student {
string name;
int age;
int score;
};
//打印学生信息函数
//1、值传递函数
void printStu1(struct Student s) {//关键点,理解struct Student视为一种数据类型。
s.age = 200;//函数内部进行值传递时,改变形参不改变实参的值
cout << "结构体函数1中的姓名:" << s.name << " 年龄: " << s.age << " 分数: " << s.score << endl;
}
//2、地址传递
//定义结构体类型的指针
void printStu2(struct Student *p) {//指针类型为struct Student
p->age = 200;//地址传递的时候,改变形参,即改变实参的值。
cout << "结构体函数2中的姓名:" << p->name << " 年龄: " << p->age << " 分数: " << p->score << endl;
}
int main() {
//将结构体做函数参数
//将学生传入到一个参数中,打印学生身上的所有信息。
struct Student s1;
s1.name = "张三";
s1.age = 49;
s1.score = 98;
cout << "进行值传递" << endl;
printStu1(s1);//打印学生信息。
cout << "main()函数中的学生姓名: " << s1.name << " 年龄: " << s1.age << " 分数: " << s1.score << endl;
cout << "进行地址传递" << endl;
printStu2(&s1);
cout << "main()函数中的学生姓名: " << s1.name << " 年龄: " << s1.age << " 分数: " << s1.score << endl;
system("pause");
return 0;
4.总结
- 总结:如果不想修改主函数中的数据,用值传递,反之用地址传递。
七、结构体中的const使用场景 1.值传递的问题
- 1、值传递,值传递的时候,不改变实参的值,但是会新开辟内存空间存储实参的值,复制数据,进行值的传递。
- 2、值传递的缺点:实参量越多,需要赋值的数据越多,需要额外的空间越大,浪费或者消耗大量的内存空间。
- 1、地址传递就可以进行,直接 *** 作数据,不会占用额外的内存空间。
- 2、将函数中的形参改为指针,就可以减少内存空间,而且不会复制新的副本出来。
- 3、地址传递就可以进行,直接 *** 作数据,不会占用额外的内存空间。
- 4、使用指针可以节省空间
void printStu(const struct Student *s) {
//s->age = 200;//加入const后,一旦有修改的 *** 作就会报错,可以防止我们误 *** 作.
cout << "学生的信息为:" << s->name << " 年龄: " << s->age << " 分数: " << s->score << endl;
}
int main() {
//创建结构体变量
struct Student s = { "张三",15,70 };
printStu(&s);
cout << "main()函数中的学生姓名: " << s.name << " 年龄: " << s.age << " 分数: " << s.score << endl;
//通过函数打印结构体信息
system("pause");
return 0;
}
八、结构体案例(1)
1.案例1
案例描述:
学习正在做毕设项目,每名学生带领5个学生,总共有3名老师,需求如下:
- 设计学生和老师的结构体,其中在老师的结构体中,有老师姓名和一个存放5名学身的数组作为成员。
- 学生的成员有姓名、考试分数,创建数组存放3名老师,通过函数给每个老师及所带的学生赋值,最终打印出老师数据以及老师所带的学生数据。
//学习正在做毕设项目,每名学生带领5个学生,总共有3名老师,需求如下:
//- 设计学生和老师的结构体,其中在老师的结构体中,有老师姓名和一个存放5名学身的数组作为成员。
//- 学生的成员有姓名、考试分数,创建数组存放3名老师,通过函数给每个老师及所带的学生赋值,最终打印出老师数据以及老师所带的学生数据。
struct Student {
string sName;
int score;
};
struct teacher {
string tName;
struct Student sArray[5];//结构体数组
};
void allocateSpace(struct teacher tArray[],int len){
string tnameArray = "ABC";//char tnameArray1[] = "ABC";字符串的定义方式
string snameArray = "abcde";
//为老师和学生结构体赋初值
for (int i = 0; i < len; i++) {
tArray[i].tName = "teacher_";
tArray[i].tName += tnameArray[i];
for (int j = 0; j < 5; j++) {
tArray[i].sArray[j].sName = "student_";
tArray[i].sArray[j].sName += snameArray[j];
int random = rand() % 60 + 40;//分数random的范围为:40-99
tArray[i].sArray[j].score = random;
}
}
}
void printST(struct teacher tArray[],int len) {
for (int i = 0; i < len; i++) {
cout << "老师的姓名:" << tArray[i].tName << endl;
for (int j = 0; j < 5; j++) {
cout << "\t学生姓名:" << tArray[i].sArray[j].sName <<" 考试分数: "<< tArray[i].sArray[j].score<< endl;
}
}
}
int main() {
//随机数种子
srand((unsigned int)time(NULL));
//1、创建数组存放3名老师数组
struct teacher tArray[3];
//2、通过函数给3名老师的信息赋值,并给老师带的学生信息赋值。
int len = sizeof(tArray) / sizeof(tArray[0]);
allocateSpace(tArray,len);
//3、打印所有老师及所带的学生信息
printST(tArray, len);
system("pause");
return 0;
九、结构体案例(2)
1.案例描述
- 设计一个英雄的结构体,包括成员姓名,年龄,性别;创建结构体数组,数组中存放5名英雄。通过冒泡排序的算法,将数组中的年龄进行排序,最终打印排序后的结果。
- 五名英雄信息如下:
{“刘备”,23,“男”},
{“关羽”,22,“男”},
{“张飞”,20,“男”},
{“赵云”,21,“男”},
{“貂蝉”,19,“女”},
2.代码示例
struct Heros {
//成员列表
string name; //姓名
int age; //年龄
string gender; //性别
};
//冒泡法进行结构体数组排序
void bubblesort(struct Heros hero[],int len ) {//对结构体数组元素按着年龄进行排序。
for (int i = 0; i < len; i++) {
for (int j = 0; j < len - i - 1; j++) {
if (hero[j].age > hero[j + 1].age) {//数组元素前者大于后者进行元素交换
struct Heros temp = hero[j];//定义一个结构体变量进行元素交换。
hero[j] = hero[j + 1];
hero[j + 1] = temp;
}
}
}
}
//打印英雄
void print_heros(struct Heros hero[], int len) {
for (int i = 0; i < len; i++) {
cout << "英雄的名字:" << hero[i].name << " 年龄:" << hero[i].age << " 性别: " <<hero[i].gender << endl;
}
}
int main() {
struct Heros hero_list[5] = {
{"刘备",23,"男"},
{"关羽",22,"男"},
{"张飞",20,"男"},
{"赵云",21,"男"},
{"貂蝉",19,"女"}
};
int len = sizeof(hero_list) / sizeof(hero_list[0]);
cout << "数组分长度为:" << len << endl;
//数组排序
bubblesort(hero_list, len);
//数组打印输出
print_heros(hero_list, len);
system("pause");
return 0;
}
总结
主要对结构体的定义和使用等进行了介绍,并给出了具体案例对结构体的使用。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)