C++进阶复习

news2024/9/23 7:25:20

1 指针

作用:通过指针间接访问内存
1.内存编号是从0开始记录的,一般用十六进制数字表示。
2.可以利用指针变量保存地址。

1.1 指针变量的定义和使用

语法:数据类型 *变量名。如int *a;

#include<iostream>
using namespace std;

int main(){
	
	int a = 1;
	//创建指针变量 
	int *p; 
	//让指针记录变量a的地址
	p = &a;
	cout<<"a的地址:"<< &a <<"-" << p <<endl;
	
	//通过解引用找到指针所指内存的数据
	//指针前加 * 代表解引用, 找到指针所指内存的数据
	*p = 10000;
	// 均输出10000 
	cout<< "a= "<< a <<endl;
	cout<< "a= "<< *p <<endl;
	return 0;
} 

1.2 指针所占内存空间

指针也是种数据类型,32位操作系统下:占4个字节,64位下占8个字节。

#include<iostream>
using namespace std;

int main(){
	
	//指针所占内存空间
	int a = 10;
	
	int *p = &a;
	//32位下都是占4个字节 
	cout<<"sizeof (int*) = "<<sizeof(int *)<<endl;
	cout<<"sizeof (float*) = "<<sizeof(float *)<<endl;
	cout<<"sizeof (double*) = "<<sizeof(double *)<<endl;
	cout<<"sizeof (char*) = "<<sizeof(char *)<<endl;
	
	return 0;
} 

1.3 空指针和野指针

空指针:指针变量指向内存中编号位0的空间
作用:初始化指针变量。空指针指向的内存不可以访问。

#include<iostream>
using namespace std;
int main(){
	//空指针,默认指向内存地址编号为0的空间 
	int *p = NULL;
	//*p = 100 // 错误,因为0 - 255之间内存是 系统占用内存,不允许用户访问。 
	return 0;
} 

野指针:指针变量指向非法的内存空间。

#include<iostream>
using namespace std;
int main(){
	//野指针,
	int *p = (int)0x1100;
	//报访问权限错误 
	cout<<*p<<endl;
	return 0;
} 

空指针和野指针都不是用户申请的空间,不能访问。

1.4 const修饰指针

const修饰指针有三种情况:

  1. const修饰指针 - 常量指针
  2. const修饰常量 - 指针常量
  3. const即修饰指针,又修饰常量
//根据 * 和 const位置记录。
1.常量指针:指针的指向可以修改,但是指针指向的值不可以修改
	int a = 10;
	int b = 30;
	// const先修饰的 *,因此指针的指向值不可改,即*p不可改
	const int *p = &a;
	*p = 20; //错误,指针指向的值不可修改
	*p = &b;//正确
2.指针常量:指针的指向不可以修改,但是指针指向的值可以修改
	int a=10,b=20;
	// const 修饰的是 p,因此指针的地址不能改,所以指向不能改
	int *const p = &a;
	*p = 20; //正确,指针指向的值可以修改
	*p = &b;//错误,指针的指向不可以修改
3.修饰指针:指针的指向不可以修改,指针指向的值不可以修改
	int a=10,b=20;
	const int *const p = &a;
	*p = 20; //错误,指针指向的值不可以修改
	*p = &b;//错误,指针的指向不可以修改

1.5 指针和数组

作用:利用指针访问数组中元素

#include<iostream>
using namespace std;
int main(){
	
	int arr[5] = {1,2,3,4,5};
	//p 指向 arr首地址 
	int *p = arr;
	//输出1 
	cout<<*p<<endl;
	//输出1 
	cout<<*(p++)<<endl;
	//输出2 
	cout<<*(++p)<<endl;
	return 0;
}   

1.6 指针和函数

作用:利用指针作为函数的参数,可以修改实参的值

#include<iostream>
using namespace std;
void swap(int *a,int *b){
	//*a 解引用,获取a的地址的值 
	int t = *a;
	*a = *b;
	// 将t的值存到b地址
	*b = t;
}
int main(){
	
	int a = 1;
	int b = 2;
	//地址传递,相当于int *a = &a 
	swap(&a,&b);
	//a = 2, b = 1
	cout<<"a:"<<a<<" b:"<<b<<endl;
	return 0;
}   

1.7 指针、数组和函数

案例:封装一个函数,利用冒泡排序,实现对整型数组的升序排序

#include<iostream>
using namespace std;
//指针使用冒泡排序 
void buuble(int *arr,int n){
	for(int i=0;i<n;i++){
		for(int j=0;j<n-i-1;j++){
			if(*(arr+j) > *(arr+j+1)){
				int tmp = *(arr+j);
				*(arr+j) = *(arr+j+1);
				*(arr+j+1) = tmp;
			}
			/*if(arr[j] > arr[j+1]){
				int tmp = arr[j];
				arr[j] = arr[j+1];
				arr[j+1] = tmp;
			}*/
		} 
	}
}
int main(){
	int a[10] = {4,3,1,6,8,83,3,1,8,5};
	int n = sizeof(a) / sizeof(a[0]);
	buuble(a,n);
	for(int i=0;i<n;i++) cout<<a[i]<<" "; 
	return 0;
}   

2 结构体

结构体属于用户自定义的数据类型,允许用户存储不同的数据类型。

语法: struct 结构体名{ 结构体成员列表 };
通过结构体创建变量的方式有三种:
1.struct 结构体名 变量名
2.struct 结构体名 变量名 = {成员1值,成员2值 … }
3.定义结构体适顺便创建变量

#include<iostream>
using namespace std;

//结构体定义-一些类型集合组成的 
struct stu{
	//成员列表
	string name;
	int age;
}s3; //创建方式3:定义结构体时顺便创建结构体变量

int main(){
	
	//创建方式1:struct stu s1。 创建变量时struct 关键词可省略
	struct stu s1;
	s1.name = "王";
	s1.age = 10; 
	cout<<s1.age<<"-"<<s1.name<<endl;
	
	//创建方式2:struct stu s2 = {...} 
	struct stu s2 = {"张",32};
	cout<<s2.age<<"-"<<s2.name<<endl;
	
	s3.age = 23;
	s3.name = "李"; 
	return 0;
}   

2 .1 结构体数组

作用:将自定义的结构体放入数组中方便维护
语法:struct 结构体名 数组名[元素个数] = { {}, {}, {} …}

#include<iostream>
using namespace std;
//结构体定义-一些类型集合组成的 
struct stu{
	//成员列表
	string name;
	int age;
}s3;

int main(){
	//结构体数组
	struct stu arr[3] = {
		{"张",12},
		{"李",42},
		{"王",22},
	}; 
	arr[2].age = 17;
	for(auto s : arr){
		cout<<s.age<<"-"<<s.name<<endl;
	} 
	return 0;
}   

2 .2 结构体指针

作用:通过指针访问结构体中的成员

#include<iostream>
using namespace std;
//结构体定义-一些类型集合组成的 
struct stu{
	//成员列表
	string name;
	int age;
}s3;
int main(){
	//结构体
	struct stu = { {"张",12} }; 
	//指针指向 stu 
	stu *p = &stu;
	cout<<p->age<<"-"<<p->name<<endl;
	return 0;
}   

2 .3 结构体嵌套结构体

作用:结构体中的成员可以是另一个结构体
例如:每个老师辅导一个学员,一个老师的结构体中,记录一个学生的结构体

#include<iostream>
using namespace std;
struct stu{
	string name;
	int age;
};
struct teacher{
	int id,
	string name;
	struct stu s;
};
int main(){
	//结构体嵌套结构体
	teacher t;
	t.id = 1;
	t.name = "王";
	t.s.name = "李";
	t.s.age = 3; 
	return 0;
}   

2.4 结构体做函数参数

作用:将结构体作为参数向函数中传递
传递方式两种:1.值传递 。2.地址传递

#include<iostream>
using namespace std;
struct teacher{
	int id,
	string name;
};
//值传递 
void test1(struct teacher t){
	
} 
//地址传递
 void test2(struct teacher &t){
	
} 
int main(){
	//结构体嵌套结构体
	teacher t;
	t.id = 1;
	t.name = "王";
	
	//值传递 
	test1(t);
	//地址传递 
	test2(&t);
	
	return 0;
}   

2.5 结构体中const使用场景

作用:防止误操作

#include<iostream>
using namespace std;
struct Student{
	int id,
	string name;
};
// 函数中形参改为指针可减少空间,因为指针只占4个字节,存的的地址 
void prints(const Student *s){
	//形参加入const后修改会报错,不加const可修改,此时主函数值也会修改 
	s->id = 4;
	cout<<s->name<<endl;
}
int main(){
	//结构体嵌套结构体
	Student s = {1,"王"};
	prints(&s);
	return 0;
}   

2.6 结构体案例

学校正在做毕设项目,每名老师带领5个学生,总共有3名老师,需求如下设计学生和老师的结构体,其中在老师的结构体中,有老师姓名和一个存放5名学生的数组作为成员学生的成员有姓名、考试分数,创建数组存放3名老师,通过函数给每个老师及所带的学生赋值最终打印出老师数据以及老师所带的学生数据。

#include<iostream>
using namespace std;

struct Student{
	string name;
	int score;
};

struct Teacher{
	string name;
	Student stus[5];
};
//给老师和学生赋值
void init(struct Teacher tArr[],int len){
	string nameS = "ABCDE";
	for(int i=0;i<len;i++){
		tArr[i].name = "教师_"; 
		tArr[i].name += nameS[i];
		//循环给老师下的学生赋值
		for(int j=0;j<5;j++){
			tArr[i].stus[j].name = "学生_";
			tArr[i].stus[j].name += nameS[j];
			tArr[i].stus[j].score = 70;
		} 
	}
} 
void prints(struct Teacher tArr[],int len){
	for(int i=0;i<len;i++){
		cout<<"教师姓名:"<<tArr[i].name<<endl;
		for(int j=0;j<5;j++){
			cout<<"学生:"<<tArr[i].stus[j].name<<"成绩为:"<<tArr[i].stus[j].score<<endl; 
		}
	}
}
int main(){
	
	struct Teacher tArr[3];
	int len = sizeof(tArr) / sizeof(tArr[0]);
	//初始化 
	init(tArr,len);
	//打印
	prints(tArr,len);
	return 0;
}   

3 综合案例-通讯录系统

功能列表
在这里插入图片描述

3.1 添加联系人

在这里插入图片描述

			case 3: //删除 
			//case 中若存在很多行代码,可能会编译错误,因此加入 {},使其变为代码段 
			{
				cout<<"输入要删除的联系人"<<endl; 
				string name;
				cin>>name;
				del(abs,name);
			}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1616542.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

mininet+odl安装

安装环境 ubuntu-18.04.2-desktop-amd64 Java version: 1.8.0_362 Apache Maven 3.6.0 opendaylight: distribution-karaf-0.6.0-Carbon(csdn中应该是已有资源&#xff0c;不让上传) opendaylight的官网下载链接一直打开失败&#xff0c;我使用的是别人的Carbon版本。 在安…

汇编语言作业(三)

目录 一、实验目的 二、实验内容 三、实验步骤以及结果 1、阅读第4页ppt 第一个汇编程序 ex1.asm 并编写编译执行成功后&#xff0c;要求改写&#xff0c;使其输出字符ABC&#xff0c;如下图所示。 &#xff08;1&#xff09;编译产生目标文件 &#xff08;2&#xff09;…

Python-VBA函数之旅-hex函数

目录 一、hex函数常见的应用场景&#xff1a; 二、hex函数使用注意事项&#xff1a; 1、hex函数&#xff1a; 1-1、Python&#xff1a; 1-2、VBA&#xff1a; 2、推荐阅读&#xff1a; 个人主页&#xff1a;神奇夜光杯-CSDN博客 一、hex函数常见的应用场景&#xff1a;…

【STM32+HAL+Proteus】系列学习教程---串口USART(DMA 方式)定长,不定长收发。

实现目标 1、利用UART实现上位机PC与下位机开发板之间的数据通信 2、学会STM32CubeMX软件关于UART的DMA模式配置 3、具体目标&#xff1a;1、实现串口定长收发数据通信&#xff1b;2、串口不定长收发数据通信。 一、DMA简介 1、什么是DMA? DMA&#xff08;Direct Memory …

基于YOLOV5 的ROS2功能包——快速实现目标识别功能

项目链接&#xff1a; yolov5_ros2 运行结果如下&#xff1a;实时显示识别结果 一、下载功能包并运行 1. 安装依赖 首先&#xff0c;确保您已经更新了系统并且安装了必要的依赖。以下是一些安装步骤&#xff0c;其中$ROS_DISTRO 是您的ROS2发行版&#xff08;例如&#xff1…

交通工程绪论

一、交通工程 交通工程学定义交通工程学研究的内容交通工程学的产生与发展交通工程学在道路运输管理中的作用 1. 交通工程学定义 早在20世纪30年代&#xff0c;美国交通工程师协会(American Institute of Traffic Engineers)给交通工程学(Traffic Engineering)下了一个定义&a…

去雾笔记-Pixel Shuffle,逆Pixel Shuffle,棋盘效应,转置卷积

文章目录 1.Pixel Shuffle2.Inverse Pixel Shuffle3.棋盘效应4.转置卷积5.宽激活块6.PSPNet7.反射填充层&#xff08;Reflective Padding Layer&#xff09;8.tanh层 1.Pixel Shuffle Pixel Shuffle是一种用于图像超分辨率的技术&#xff0c;它通过重新排列图像的像素来增加图…

Django模型的属性与方法

本节介绍Django模型的属性和方法&#xff0c;以及如何重写之前定义的模型方法等内容。 3.5.1 模型属性 Django模型中最重要的属性就是Manager&#xff0c;它是Django模型和数据库查询操作之间的接口&#xff0c;并且被用作从数据库当中获取实例的途径。如果Django模型中没有…

python基础知识一(注释、变量以及类型、类型转换)

目录 注释&#xff1a; 注释分为两种&#xff1a; 注释的作用&#xff1a; 注释的使用原则&#xff1a; 编写一段代码&#xff0c;对比一下有无注释的区别&#xff0c;以冒泡排序为例 1. 无注释版&#xff1a; 感官上是不是有点不清晰&#xff1f; 2. 有注释版&#xff1…

绝地求生:【数据流】工资杯决赛,天霸161分夺得冠军,Aixleft战神37杀

数据制作&#xff0c;整理不易&#xff0c;求支持&#xff0c;点赞&#xff0c;收藏&#xff0c;充电哟&#xff01; 如有错误&#xff0c;请在评论区指出&#xff0c;感谢各位~ 积分&#xff1a; 战队数据&#xff1a; 排名前3&#xff1a;Tian(161) / NH(145) / PeRo(137) …

linux入门到精通-第十一章-进程间通信(无名管道)

目录 参考概念**进程通信的目的&#xff1a;**Linux 操作系统支持的主要进程间通信的通信机制: 无名管道概述pipe函数建立无名管道父子进程使用无名管道通信 管道读写特点设置非阻塞的方法查看管道缓冲区命令查看管道缓冲区函数 参考 视频教程 概念 进程是一个独立的资源分配…

Oracle进阶(2)——物化视图案例延伸以及序列、同义词

一、物化视图 物化视图&#xff08;Materialized View&#xff09;是 Oracle 数据库中的一个对象&#xff0c;它是一个预先计算和存储的查询结果集&#xff0c;类似于视图&#xff0c;但与视图不同的是&#xff0c;物化视图会将查询结果保存在物理存储中&#xff0c;而不是动态…

web前端学习笔记1

前端学习笔记 1. 走进HTML 1.1 什么是HTML 超文本标记语言(英语:HyperText Markup Language,简称:HTML)是一种用于创建网页的标准标记语言。您可以使用 HTML 来建立自己的 WEB 站点,HTML 运行在浏览器上,由浏览器来解析。HTML文档的后缀名 .html.htm以上两种后缀名没有区别…

给sample_gpt加上,路的选择

灵感 鲁迅说世界上本没有路走的人多了便有了路 如何将灵感转为数学表达 首先假设a到b点有3条路吧&#xff0c;假设你只能选择一条&#xff0c;那意思就是你在训练的时候&#xff0c;只要这条路的值增大别人就会减少。 那这个思思不就是&#xff0c;3条路的值加在一起有个约束…

VMP加壳工具最新 VMProtect Ultimate v3.8.4 Build1754

网盘下载 VMProtect 软件保护功能 支持的文件和格式 VMProtect 支持32位和64位可执行文件&#xff0c;动态加载库和驱动程序。这包括屏保、Active-X 组件、BPL 库和其他 PE 格式的文件。受保护的文件基本上可在任何版本的 Windows 系统上运行&#xff0c;甚至是较早的 Windows …

仿真数据和实测数据的时频变换

目录 1.仿真数据2.实测数据3.地震信号数据4.语音数据 1.仿真数据 2.实测数据 3.地震信号数据 4.语音数据

springboot整合mybatis-puls登陆注册

目录 创建springboot项目 目录结构&#xff1a; 启动类 测试类 idea建表 pom文件 编写yml文件 qq邮箱设置 登陆注册代码 编写持久层(Dao) 注册代码 业务层 业务实现类 mapper 控制层 前端代码 注册页面 邮件正文&#xff1a; 登录代码 控制层 业务层&#…

力扣HOT100 - 101. 对称二叉树

解题思路&#xff1a; class Solution {public boolean isSymmetric(TreeNode root) {if(root null) return true;return recur(root.left, root.right);}boolean recur(TreeNode L, TreeNode R) {if (L null && R null) return true;if (L null || R null || L.…

【数学】深度学习中的概率基础知识记录

基于 Deep Learning (2017, MIT) 书总结了必要的概率知识 原blog 以及用到的Ipython notebook 文章目录 1 概述2 知识2.1 离散变量和概率质量函数&#xff08;PMF&#xff09;2.2 连续变量和概率密度函数&#xff08;PDF&#xff09;2.3 边缘概率2.4 条件概率2.5 条件概率的链式…

项目实战 | 责任链模式 (下)

案例二&#xff1a;工作流&#xff0c;费用报销审核流程 同事小贾最近刚出差回来&#xff0c;她迫不及待的就提交了费用报销的流程。根据金额不同&#xff0c;分为以下几种审核流程。报销金额低于1000元&#xff0c;三级部门管理者审批即可&#xff0c;1000到5000元除了三级部…