草庐IT

07章-指针--C++基础入门学习笔记

ffengeng 2023-03-28 原文

7 指针

7.1 指针基本概念

指针的作用: 可通过指针间接访问内存

  • 内存编号从0开始记录的,一般用十六进制数表示
  • 可以利用指针变量保存地址

7.2 指针变量的定义和使用

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

示例

#include<iostream>
using namespace std;

int main()
{
	//1、定义指针
	int a = 10;
	//2、指定定义的语法:数据类型*指针变量;
	int* p;
	//3、让指针记录变量的a的地址
	p = &a;
	cout << "a的地址为:" << &a << endl;
	cout << "指针p为:" << p << endl;

	//4、使用指针
	//可以通过解引用的方式来找到指针指向的内存
	//指针前*代表解引用,找到指针指向内存中的数据
	*p = 1000;
	cout << "a = " << a << endl;
	cout << "*p = " << *p << endl;

	system("pause");
	return 0;
}

7.3 指针所占的内存空间

提问:指针也是种数据类型,那么这种数据类型占用多少内存空间?
回答:

  • 在32位操作系统中,占4个字节空间
  • 在64位操作系统中,占8个字节空间

示例

#include<iostream>
using namespace std;

int main()
{
	//指针所占的内存空间大小?
	int a = 10;
	int* p = &a;
	cout << "sizeof int * = " << sizeof(int*) << endl;
	cout << "sizeof int * = " << sizeof(p) << endl;
	system("pause");
	return 0;
}

7.4 空指针和野指针

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

用途:初始化指针变量

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

示例1

#include<iostream>
using namespace std;

int main()
{
	//空指针
	//1、空指针用于给指针变量进行初始化
	int* p = NULL;
	//2、空指针是不可以进行访问的
	// 0~255之间的内存编号是系统占用的,因此不可以访问的
	//*p = 100;
	cout << *p << endl;
	system("pause");
	return 0;
}

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

示例2

#include<iostream>
using namespace std;

int main()
{
	//野指针
	//在程序中,避免出现野指针
	int* p = (int*)0x1100;
	cout << *p << endl;
	system("pause");
	return 0;
}

7.5 const修饰指针

const 修饰指针有三种情况:

  • const修饰指针 ---常量指针
  • const修饰常量 ---指针常量
  • const即修饰指针,又修饰常量

特点

  • 常量指针:const int* p = &a;,特点:指针的指向可以修改,但是指针的值不可以修改
  • 指针常量:int* const p = &a;,特点:指针的指向不可以改,指针指向的值可以改
  • 既修饰指针又修饰常量:const int* const p =&a;,特点:指针指向,和指针指向的值都不可修改。

示例

#include<iostream>
using namespace std;

int main()
{
	//1、const修饰指针
	int a = 10;
	int b = 10;
	const int* p = &a;
	//指针指向的值不可以改,指针的指向可以改
	//*p =20; //错误操作
	p = &b; //正确操作

	//2、const修饰常量
	int* const p2 = &a;
	//指针的指向不可以改,指针真相的值可以改
	*p2 = 100;//正确操作
	//p2 = &b;//错误操作,指针的指向不可以改

	//3、const修饰指针和常量
	const int* const p2 = &a;
	//指针的指向和指针指向的值都不可以修改
	//*p3 = 10;//错误操作
	//p3 = &b;//错误操作

	system("pause");
	return 0;
}

技巧:看const右侧紧跟的是指针还是常量。

7.6 指针和数组

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

示例

#include<iostream>
using namespace std;

int main()
{
	//指针和数组
	//利用指针访问数组中的元素

	int arr[10] = { 1,2,3,4,5,6,7,8,9,0 };
	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 << *p2 << endl;
		p2++;
	}

	system("pause");
	return 0;
}

7.7 指针和函数

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

#include<iostream>
using namespace std;

//实现两个数字进行交换
void swap01(int a, int b)
{
	int temp = a;
	a = b;
	b = temp;
	cout << "swap01 中 a = " << a << endl;
	cout << "swap01 中 b = " << b << 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);//值传递不会改变实参
	cout << "值传递" << endl;
	cout << "main 中 a = " << a << endl;
	cout << "main 中 b = " << b << endl;

	//2、地址传递
	swap02(&a, &b);//地址传递会改变实参
	cout << "地址传递" << endl;
	cout << "main 中 a = " << a << endl;
	cout << "main 中 b = " << b << endl;

	system("pause");
	return 0;
}

7.8 指针、数组、函数

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

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

示例

#include <iostream>
using namespace std;
//冒泡排序函数
//参数1:数组首地址,参数2:数组长度
void bubbleSort(int* arr,int len)
{
	for (int i = 0; i < len - 1; i++)
	{
		for (int j = 0; j < len - i - 1; 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] << " ";
	}
	cout << endl;
}
int main()
{
	//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;
}

有关07章-指针--C++基础入门学习笔记的更多相关文章

  1. postman接口测试工具-基础使用教程 - 2

    1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,

  2. 软件测试基础 - 2

    Ⅰ软件测试基础一、软件测试基础理论1、软件测试的必要性所有的产品或者服务上线都需要测试2、测试的发展过程3、什么是软件测试找bug,发现缺陷4、测试的定义使用人工或自动的手段来运行或者测试某个系统的过程。目的在于检测它是否满足规定的需求。弄清预期结果和实际结果的差别。5、测试的目的以最小的人力、物力和时间找出软件中潜在的错误和缺陷6、测试的原则28原则:20%的主要功能要重点测(eg:支付宝的支付功能,其他功能都是次要的)80%的错误存在于20%的代码中7、测试标准8、测试的基本要求功能测试性能测试安全性测试兼容性测试易用性测试外观界面测试可靠性测试二、质量模型衡量一个优秀软件的维度①功能性功

  3. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  4. CAN协议的学习与理解 - 2

    最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总

  5. 深度学习部署:Windows安装pycocotools报错解决方法 - 2

    深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal

  6. 微信小程序开发入门与实战(Behaviors使用) - 2

    @作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors    1、什么是behaviors    2、behaviors的工作方式    3、创建behavior    4、导入并使用behavior    5、behavior中所有可用的节点    6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors    1、什么是behaviorsbehaviors是小程序中,用于实现

  7. 【Java入门】使用Java实现文件夹的遍历 - 2

    遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg

  8. ES基础入门 - 2

    ES一、简介1、ElasticStackES技术栈:ElasticSearch:存数据+搜索;QL;Kibana:Web可视化平台,分析。LogStash:日志收集,Log4j:产生日志;log.info(xxx)。。。。使用场景:metrics:指标监控…2、基本概念Index(索引)动词:保存(插入)名词:类似MySQL数据库,给数据Type(类型)已废弃,以前类似MySQL的表现在用索引对数据分类Document(文档)真正要保存的一个JSON数据{name:"tcx"}二、入门实战{"name":"DESKTOP-1TSVGKG","cluster_name":"elasticsear

  9. ruby - 我正在学习编程并选择了 Ruby。我应该升级到 Ruby 1.9 吗? - 2

    我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or

  10. ruby - 我如何学习 ruby​​ 的正则表达式? - 2

    如何学习ruby​​的正则表达式?(对于假人) 最佳答案 http://www.rubular.com/在Ruby中使用正则表达式时是一个很棒的工具,因为它可以立即将结果可视化。 关于ruby-我如何学习ruby​​的正则表达式?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/1881231/

随机推荐