C++知识点笔记

二维数组

定义方式

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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ERROR Failed to get response from https://registry.npm.taobao.org/ 错误的解决

这个问题最近才出现的。可能跟淘宝镜像的证书到期有关。 解决方式一&#xff1a;更新淘宝镜像&#xff08;本人测试无效&#xff0c;但建议尝试&#xff09; 虽然无效&#xff0c;但感觉是有很大关系的。还是设置一下比较好。 淘宝镜像的地址&#xff08;registry.npm.taobao…

leetcode hot 100 电话号码的字母组合

在本题目中&#xff0c;要求我们根据给的数字字符串对应电话号码上的字母组合。所以我们需要建立起数字和电话上字母的对应关系。 然后&#xff0c;组合问题依旧采用回溯来做。首先我们需要确定一下参数&#xff0c;我们需要给的digits&#xff0c;然后还需要字母和数字对应关…

使用IP爬虫代理提取数据的步骤是什么?爬虫代理IP怎么提高采集效率?

​​​​​ 一、使用IP爬虫代理提取数据的步骤 在使用爬虫代理IP提取数据之前&#xff0c;需要先了解数据来源和目标网站的结构。以下是一个基本的步骤&#xff1a;1.确定数据来源 首先需要确定要提取数据的网站或数据源&#xff0c;了解网站的结构、数据存储方式以及数据更新…

HTML - 介绍

一.简介 HTML&#xff0c;超文本标记语言&#xff08;HyperText Markup Language&#xff09;&#xff0c;是一种用于创建网页的标准标记语言。我们可以使用HTML建立自己的WEB网站或特定页面。HTML运行在浏览器上&#xff0c;由浏览器解析。 ⚠️注意&#xff1a;HTML文件的后缀…

HTML以及CSS相关知识总结(二)

css文件写样式时建议遵循以下顺序&#xff1a; 1.布局定位属性:display/position/float/ear/visibility/overflow(建议display第一个写&#xff0c;毕竟关系到模式) 2.自身属性: width/height/margin/ padding /border/ background 3.文本属性: color/font / text-decoration/t…

区块链中分叉机制

在区块链中我们经常会听到分叉【fork】的概念&#xff0c;今天通过这篇文章来详细的介绍下分叉 什么是分叉 在介绍区块链的分叉机制中&#xff0c;我们以公有链来说明&#xff0c;公有链是去中心化的。任何协议的改变都是代价巨大的&#xff0c;因为全网那么多节点&#xff0…

国产GC6610应用于打印机,医疗器械等产品中,可替代TMC2208/2209/trinamic的参数分析

电机驱动芯片应用范围十分广泛&#xff0c;目前已经广泛应用于消费电子、电动工具、打印机、3D打印、安防监控、通信设备、汽车&#xff0c;以及工业控制等领域。据市场调研机构ResearchAndMarkets统计&#xff0c;2021年全球电机驱动芯片是市场规模为38.8亿美元&#xff0c;预…

uniapp小程序:内存超过2mb解决方法(简单)message:Error: 上传失败:网络请求错误 代码包大小超过限制。

分析&#xff1a;这种情况是代码文件内存超过2mb无法进行预览上传 解决方法&#xff1a; 1、Hbuilder中点击运行-->运行到小程序模拟器--->运行时是否压缩代码 2、在微信小程序中点击详情--->本地设置&#xff1a; 3、点击预览即可运行了

Java通过模板替换实现excel的传参填写

以模板为例子 将上面$转义的内容替换即可 package com.gxuwz.zjh.util;import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io.*; import java.util.HashMap; import java.util.Map; import java.io.IOException; impor…

vue3 常见的路由传参无刷新修改当前路由url带参

无刷新修改当前路由url带参 //tabs切换部分 <el-tabs v-model"activeName" class"demo-tabs" tab-click"handleClick"><el-tab-pane v-for"(item,index) in tagList" :label"item.title" :name"item.name…

4-4 D. 银行排队问题之单队列多窗口加VIP服务

题目描述 假设银行有K个窗口提供服务&#xff0c;窗口前设一条黄线&#xff0c;所有顾客按到达时间在黄线后排成一条长龙。当有窗口空闲时&#xff0c;下一位顾客即去该窗口处理事务。当有多个窗口可选择时&#xff0c;假设顾客总是选择编号最小的窗口。 有些银行会给VIP客户以…

gitee仓库使用中的警告

当 Git 执行 git pull 命令时&#xff0c;有时候会出现类似下面的警告信息&#xff1a; warning: ----------------- SECURITY WARNING ---------------- warning: | TLS certificate verification has been disabled! | warning: ------------------------------------------…

计算机毕业设计 基于SpringBoot的线上心理咨询室系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

Ceph分布式存储自动化运维平台开发实践

文章目录 1. 背景介绍1.1 什么是Ceph&#xff1f;1.1.1 Ceph的核心组件1.1.2 Ceph的优势 1.2 自动化运维的需求目标 2. 平台架构设计和组件版本2.1 平台架构设计2.2 组件版本2.3 模块划分&#xff08;已经脱敏处理&#xff09;2.3.1 当前版本V1.0支持功能2.3.2 前后端代码结构t…

勤学苦练“prompts“,如沐春风“CodeArts Snap“

前言 CodeArts Snap 上手一段时间了&#xff0c;对编程很有帮助。但是&#xff0c;感觉代码编写的不尽人意。 我因此也感到困惑&#xff0c;想要一份完整的 CodeArts Snap 手册看看。 就在我感觉仿佛"独自彷徨在这条悠长、悠长又寂寥的雨巷"时&#xff0c;我听了大…

Transformers Tutorial教程3-7

Introduction Transformers库的一个使用&#xff0c;用这个库就可以很轻松地去使用和训练自己的一个预训练语言模型。 outline 介绍什么是Transformers&#xff0c;为什么要用它 介绍一些比较常用的接口 最后会给出一个demo&#xff0c;帮助你们快速地入门 what is Transf…

重装Windows系统出现Windows无法安装到这个磁盘,选中的磁盘采用GPT分区

文章目录 1.问题描述2.问题解决 1.问题描述 重装Windows系统时&#xff0c;出现Windows无法安装到这个磁盘&#xff0c;选中的磁盘采用GPT分区这个提示 2.问题解决 1.shiftF10&#xff0c;打开命令行 2.输入&#xff1a;diskpart (打开分区工具) 3.输入&#xff1a;list di…

分享5款专注于实用功能的小众软件

​ 电脑上的各类软件有很多&#xff0c;除了那些常见的大众化软件&#xff0c;还有很多不为人知的小众软件&#xff0c;专注于实用功能&#xff0c;简洁干净、功能强悍。 1.视频播放——Potplayer ​ Potplayer是一款功能强大的视频播放软件&#xff0c;支持各种格式的视频文…

14:00面试,14:06就出来了,问的问题过于变态了。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到5月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%…

Web10--jQuery进阶

1、DOM操作 1.1 操作内容 方法 描述 text() 获取/设置元素的标签体纯文本内容 html() 获取/设置元素的标签体超文本内容 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>操作内容</title><style>div{w…