C++知识点笔记

news2024/12/26 4:35:11

二维数组

定义方式

1、数据类型 数组名[行数][列数];

2、数据类型 数组名[行数][列数]={{数据1,数据2},{数据3,数据4}};

3、数据类型 数组名[行数][列数]={数据1,数据2,数据3,数据4};

4、数据类型 数组名[][列数]={数据1,数据2,数据3,数据4};

建议:以上4种定义方式,利用第二种更加直观,提高代码的可读性

int main0() {

	//方式1
	//数据类型 数组名[行数][列数];
	int arr[2][3];
	arr[0][0] = 1;
	arr[0][1] = 1;
	arr[0][2] = 1;
	arr[1][0] = 1;
	arr[1][1] = 1;
	arr[1][2] = 1;

	for (int i = 0; i < 2; i++) {
		for (int j = 0; j < 3; j++) {
			cout << arr[i][j] << " ";
		}
		cout << endl;
	}


	//推荐!更直观可读性强
	//方式2
	//数据类型 数组名[行数][列数]={{数据1,数据2},{数据3,数据4}};
	int arr2[2][3] =
	{
		{1,2,3},
		{4,5,6}
	};

	//方式3
	//数据类型 数组名[行数][列数]={数据1,数据2,数据3,数据4};
	int arr3[2][3] = { 1,2,3,4,5,6 };

	//方式4 
	//数据类型 数组名[][列数]={数据1,数据2,数据3,数据4};
	int arr4[][3] = { 1,2,3,4,5,6 };


	system("pause");
	return 0;
}

二维数组数组名

  • 查看二维数组所占内存空间

  • 获取二维数组首地址

int main0() {
	//二维数组名称用途

	//1.可以查看占用内存空间大小
	int arr[2][3] =
	{
		{1,2,3},
		{4,5,6}
	};
	cout << "二维数组所占内存空间为:" << sizeof(arr) << endl;//24  4*6
	cout << "二维数组第一行所占内存空间为:" << sizeof(arr[0]) << endl;//12  4*3
	cout << "二维数组第一个元素所占内存空间为:" << sizeof(arr[0][0]) << endl;//4 
	
	cout << "二维数组的行数为" << sizeof(arr) / sizeof(arr[0]) << endl;//2
	cout << "二维数组的列数为" << sizeof(arr[0]) / sizeof(arr[0][0]) << endl;//3

	//2.可以查看二维数组的首地址

	cout << "二维数组的首地址为" << arr << endl;
	cout << "二维数组的第一行首地址为" << (int)arr[0] << endl;
	cout << "二维数组的第二行首地址为" << (int)arr[1] << endl;

	cout << "二维数组的第一个元素首地址为" << (int)&arr[0][0] << endl;
	cout << "二维数组的第二个元素首地址为" << (int)&arr[0][4] << endl;


	system("pause");
	return 0;
}
/*考试成绩统计
* 有三名同学(张三,李四,王五),在一次考试中的成绩分别如下表,请分别输出三名同学的总成绩
*				语文		数学		英语
*	张三		100			100			100
*	李四		90			50			100
*	王五		60			70			80
* 
* 
* 1.创建二维数组:3行3列
* 2.统计考试成绩:让每行的三列相加求和
*
*/
int main() {

	int arr[3][3] =
	{
		{100,100,100},
		{90,50,100},
		{60,70,80}
	};
	int sum = 0;

	string names[3] = { "张三","李四","王五" };

	for (int i = 0; i < 3; i++) {
		for (int j = 0; j < 3; j++) {
			sum += arr[i][j];
		}
		cout << names[i]<<"总分为"<<sum << endl;
		sum = 0;
	}


	system("pause");
	return 0;
}

函数

作用:将一段经常使用的代码封装起来,减少重复代码

一个较大的程序,一般分为若干个程序块,每个模块实现特定的功能

函数的定义

1.返回值类型

2.函数名

3.参数列表

4.函数体语句

5,return表达式

语法:

返回值类型 函数名 (参数列表)

{

函数体语句

return表达式

}

在这里插入图片描述在这里插入图片描述

函数的调用

功能:使用定义好的函数

语法:函数名 (参数)

//函数定义
int add(int num1, int num2)//定义中num1,num2称为形式参数,简称形参
{
	int sum = num1 + num2;
	return sum;
}
int main() {

	int a = 10;
	int b = 10;
	//调用add函数
	int sum = add(a, b);//调用时的a,b称为实际参数,简称实参
	cout << "sum=" << sum << endl;



	a = 100;
	b = 100;

	int sum2 = add(a, b);
	cout << "sum2=" << sum2 << endl;

	system("pause");
	return 0;
}

值传递

  • 函数调用时实参将数值传给形参

  • 值传递时,如果形参发生变化,不会影响实参
    在这里插入图片描述

//定义函数,实现两个数字进行交换函数

//如果函数不需要返回值,声明的时候返回值写void
void swap(int num1, int num2) {
	cout << "交换前:" << endl;
	cout << "num1=" << num1 << endl;
	cout << "num2=" << num2 << endl;

	int temp = num1;
	num1 = num2;
	num2 = temp;

	cout << "交换后:" << endl;
	cout << "num1=" << num1 << endl;
	cout << "num2=" << num2 << endl;

	//return; 当函数声明的时候,不需要返回值,可以不写reurn
}

int main() {
	int a = 10;
	int b = 20;

	cout << "a=" << a << endl;
	cout << "b=" << b << endl;

	//值传递时,函数的形参发生改变,并不会影响实参

	swap(a, b);

	cout << "a=" << a << endl;
	cout << "b=" <<b<< endl;
	


	system("pause");
	return 0;
}

函数的常见样式

1.无参无返

2.有参无返

3.无参有返

4.有参有返

函数的声明

作用:告诉编译器函数名称及如何调用函数。函数的实际主体可以单独定义

  • 函数的声明可以多次,但函数的定义只有一次,一般声明也只写一次

函数的分文件编写

作用:让代码结构更加清晰

函数分文件编写一般有4个步骤

1.创建后缀名为.h的头文件

2.创建后缀名为.cpp的源文件

3.在头文件中写函数的声明

4.在源文件中写函数的定义

#include<iostream>
using namespace std;
//函数的声明
void swap(int a, int b);
#include "swap.h"


//函数的定义
void swap(int num1, int num2) {

	int temp = num1;
	num1 = num2;
	num2 = temp;

	cout << "num1=" << num1 << endl;
	cout << "num2=" << num2 << endl;

}
#include<iostream>
using namespace std;
#include "swap.h"

//函数的声明
//void swap(int a, int b);

//函数的定义
//void swap(int num1, int num2) {
//
//	int temp = num1;
//	num1 = num2;
//	num2 = temp;
//
//	cout << "num1=" << num1 << endl;
//	cout << "num2=" << num2 << endl;
//
//}


//1.创建后缀名为.h的头文件

//2.创建后缀名为.cpp的源文件

//3.在头文件中写函数的声明

//4.在源文件中写函数的定义


int main() {
	int a = 10;
	int b = 20;

	cout << "a=" << a << endl;
	cout << "b=" << b << endl;

	//值传递时,函数的形参发生改变,并不会影响实参

	swap(a, b);

	cout << "a=" << a << endl;
	cout << "b=" << b << endl;



	system("pause");
	return 0;
}

指针

指针的作用:可以通过指针简介访问内存

  • 内存编号是从0开始记录的,一般用十六进制数字表示

  • 可以利用指针变量保存地址

指针变量定义和使用

指针变量定义语法:数据类型*变量名;

int main() {

	//1.定义指针
	int a = 10;
	//指针定义的语法:数据类型 * 指针变量名
	int * p;
	//让指针记录变量a的地址
	p = &a;
	cout << "a的地址为:" << &a << endl;
	cout << "指针p=" << p << endl;
	cout << "*p=" << *p << endl;//10
	
	//2.使用指针
	//可以通过解引用的方式来找到指针指向的内存
	//指针前加 * 代表解引用找到指针指向的内存中的数据
	*p = 1000;
	cout << "a=" << a << endl;//1000
	cout << "*p=" << *p << endl;//1000

	system("pause");
	return 0;
}

指针所占内存空间

在32为操作系统下:占用4个字节空间,64位下占8个字节。

int main() {

	//指针所占内存空间
	int a = 10;
	//int * p;
	//p = &a;

	int* p = &a;

	cout << "sizeof(int*) =" << sizeof(p) << endl;//8
	cout << "sizeof(float*) =" << sizeof(float *) << endl;//8
	cout << "sizeof(double*) =" << sizeof(double *) << endl;//8
	cout << "sizeof(char*) =" << sizeof(char *) << endl;//8

	system("pause");
	return 0;
}

空指针和野指针

空指针:指针变量指向内存中编号为0的空间

用途:初始化指针变量

注意:空指针指向的内存是不可以访问的

int main() {

	//空指针
	//1.空指针用于给指针变量进行初始化
	int* p = NULL;

	//2.空指针是不可以进行访问的
	//0~255之间的内存编号是系统占用的因此不可以访问
	//cout << *p << endl;报错
	//*p = 100;报错


	system("pause");
	return 0;
}

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

const修饰指针

const修饰指针 — 常量指针:指针的指向可以修改,但是指针指向的值不可以改

const int * p = &a;

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

const修饰常量 — 指针常量:指针的指向不可以改,但是指针指向的值可以改

int * const p2 = &a;

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

const既修饰指针,又修饰常量:指针的指向和指针指向的值都不可以改

const int * const p3 = &a;

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

指针和数组

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

int main() {

	//指针和数组
	//利用指针访问数组中的元素

	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };

	cout << "第一个元素为:" << arr[0] << endl;

	int* p = arr;//arr就是数组首地址

	cout << "利用指针访问第一个元素:" << *p << endl;

	p++;//让指针向后偏移4个字节

	cout << "利用指针访问第二个元素:" << *p << endl;

	cout << "利用指针遍历数组" << endl;

	int* p2 = arr;

	for (int i = 0; i < 10; i++) {
		//cout<<arr[i]<<endl
		cout << *p2 << endl;
		p2++;
	}

	system("pause");
	return 0;

指针和函数

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

如果不想修改实参,就用值传递,如果想修改实参,就用地址传递

//实现两个数字进行交换
void swap01(int num1, int num2) {
	

	int temp = num1;
	num1 = num2;
	num2 = temp;

	cout << "交换后:" << endl;
	cout << "num1=" << num1 << endl;
	cout << "num2=" << num2 << endl;
} 

void swap02(int* p1, int* p2) {
	int temp = *p1;
	*p1 = *p2;
	*p2 = temp;
}

int main() {

	//指针和函数
	
	//1.值传递

	int a = 10;
	int b = 20;
	//swap01(a, b);//值传递不会改变实参

	

	//2.地址传递
	//如果是地址传递,可以改变实参
	swap02(&a, &b);


	cout << "a=" << a << endl;
	cout << "b=" << b << endl;

	system("pause");
	return 0;
}

指针、数组、函数

#include<iostream>
using namespace std;

/*
* 封装一个函数,利用冒泡排序,实现对整型数组的升序排序
* 例如数组:int arr[10] = {4,3,6,9,1,2,10,8,7,5};
* 
*/
		//	参数1 数组的首地址  参数2 数组长度
void bubbleSort(int * arr, int len) {//int * arr 也可以写为int arr[]
	for (int i = 0; i < len - 1; i++) {
		for (int j = 0; j < len - 1 - i; j++) {
			//如果j>j+1的值 交换数字
			if (arr[j] > arr[j + 1]) {
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}

}

//打印数组
void printArray(int * arr, int len) {
	for (int i = 0; i < len; i++){
		cout<<arr[i]<<endl;
	}
}

int main() {
	//1.创建数组
	//2.创建函数,实现冒泡排序
	//3.打印排序后的数组


	//1.创建数组
	int arr[10] = { 4,3,6,9,1,2,10,8,7,5 };
	//数组长度
	int len = sizeof(arr) / sizeof(arr[0]);
	// 2.创建函数,实现冒泡排序
	bubbleSort(arr, len);
	//3.打印排序后的数组
	printArray(arr, len);

	system("pause");
	return 0;
}

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

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

相关文章

在人工智能时代,如何利用AI达到行业领先地位?

人工智能很快将成为企业开展业务的一个必要环节。各企业都会具备AI战略&#xff0c;就像其具有社交媒体战略、品牌战略和人才战略等一样。 因此&#xff0c;如果企业希望在竞争中脱颖而出、获得优势&#xff0c;不能只是使用AI&#xff0c;而是要以AI为先导&#xff0c;创造行业…

OpenHarmony—类型转换仅支持as T语法

规则&#xff1a;arkts-as-casts 级别&#xff1a;错误 在ArkTS中&#xff0c;as关键字是类型转换的唯一语法&#xff0c;错误的类型转换会导致编译时错误或者运行时抛出ClassCastException异常。ArkTS不支持使用语法进行类型转换。 当需要将primitive类型&#xff08;如num…

持续集成工具Jenkins的使用之配置篇(二)

上一篇 &#xff1a;持续集成工具Jenkins的安装配置之安装篇(一)-CSDN博客 接上文 三.Jenkins配置 Jenkins配置主要是针对创建构建任务前做的一些基本配置&#xff0c;这些配置有些是必须的&#xff0c;有些是可以帮我们提高效率的&#xff0c;总之都是Jenkins管理员都要会的…

CHS_06.2.2.4_2+调度算法:时间片轮转、优先级、多级反馈队列

CHS_06.2.2.4_2调度算法&#xff1a;时间片轮转、优先级、多级反馈队列 知识总览时间片轮转&#xff08;RR, Round-Robin&#xff09;例题例题时间片轮转&#xff08;RR, Round-Robin&#xff09;优先级调度算法例题优先级调度算法思考多级反馈队列调度算法多级反馈队列调度算法…

【算法练习】leetcode算法题合集之动态规划篇

普通动规系列 LeetCode343. 整数拆分 LeetCode343. 整数拆分 将10的结果存在索引为10的位置上&#xff0c;需要保证数组长度是n1&#xff0c;索引的最大值是n&#xff0c;索引是从0开始的。 n的拆分&#xff0c;可以拆分为i和n-i&#xff0c;当然i可以继续拆分。而且拆分为n-…

Linux 网络传输学习笔记

这篇是混合《Linux性能优化实战》以及 《Wireshark网络分析就这么简单》的一些关于Linux 网络的学习概念和知识点笔记 &#xff0c;主要记录网络传输流程以及对于TCP和UDP传输的一些影响因素 Linux 网络传输流程 借用一张倪朋飞先生的《Linux性能优化实战》课程中的图片 接收流…

OVL assertion checker

目录 单周期断言&#xff1a; 1、ovl_always&#xff1a; 功能描述&#xff1a; ovl和assert_always例子&#xff1a;​编辑​编辑 详细介绍&#xff1a; 2、ovl_implication&#xff1a; 功能描述&#xff1a; 例子&#xff1a; 详细介绍&#xff1a; 3、ovl_never…

JDWP原理分析与漏洞利用

JDWP(Java DEbugger Wire Protocol):即Java调试线协议,是一个为Java调试而设计的通讯交互协议,它定义了调试器和被调试程序之间传递的信息的格式。说白了就是JVM或者类JVM的虚拟机都支持一种协议,通过该协议,Debugger 端可以和 target VM 通信,可以获取目标 VM的包括类…

Sphinx的原理详解和使用

一、Sphinx介绍 1.1 简介 Sphinx是由俄罗斯人Andrew Aksyonoff开发的一个全文检索引擎。意图为其他应用提供高速、低空间占用、高结果 相关度的全文搜索功能。Sphinx可以非常容易的与SQL数据库和脚本语言集成。当前系统内置MySQL和PostgreSQL 数据库数据源的支持&#xff0c;也…

455. 分发饼干 - 力扣(LeetCode)

题目描述 假设你是一位很棒的家长&#xff0c;想要给你的孩子们一些小饼干。但是&#xff0c;每个孩子最多只能给一块饼干。 对每个孩子 i&#xff0c;都有一个胃口值 g[i]&#xff0c;这是能让孩子们满足胃口的饼干的最小尺寸&#xff1b;并且每块饼干 j&#xff0c;都有一个尺…

作者推荐 | 【深入浅出MySQL】「底层原理」探秘缓冲池的核心奥秘,揭示终极洞察

探秘缓冲池的核心奥秘&#xff0c;揭示终极洞察 缓存池BufferPool机制MySQL缓冲池缓冲池缓冲池的问题 缓冲池的原理数据预读程序的局部性原则&#xff08;集中读写原理&#xff09;时间局部性空间局部性 innodb的数据页查询InnoDB的数据页InnoDB缓冲池缓存数据页InnoDB缓存数据…

区间dp/线性dp,HDU 4293 Groups

一、题目 1、题目描述 After the regional contest, all the ACMers are walking alone a very long avenue to the dining hall in groups. Groups can vary in size for kinds of reasons, which means, several players could walk together, forming a group.   As the …

RuoYi-Vue前后端分离后台开发框架运行详细教程

一、官网下载代码 RuoYi-Vue是一款基于SpringBootVue的前后端分离极速后台开发框架。 若依官网&#xff1a;http://ruoyi.vip演示地址&#xff1a;http://vue.ruoyi.vip代码下载&#xff1a;https://gitee.com/y_project/RuoYi-Vue 下载之后解压&#xff0c;ruoyi-ui是前端代…

【JavaWeb】过滤器 Filter

文章目录 过滤器是什么&#xff1f;一、过滤器概述二、过滤器工作位置图解三、Filter接口API四、过滤器使用4.1 定义一个过滤器类,编写功能代码&#xff1a;4.2 xml配置&#xff1a;4.3 定义 servletG 目标资源 模拟测试 :4.4 过滤图解 五、过滤器生命周期六、过滤器链的使用6.…

香港服务器IP段4c和8c的区别及SEO选择建议

随着互联网的快速发展&#xff0c;服务器IP段的选择对于网站SEO优化至关重要。香港服务器IP段4C和8C是两种常见的IP段&#xff0c;它们在SEO优化中具有不同的特点和优势。本文将详细介绍这两种IP段的区别&#xff0c;并给出相应的SEO选择建议。 一、香港服务器IP段4C和8C的区别…

每日coding 2846. 边权重均等查询 236. 二叉树的最近公共祖先 35. 搜索插入位置 215. 数组中的第K个最大元素 2. 两数相加

2846. 边权重均等查询 xs&#xff0c;已放弃&#xff0c;考到直接寄 236. 二叉树的最近公共祖先 236. 二叉树的最近公共祖先 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&…

向量表示在自然语言、知识图谱和图像视觉中的应用

目录 前言1 不同应用的向量表示1.1 自然语言中的向量表示1.2 知识图谱中的向量表示1.3 图像视觉中的向量表示 2 词的向量表示2.1 One-hot encoding的限制2.2 Bag-of-Words模型的不足2.3 Word Embedding的引入2.4. 词的分布式表示与语境关系 3 词向量模型3.1 CBoW&#xff08;Co…

swagger2 和 knife4j 整合

swagger整合knife4j 导入依赖 <dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><version>3.0.2</version></dependency>引入配置 我们自己写一个配置类也好,我这里写…

乐观锁的底层实现以及如何解决ABA问题

什么是乐观锁&#xff1f;乐观锁底层是如何实现的&#xff1f; 乐观锁是一种并发控制的策略。在操作数据的时候&#xff0c;线程读取数据的时候不会进行加锁&#xff0c;先去查询原值&#xff0c;操作的时候比较原来的值&#xff0c;看一下是都被其他线程修改&#xff0c;如果…

OpenHarmony—TypeScript到ArkTS约束说明

对象的属性名必须是合法的标识符 规则&#xff1a;arkts-identifiers-as-prop-names 级别&#xff1a;错误 在ArkTS中&#xff0c;对象的属性名不能为数字或字符串。通过属性名访问类的属性&#xff0c;通过数值索引访问数组元素。 TypeScript var x { name: x, 2: 3 };c…