C++(四)——基础总结:函数&数组&指针&结构体

C++基础

  • 空的模板程序
#include<iostream>
using namespace std;
int main() {
	system("pause");
	return 0;
}

1、函数

  • 函数需要在主函数外进行声明
  1. 分文件编写
    一般需要三个文件:主函数,头文件,其他函数
    • 主函数(Main.cpp):书写模板函数的内容,同时包含另一个自命名的头文件
    • 头文件(Head.h):主要编写预处理;函数的声明;结构体定义
    • 其他函数(Head.cpp):一般两个文件前缀相同;包含头文件;主要进行函数的定义

2、数组

  1. 定义
int arr[100];
int arr[5]={11,22,33,44,55};
  1. 二维数组
int a[3][4]={{1,1,1,1},{2,2,2,2}{3,3,3,3}}

3、指针

  1. 定义
    • 指针访问的是地址
    • 指针的定义:int *p(指向一个整型数据)
    • 指针的指向:p=&a(&取到了a的地址给p)
    • 指针的数据使用:cout<<*p<<endl;(对于指针所指数据的访问)
  2. 指针所占用的内存
    • 指针在32位系统中占用4个字节,64位系统占用8个字节
  3. 空指针&野指针
    • 空指针:int *p=NULL(空指针无法访问,会报错)
    • 野指针:int *q=(int *)0x100(没有指定对象)
  4. const修饰指针const int *const p=&a;
    • 常量指针const int *p:指针所指向的数据无法通过指针修改,但是可以更改指针的指向
    • 指针常量int *const p:指针所指的数据可以根据指针进行修改,但是不可以更改指针的指向
  5. 指针访问数组元素
    • 数组定义时的名称是该类型的指针,指向的是该数组的首元素的地址。
    • 通过p++可以找到数组的下一个元素
    • int length=sizeof(a)/sizeof(a[0])来对数组的长度进行计算
  6. 指针访问函数
    • 地址传递:指针进行函数的访问发生地址传递可以改变主函数中的数值;

4、结构体

  1. 定义
    • 自定义的数据类型
struct student{
	string name;
	int age;
	int score;
}s1,*s2;

  1. 解释
    • s1是在使用的时候可以使用的别名
    • s2是指向该结构体的指针
  2. 结构体数组
    • 定义:在使用结构体的时候,可以将此结构体视作int,char等关键字,但是其中分割的内容使用{}括起来
	Student group[3] = {
		{"张三",13,88},
		{"李四",13,88},
		{"王五",13,88},
	};
  1. 结构体指针
    • 使用student/s1进行新建的时候需要&
    • 使用s2进行新建的时候不需要&
    • 访问的时候使用->进行访问
  2. 结构体的嵌套
    • 在新建结构体的时候可以使用已经有的结构体作为新的结构体中的数据类型
struct student
{
	string name;
	int age;
	int score;
}; //顺序很重要
struct teacher
{
	string name;
	int age;
	int money;
	struct student stu;
};
  1. 结构体中const的使用
    • 值传递,占用空间很大,不修改原始数据
    • 地址传递,节省内存,不会复制新的数据
//值传递,占用的空间很大
void printStudent3(const student a) {
	cout << a.name << endl;
	cout << a.age << endl;
	cout << a.score << endl;

}

//地址传递,指针的内存,节省内存,不会复制新的数据
void printStudent2(const student*b) {

	cout << b->name << endl;
	cout << b->age << endl;
	cout << b->score << endl;
	//b->age = 150;

	//数据更加的安全,不发被重新改变
	cout << b->age << endl;
}

阶段案例——通讯录管理系统

初代代码(一个文件)

#include<iostream>
#include<string>
#include"Hanshu.h"
#define MAX 1000

using namespace std;

//封装菜单函数在里面 void Menu()
//1、在主函数调用菜单显示
void Menu() {
	cout << "***************************" << endl;
	cout << "****** 1、添加联系人 ******" << endl;
	cout << "****** 2、显示联系人 ******" << endl;
	cout << "****** 3、删除联系人 ******" << endl;
	cout << "****** 4、查找联系人 ******" << endl;
	cout << "****** 5、修改联系人 ******" << endl;
	cout << "****** 6、清空联系人 ******" << endl;
	cout << "****** 0、退出通讯录 ******" << endl;
	cout << "***************************" << endl;
}
struct Person {
	string m_name;
	int m_Sex;//1男,2女
	int m_Age;
	string m_phone;
	string m_Addr;
};
struct TeleBook
{
	//通讯录中的联系人数组
	Person Array[MAX];

	//记录联系人个数
	int m_Size;

};
//创建指针指向实例化的通讯录的结构体
void addPerson(TeleBook *a) {
	//判断通讯录是否是满的
	if (a->m_Size == MAX) {
		cout << "通讯录已经满了,无法添加" << endl;

	}
	else {
		string name;
		cout << "请输入你的名字" << endl;
		cin >> name;
		a->Array[a->m_Size].m_name = name;
		cout << "请输入你的性别" << endl;
		cout << "1--男" << endl;
		cout << "2--女" << endl;
		int sex = 0;
		while (1) {
			cin >> sex;
			if (sex == 1 || sex == 2) {
				a->Array[a->m_Size].m_Sex = sex;
				break;
			}
			cout << "输入错误,请重新输入" << endl;
		}
		cout << "请输入你的年龄" << endl;
		cin >> a->Array[a->m_Size].m_Age;
		cout << "请输入你的电话" << endl;
		cin >> a->Array[a->m_Size].m_phone;
		cout << "请输入你的家庭住址" << endl;
		cin >> a->Array[a->m_Size]. m_Addr;
		a->m_Size++;
		cout << "添加成功"<<endl;
		cout << "现在联系人个数" << a->m_Size << endl;

		system("pause");//按下任意键继续
		system("cls");//清屏处理
	}
}
void showPerson(TeleBook*a) {
	cout << " 现存联系人个数:" << a->m_Size << endl;
	if (a->m_Size == 0)
		cout << "当前的人数为空" << endl;
	else {
		for (int i = 0; i < a->m_Size; i++)
		{
			cout
				<< " 编号:" << i
				<< " 姓名:" << a->Array[i].m_name
				<< " 性别: " << (a->Array[i].m_Sex==1?"男":"女")
				<< " 年龄:" << a->Array[i].m_Age
				<< " 电话:" << a->Array[i].m_phone
				<< " 家庭住址:" << a->Array[i].m_Addr
				<< endl;

		}

		system("pause");
		system("cls");
	}
}

//检测联系人是否存在的函数
int checkPerson(TeleBook*a,string name) {
	
	for (int i = 0; i <= a->m_Size; i++)
	{
		if (a->Array[i].m_name == name) 
			return i;
		else		
			return -1;
	}
}

//删除联系人
void deletPerson(TeleBook*a) {
	cout << "请输入需要的联系人姓名:" << endl;
	string name;
	cin >> name;
	//判断联系人是否在通讯录中
	int ret = checkPerson(a, name);
	if (ret != -1)//找到了联系人
	{
		int num1;
		cout << "您确定要删除吗" << endl;
		cout << "1--删除" << endl;
		cout << "2--不删除" << endl;
		cin >> num1;
		if (num1 == 1) 
		//将删除项目的数据后的前移进行数据的覆盖,达到删除的目的
		{
			for (int i = ret; i <a->m_Size ; i++)
			//这个是循环的次数是i<最后一个数据
			{
				a->Array[i] = a->Array[i + 1];
			}
			a->m_Size--;
		}
	}
	else
		cout << "查无此人" << endl;
	system("pause");
	system("cls");
}

//查询联系人
void searchPerson(TeleBook*a) {
	cout << "请输入需要查找的联系人姓名:" << endl;
	string name;
	cin >> name;
	//判断联系人是否在通讯录中
	int ret = checkPerson(a, name);
	if (ret != -1)//找到了联系人
	{
		cout << "姓名:" << a->Array[ret].m_name << "\t";
		cout << "性别:" << a->Array[ret].m_Sex << "\t";
		cout << "年龄:" << a->Array[ret].m_Age << "\t";
		cout << "电话:" << a->Array[ret].m_phone << "\t";
		cout << "地址:" << a->Array[ret].m_Addr << endl;
	}
	else
		cout << "查无此人" << endl;
	system("pause");
	system("cls");
}
void changePerson(TeleBook*a) {
	cout << "请输入需要修改的联系人姓名:" << endl;
	string name;
	cin >> name;
	//判断联系人是否在通讯录中
	int ret = checkPerson(a, name);
	if (ret != -1)//找到了联系人
	{
		int num2;
		cout << "姓名:" << a->Array[ret].m_name << "\t";
		cout << "性别:" << a->Array[ret].m_Sex << "\t";
		cout << "年龄:" << a->Array[ret].m_Age << "\t";
		cout << "电话:" << a->Array[ret].m_phone << "\t";
		cout << "地址:" << a->Array[ret].m_Addr << endl;
		cout << "1--修改姓名" << "\t";
		cout << "2--修改性别" << "\t";
		cout << "3--修改年龄" << "\t";
		cout << "4--修改电话" << "\t";
		cout << "5--修改地址" << endl;
		cin >> num2;
		switch (num2) {
		case 1: {
			string name;
			cout << "请输入你的名字" << endl;
			cin >> name;
			a->Array[ret].m_name = name;
			break;
		}
		case 2: {
			cout << "请输入你的性别" << endl;
			cout << "1--男" << endl;
			cout << "2--女" << endl;
			int sex = 0;
			while (1) {
				cin >> sex;
				if (sex == 1 || sex == 2) {
					a->Array[ret].m_Sex = sex;
					break;
				}
				cout << "输入错误,请重新输入" << endl;
			}
			break;
		}
		case 3: {
			cout << "请输入你的年龄" << endl;
			cin >> a->Array[ret].m_Age;
			break;
		}
		case 4: {
			cout << "请输入你的电话" << endl;
			cin >> a->Array[ret].m_phone;
			break;
		}
		case 5: {
			cout << "请输入你的家庭住址" << endl;
			cin >> a->Array[ret].m_Addr;

			break;
		}
		}

	}
	else
		cout << "查无此人" << endl;
	system("pause");
	system("cls");
}

//清空所有的联系人
void cleanPerson(TeleBook*a) {
	int num1;
	cout << "您确定要清空吗" << endl;
	cout << "1--清空" << endl;
	cout << "2--不清空" << endl;
	cin >> num1;
	if (num1 == 1)
	{
		a->m_Size = 0;//人数为0,逻辑清空
		cout << "通讯录为空" << endl;
	}
	system("pause");
	system("cls");
}
int main() {

	//创建通讯录的结构体
	TeleBook abs;
	//初始化通讯录的人员个数
	abs.m_Size = 0;

	int select = 0;//用户选择的变量


	//循环让系统进行重新的输入
	while (1) {

		//打印菜单界面
		Menu();
		cin >> select;
		switch (select) {
		case 1:
			
			//3、添加联系人
			//封装添加通讯录中的联系人的函数,利用指针进行地址传递。
			addPerson(&abs);
			break; 
		case 2:
			showPerson(&abs);
			break;
		case 3: 
		//{
		//	string name;
		//	cout << "请输入需要检索的联系人姓名:" << endl;
		//	cin >> name;
		//	int a=checkPerson(&abs,name);

		//	if(a==-1)
		//		cout << "您检索的联系人不存在" << endl;
		//	else
		//	{
		//		cout << "您检索的联系人存在" << endl;

		//	}

		//}
			deletPerson(&abs);
			break;
		case 4:
			searchPerson(&abs);
			break;
		case 5:
			changePerson(&abs);
			break;
		case 6:
			cleanPerson(&abs);
			break;
		case 0:

			//2、退出通讯录功能
			cout << "谢谢使用,欢迎下次使用" << endl;
			system("pause");
			return 0;//直接退出程序
		default:
			break;
		}
	}
	system("pause");
	return 0;
}

分文件编写

注意:结构体定义需要在头文件中进行,因此头文件需要配置std

Main.cpp

#include<iostream>
#include<string>
#include"Hanshu.h"
#define MAX 1000
using namespace std;

int main() {

	//创建通讯录的结构体
	TeleBook abs;
	//初始化通讯录的人员个数
	abs.m_Size = 0;

	int select = 0;//用户选择的变量


	//循环让系统进行重新的输入
	while (1) {

		//打印菜单界面
		Menu();
		cin >> select;
		switch (select) {
		case 1:

			//3、添加联系人
			//封装添加通讯录中的联系人的函数,利用指针进行地址传递。
			addPerson(&abs);
			break;
		case 2:
			showPerson(&abs);
			break;
		case 3:
			//{
			//	string name;
			//	cout << "请输入需要检索的联系人姓名:" << endl;
			//	cin >> name;
			//	int a=checkPerson(&abs,name);

			//	if(a==-1)
			//		cout << "您检索的联系人不存在" << endl;
			//	else
			//	{
			//		cout << "您检索的联系人存在" << endl;

			//	}

			//}
			deletPerson(&abs);
			break;
		case 4:
			searchPerson(&abs);
			break;
		case 5:
			changePerson(&abs);
			break;
		case 6:
			cleanPerson(&abs);
			break;
		case 0:

			//2、退出通讯录功能
			cout << "谢谢使用,欢迎下次使用" << endl;
			system("pause");
			return 0;//直接退出程序
		default:
			break;
		}

	}
	system("pause");
	return 0;
}

Hanshu.h

#pragma once
#include<string>
using namespace std;
#define MAX 1000
struct Person {
	string m_name;
	int m_Sex;//1男,2女
	int m_Age;
	string m_phone;
	string m_Addr;
};
struct TeleBook
{
	//通讯录中的联系人数组
	Person Array[MAX];

	//记录联系人个数
	int m_Size;

};
//封装菜单函数在里面 void Menu()
//1、在主函数调用菜单显示
void Menu();
//struct Person;
//struct TeleBook;
void addPerson(TeleBook *a);
void showPerson(TeleBook*a);
//检测联系人是否存在的函数
int checkPerson(TeleBook*a, string name);
//删除联系人
void deletPerson(TeleBook*a);
//查询联系人
void searchPerson(TeleBook*a);
void changePerson(TeleBook*a);
//清空所有的联系人
void cleanPerson(TeleBook*a);

Hanshu.cpp

#include<iostream>
#include<string>
#include"Hanshu.h"
#define MAX 1000
using namespace std;

//封装菜单函数在里面 void Menu()
//1、在主函数调用菜单显示
void Menu() {
	cout << "***************************" << endl;
	cout << "****** 1、添加联系人 ******" << endl;
	cout << "****** 2、显示联系人 ******" << endl;
	cout << "****** 3、删除联系人 ******" << endl;
	cout << "****** 4、查找联系人 ******" << endl;
	cout << "****** 5、修改联系人 ******" << endl;
	cout << "****** 6、清空联系人 ******" << endl;
	cout << "****** 0、退出通讯录 ******" << endl;
	cout << "***************************" << endl;
}
//创建指针指向实例化的通讯录的结构体
void addPerson(TeleBook *a) {
	//判断通讯录是否是满的
	if (a->m_Size == MAX) {
		cout << "通讯录已经满了,无法添加" << endl;

	}
	else {
		string name;
		cout << "请输入你的名字" << endl;
		cin >> name;
		a->Array[a->m_Size].m_name = name;
		cout << "请输入你的性别" << endl;
		cout << "1--男" << endl;
		cout << "2--女" << endl;
		int sex = 0;
		while (1) {
			cin >> sex;
			if (sex == 1 || sex == 2) {
				a->Array[a->m_Size].m_Sex = sex;
				break;
			}
			cout << "输入错误,请重新输入" << endl;
		}
		cout << "请输入你的年龄" << endl;
		cin >> a->Array[a->m_Size].m_Age;
		cout << "请输入你的电话" << endl;
		cin >> a->Array[a->m_Size].m_phone;
		cout << "请输入你的家庭住址" << endl;
		cin >> a->Array[a->m_Size]. m_Addr;
		a->m_Size++;
		cout << "添加成功"<<endl;
		cout << "现在联系人个数" << a->m_Size << endl;

		system("pause");//按下任意键继续
		system("cls");//清屏处理
	}
}
void showPerson(TeleBook*a) {
	cout << " 现存联系人个数:" << a->m_Size << endl;
	if (a->m_Size == 0)
		cout << "当前的人数为空" << endl;
	else {
		for (int i = 0; i < a->m_Size; i++)
		{
			cout
				<< " 编号:" << i
				<< " 姓名:" << a->Array[i].m_name
				<< " 性别: " << (a->Array[i].m_Sex==1?"男":"女")
				<< " 年龄:" << a->Array[i].m_Age
				<< " 电话:" << a->Array[i].m_phone
				<< " 家庭住址:" << a->Array[i].m_Addr
				<< endl;

		}

		system("pause");
		system("cls");
	}
}

//检测联系人是否存在的函数
int checkPerson(TeleBook*a,string name) {
	
	for (int i = 0; i <= a->m_Size; i++)
	{
		if (a->Array[i].m_name == name) 
			return i;
		else		
			return -1;
	}
}

//删除联系人
void deletPerson(TeleBook*a) {
	cout << "请输入需要的联系人姓名:" << endl;
	string name;
	cin >> name;
	//判断联系人是否在通讯录中
	int ret = checkPerson(a, name);
	if (ret != -1)//找到了联系人
	{
		int num1;
		cout << "您确定要删除吗" << endl;
		cout << "1--删除" << endl;
		cout << "2--不删除" << endl;
		cin >> num1;
		if (num1 == 1) 
		//将删除项目的数据后的前移进行数据的覆盖,达到删除的目的
		{
			for (int i = ret; i <a->m_Size ; i++)
			//这个是循环的次数是i<最后一个数据
			{
				a->Array[i] = a->Array[i + 1];
			}
			a->m_Size--;
		}
	}
	else
		cout << "查无此人" << endl;
	system("pause");
	system("cls");
}

//查询联系人
void searchPerson(TeleBook*a) {
	cout << "请输入需要查找的联系人姓名:" << endl;
	string name;
	cin >> name;
	//判断联系人是否在通讯录中
	int ret = checkPerson(a, name);
	if (ret != -1)//找到了联系人
	{
		cout << "姓名:" << a->Array[ret].m_name << "\t";
		cout << "性别:" << a->Array[ret].m_Sex << "\t";
		cout << "年龄:" << a->Array[ret].m_Age << "\t";
		cout << "电话:" << a->Array[ret].m_phone << "\t";
		cout << "地址:" << a->Array[ret].m_Addr << endl;
	}
	else
		cout << "查无此人" << endl;
	system("pause");
	system("cls");
}
void changePerson(TeleBook*a) {
	cout << "请输入需要修改的联系人姓名:" << endl;
	string name;
	cin >> name;
	//判断联系人是否在通讯录中
	int ret = checkPerson(a, name);
	if (ret != -1)//找到了联系人
	{
		int num2;
		cout << "姓名:" << a->Array[ret].m_name << "\t";
		cout << "性别:" << a->Array[ret].m_Sex << "\t";
		cout << "年龄:" << a->Array[ret].m_Age << "\t";
		cout << "电话:" << a->Array[ret].m_phone << "\t";
		cout << "地址:" << a->Array[ret].m_Addr << endl;
		cout << "1--修改姓名" << "\t";
		cout << "2--修改性别" << "\t";
		cout << "3--修改年龄" << "\t";
		cout << "4--修改电话" << "\t";
		cout << "5--修改地址" << endl;
		cin >> num2;
		switch (num2) {
		case 1: {
			string name;
			cout << "请输入你的名字" << endl;
			cin >> name;
			a->Array[ret].m_name = name;
			break;
		}
		case 2: {
			cout << "请输入你的性别" << endl;
			cout << "1--男" << endl;
			cout << "2--女" << endl;
			int sex = 0;
			while (1) {
				cin >> sex;
				if (sex == 1 || sex == 2) {
					a->Array[ret].m_Sex = sex;
					break;
				}
				cout << "输入错误,请重新输入" << endl;
			}
			break;
		}
		case 3: {
			cout << "请输入你的年龄" << endl;
			cin >> a->Array[ret].m_Age;
			break;
		}
		case 4: {
			cout << "请输入你的电话" << endl;
			cin >> a->Array[ret].m_phone;
			break;
		}
		case 5: {
			cout << "请输入你的家庭住址" << endl;
			cin >> a->Array[ret].m_Addr;

			break;
		}
		}

	}
	else
		cout << "查无此人" << endl;
	system("pause");
	system("cls");
}

//清空所有的联系人
void cleanPerson(TeleBook*a) {
	int num1;
	cout << "您确定要清空吗" << endl;
	cout << "1--清空" << endl;
	cout << "2--不清空" << endl;
	cin >> num1;
	if (num1 == 1)
	{
		a->m_Size = 0;//人数为0,逻辑清空
		cout << "通讯录为空" << endl;
	}
	system("pause");
	system("cls");
}

部分代码实现

函数实现

#include<iostream>
using namespace std;
//加法函数
int add(int a, int b);
int main2() {
	system("pause");
	printf("%d", add(1, 2));
	return 0;
}
int add(int a, int b) {
	return a + b;
}

数组

#include<iostream>
using namespace std;
int main3() {
	int a[10];
	for (int j = 0; j < 10; j++)
	{
		for (int i = 0; i < j; i++)
		{
			printf("*");
		}
		printf("\n");
	}
	return 0;
	system("pause");
}

数组——冒泡排序

#include<iostream>
using namespace std;
int main4() {
	int arr[5] = {11,22,55,47,66};
	for (int i = 0; i < 5; i++)
	{
		int j = i;
		if (i == 4) {
			while (arr[j] > arr[j + 1])
			{
				int a;
				a = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = a;
				j++;
				if (j > 5)
					break;
			}
		}
		else
			break;
	}
	for (int i = 0; i < 5; i++)
	{
		printf("%d\n", arr[i]);
	}

	return 0;
	system("pause");

}

二维数组

#include<iostream>
using namespace std;
int main5() {
	//二维数组的定义和遍历
	int a[3][4] = { {1,1,1,1},{2,2,2,2},{3,3,3,3} };
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 4; j++)
		{
			cout << a[i][j] << " ";
			
		}
		cout << endl;
	}
	return 0;
	system("pause");
}

指针

#include<iostream>
using namespace std;
int main7() {
	//指针访问内存指针是一个地址
	int a=10;
	//定义指针变量
	int*p=&a;
	//建立指针和变量的关系
	//p = &a;
	//指针就是用来存储变量的地址的
	cout << &a << endl;
	cout <<  p << endl;
	//解引用的方式找到指针所指代的内容
	cout << *p << endl;
	cout <<  a << endl;

	
	return 0;
	system("pause");
}

空指针和野指针

#include<iostream>
using namespace std;
int main() {

	//空指针,用于指针变量的初始化,空指针是无法访问的,
	int*p = NULL;

	//野指针指向非法的空间,访问权限无法申请
	int*q =(int*)0x100;
	cout << p << endl;
	cout << q << endl;
	system("pause");
	return 0;
}
//空指针和野指针不是我们申请的空间,不可以访问

const修饰指针

#include<iostream>
using namespace std;
int main10() {

	//const修饰指针——常量指针  
	int a = 10;
	int b = 10;
	const int*p = &a;
	cout << *p << endl;//指针指向可以修改,指针指向的数值不可以更改
	p = &b;//修改指针指向
//	*p = 30;//会报错


	//修饰指针常量
	int *const q = &b;
//	p = &b;//指针指向不可以修改
	*q = 30;//指针的数值可以更改
	cout << *q << endl;

	//修饰两者,则两者都不可以再次修改
	const int const*r = &a;//这个指针的a的数值和指向都不可以修改

	system("pause");
	return 0;
}

指针访问数组元素

#include<iostream>
using namespace std;

//冒泡排序 数组首地址和数组长度
void bubblsSort(int *a,int len) {
	for (int i = 0; i < len - 1; i++) {
		for (int j = i; j < len - 1; j++) {
			if (a[j] > a[j + 1]) {
				int temp = a[j];
				a[j] = a[j + 1];
				a[j + 1] = temp;
			}
		}
	}
}

//打印数组
void printA(int *a, int le) {
	for (int i = 0; i < le; i++)
	{
		cout << a[i] << endl;
	}
}
int main13() {
	//数组升序排列,升序排序,利用函数的算法

	//1、创建一个数组
	int a[10] = { 11,55,44,77,88,99,66,33,21,45 };
	//数组长度的定义
	int length = sizeof(a) / sizeof(a[0]);
	//2、创建一个函数,实现冒泡排序
	bubblsSort(a,length);
	//3、打印排序后的数组
	printA(a, length);

	
	
	

	system("pause");

	return 0;
}

结构体


#include<iostream>
#include<string>
using namespace std;
//结构体就是类似于class,自定义的数据类型


//创建学生的数据类型,struct定义的时候不可以省略
struct student
{
	//成员列表
	string name;
	int age;
	int score;
}s3;


int main14() {

	//创建具体学生

	//1、先定义后赋值
	struct student s1;
	s1.name = "张三";
	s1.age = 13;
	s1.score = 99;
	cout << s1.name << s1.age << s1.score << endl;//引入string的头文件进行处理
	//2、定义的时候同时赋值
	struct student s2= {"李四",13,88};
	//3、定义过程中创建结构体变量
	s3.name = "王五";

	system("pause");
	return 0;
}

//定义不可以省略sturct,在创建具体的对象可以省略,利用.访问成员属性

结构体数组

#include<iostream>
using namespace std;
#include<string>
struct Student
{
	string name;
	int age;
	int score;
};
int main15() {

	Student group[3] = {
		{"张三",13,88},
		{"李四",13,88},
		{"王五",13,88},
	};
	for (int i = 0; i < 3; i++) {
		cout << group[i].name << endl;
	}
	group[2].age = 99;
	cout << group[2].age << endl;
	system("pause");
	return 0;
}

结构体指针

#include<iostream>
using namespace std;
#include<string>
struct Student
{
	string name;
	int age;
	int score;
};
int main16() {

	Student group[3] = {
		{"张三",13,88},
		{"李四",13,88},
		{"王五",13,88},
	};
	Student*p = &group[0];//结构体指针的定义
	cout<<p->age<<endl;//使用->访问结构体中的成员属性
	system("pause");
	return 0;
}

结构体嵌套结构

#include<iostream>
using namespace std;
#include<string>
struct student
{
	string name;
	int age;
	int score;
}; //顺序很重要
struct teacher
{
	string name;
	int age;
	int money;
	struct student stu;
};

int main17() {
	teacher s1 = { "张三",44,3000 };
	s1.stu={ "小张三",18,99 };
	system("pause");
	return 0;
}

结构体作为函数的参数

#include<iostream>
using namespace std;
#include<string>
struct student
{
	string name;
	int age;
	int score;
}; //顺序很重要

//值传递
void printStudent(student a) {
	cout << a.name << endl;
	cout << a.age << endl;
	cout << a.score << endl;

}

//地址传递
void printStudent2(student*b) {
	
	cout << b->name << endl;
	cout << b->age<< endl;
	cout << b->score<< endl;

}
int main18() {
	student s1 = { "张三",18,60 };
	printStudent(s1);
	printStudent2(&s1);
	system("pause");
	return 0;
}

结构体中const的使用

#include<iostream>
using namespace std;
#include<string>
struct student
{
	string name;
	int age;
	int score;
}; //顺序很重要

//值传递,占用的空间很大
void printStudent3(const student a) {
	cout << a.name << endl;
	cout << a.age << endl;
	cout << a.score << endl;

}

//地址传递,指针的内存,节省内存,不会复制新的数据
void printStudent2(const student*b) {

	cout << b->name << endl;
	cout << b->age << endl;
	cout << b->score << endl;
	//b->age = 150;

	//数据更加的安全,不发被重新改变
	cout << b->age << endl;
}
int main19() {
	const student s1 = { "张三",18,60 };
	printStudent3(s1);
	printStudent2(&s1);
	system("pause");
	return 0;
}

结构体案例一

#include<iostream>
using namespace std;
#include<string>
#include<ctime>

/*
	案例:
	三个老师,每个老师有五个学生,
	这三个老师和五个学生和五个学生的成绩打印出来,
	打印一个表格把所有人都人信息展示出来

*/
struct Student
{
	string name;
	int age;
	int score;
}; //顺序很重要

struct Teacher
{
	string name;
	struct Student stu[5];
};

//创建函数储存老师的信息
void LocateSpace(struct Teacher arr[],int length) {
	string nameSeed = "ABCDE";
	for (int i = 0; i < length; i++)
	{
		arr[i].name = "Teacher_";
		arr[i].name = arr[i].name + nameSeed[i];

		//循环给学生们进行赋值操作
		for (int j = 0; j < 5; j++)
		{
			
			
			int random = rand() % 61 + 40;
			arr[i].stu[j].name = "Student_";
			arr[i].stu[j].name = arr[i].stu[j].name + nameSeed[j];

			arr[i].stu[j].score = random;
		}
	}
}
void printMessage(Teacher a[], int length) {
	for (int i = 0; i < length; i++)
	{
		cout << "老师是: " << a[i].name << endl;
		for (int j = 0; j < 5; j++)
		{
			cout << "\t学生是: " << a[i].stu[j].name << " 分数是: " << a[i].stu[j].score << endl;
		}
	}
}
int main20() {
	srand((unsigned int)time(NULL));//随机数种子,在主函数中
	//创建3名老师的数组
	Teacher arr[3];
	int length = sizeof(arr) / sizeof(arr[0]);

	//通过函数给3名老师的信息赋值,而且给五个学生赋值
	LocateSpace(arr, length);

	//打印老师和所有学生的信息
	printMessage(arr,length);
	system("pause");
	return 0;
}

结构体案例二

#include<iostream>
using namespace std;
#include<string>
struct hero
{
	string name;
	int age;
	
}; //顺序很重要

void paixu(struct hero a[], int len) {
	for (int i = 0; i < len-1; i++)
	{
		for (int j = 0; j < len-i-1; j++)//这个需要是0,第二轮排序时候必要从这个开始
		{
			if (a[j].age > a[j + 1].age) {
				hero s1 = a[j];
				a[j] = a[j + 1];
				a[j + 1] = s1;
			}
			
		}
	}
}
void printInfo(struct hero a[], int len) {
	for (int i = 0; i < len; i++)
	{
		cout << "英雄名称:" << a[i].name << " 年龄:" << a[i].age << endl;

	}
}

int main22() {
	hero body[5] = {
		{"刘备",18},
		{"关羽",12},
		{"赵云",15},
		{"吕布",10},
		{"貂蝉",16},
	};
	int length = sizeof(body) /sizeof (body[0]);
	paixu(body, length);
	printInfo(body, length);

	system("pause");
	return 0;
}

posted @ 2021-11-21 13:23  何夕_DL  阅读(277)  评论(0)    收藏  举报