【C++】C++基础知识(七)---指针

news2024/11/25 11:28:39

C++基础知识(七)

  • 1. 指针的定义与使用
  • 2. 指针的内存
  • 3. 空指针和野指针
  • 4. const修饰指针
  • 5. 指针与数组
  • 6. 指针与函数
  • 7. 指针用于数组和函数的案例

1. 指针的定义与使用

指针的作用:
------通过指针可以直接的访问变量的内存,内存编号一般是从0开始记录的,一般用16进制数来表示,可以利用指针变量保存地址。

指针的定义语法:
------数据类型 * 指针变量名
指针是一个变量,其值为另一个变量的地址,即内存位置的直接地址。

指针的使用:
------可以通过解引用的方式找到指针指向内存中的数据,指针前加 * 表示:找到指针指向的内存中数据。

注意:
1、我们知道每一个变量都有一个内存位置,每一个内存位置都定义了可使用 & 运算符访问的地址,它表示了变量在内存中的一个地址;指针变量指向的就是变量的内存地址。
2、通过在指针变量前加 * 一元操作符来返回位于操作数所指定地址的变量的值。*指针变量可以访问指针变量指向的内存地址中所对应的值。

  • 代码演示
#include <iostream>
using namespace std;

int main() {

	// 1、指针的定义
	int a = 1314;
	int * p = &a;

	cout << "变量a的地址为:" << &a << endl;
	cout << "指针p为:" << p << endl;

	// 2、指针的使用
	*p = 2022;
	cout << "a = " << a << endl;
	cout << "*p = " << *p << endl;

	system("pause");
	return 0;
}
  • 输出结果
    在这里插入图片描述

2. 指针的内存

指针也是一种数据类型,它在32位操作系统中占用4个字节,在64位操作系统中占用8个字节

  • 代码演示
#include <iostream>
using namespace std;

int main() {

	cout << "sizeof(int *) = " << sizeof(int *) << endl; //整型指针
	cout << "sizeof(float *) = " << sizeof(float *) << endl; //单精度浮点型指针
	cout << "sizeof(double *) = " << sizeof(double *) << endl; //双精度浮点型指针
	cout << "sizeof(char *) = " << sizeof(char *) << endl; //字符型指针

	system("pause");
	return 0;
}
  • 输出结果
    32位操作系统中(visual studio2022中解决方案平台为x86):
    在这里插入图片描述
    64位操作系统中(visual studio2022中解决方案平台为x64):
    在这里插入图片描述

3. 空指针和野指针

空指针
------指针变量指向内存编号为0的空间,内存编号0-255为系统内存,不允许用户访问
用途:
------用于初始化指针变量
注意:
------空指针指向的内存变量是不可以访问的,否则会报错

野指针
------指针变量指向非法访问的内存空间
注意:
------空指针与野指针都不是我们申请访问的内存空间,因此不要访问空指针和野指针指向内存中的数据。

  • 代码演示
#include <iostream>
using namespace std;

int main() {

	//空指针
	int* p = NULL;
	
	//访问空指针会报错
	cout << *p << endl;

	//野指针
	int* p1 = (int*)0x1100;
	//访问野指针会报错
	cout << *p1 << endl;

	system("pause");
	return 0;
}
  • 输出结果
    访问空指针时:
    在这里插入图片描述
    访问野指针时:
    在这里插入图片描述

4. const修饰指针

const修饰指针有三种情况:
------1、const修饰指针(常量指针)
-----------指针的指向可以改,但是指针指向的值不能修改
------2、const修饰常量(指针常量)
-----------指针的指向不能修改,但是指针指向的值可以修改
------3、const即修饰指针又修饰常量
-----------指针的指向和指针指向的值均不能修改

注意:
------如何看const修饰的是指针还是常量,只需要看const后面紧跟着的是指针还是常量,如果是指针,则为常量指针;如果是常量,则为指针常量。

  • 代码演示
#include <iostream>
using namespace std;

int main() {

	int a = 2022;
	int b = 1108;
	// 1、const修饰指针 ---常量指针
	// 指针的指向可以改,但是指针的指向的值不能改
	const int* p1 = &a;
	p1 = &b;
	//*p1 = 2050; //报错,指针指向的值不能修改

	// 2、const修饰常量 ---指针常量
	// 指针的指向不能修改,但是指针指向的值可以修改
	int* const p2 = &a;
	//p2 = &b; //报错,指针的指向不能改
	*p2 = 2050;

	// 3、const即修饰指针又修饰常量
	// 指针的指向和值均不能修改
	const int* const p3 = &a;
	//p3 = &b; //报错
	//*p3 = 2050; //报错

	system("pause");
	return 0;
}
  • 输出结果
    const修饰指针(常量指针)修改指针指向的值时报错:
    在这里插入图片描述
    const修饰常量(指针常量)修改指针的指向时报错:
    在这里插入图片描述
    const即修饰指针又修饰常量时修改指针的指向或者修改指向的值时均报错:
    在这里插入图片描述

5. 指针与数组

指针与数组是有一定联系的,我们可以利用指针访问数组中的元素。

  • 代码演示
#include <iostream>
using namespace std;

int main() {

	int arr[10] = {1,9,9,5,4,8,6,0,9,3};
	int* p = arr; //数组名就是这个数组的首地址
	for (int i = 0; i < 10; i++)
	{
		cout << *p << " "; //*p解引用对应指针指向的值
		p++; //p代表指针指向的地址
	}
	cout << endl;

	system("pause");
	return 0;
}
  • 输出结果
    在这里插入图片描述

6. 指针与函数

指针可以用作函数的形参,用来修改实参的值
1、值传递
-----不能用来修饰实参
2、地址传递
-----可以用来修饰实参
原因如下图所示:
在这里插入图片描述

  • 代码演示
#include <iostream>
using namespace std;

void swap1(int num1,int num2)
{
	int temp = num1;
	num1 = num2;
	num2 = temp;
	cout << "num1 = " << num1 << endl;
	cout << "num2 = " << num2 << endl;
}

void swap2(int *p1,int *p2)
{
	int temp = *p1;
	*p1 = *p2;
	*p2 = temp;
	cout << "*p1 = " << *p1 << endl;
	cout << "*p2 = " << *p2 << endl;
}

int main() {

	// 1、值传递
	int a = 2022;
	int b = 1108;
	int c = 2022;
	int d = 1108;
	swap1(a, b);
	cout << "swap1 a = " << a << endl;
	cout << "swap1 b = " << b << endl;

	// 2、地址传递
	swap2(&c, &d);
	cout << "swap2 c = " << c << endl;
	cout << "swap2 d = " << d << endl;

	system("pause");
	return 0;
}
  • 输出结果
    在这里插入图片描述

7. 指针用于数组和函数的案例

  • 案例描述

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

  • 思路分析

1、利用指针来访问数组中的元素;
2、利用指针作函数的形参;
3、封装一个bubblesort()函数,实现数组中元素的升序排列;

  • 代码实现
#include <iostream>
using namespace std;

// 函数功能:实现数组中元素的升序排列
// 函数参数:(参数1:数组元素首地址;参数2:数组的长度。)
// 传入数组长度这个参数是为了便于代码的管理和修改
void bubblesort(int* arr, int length)
{
	for (int i = 0; i < length - 1; i++ )
	{
		for (int j = 0; j < length - i - 1; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}
}

int main() {

	// 1、定义一个整型数组
	int arr[10] = {6,8,0,2,3,5,1,7,9,4};
	int len = sizeof(arr) / sizeof(arr[0]);

	// 2、封装一个升序排列函数
	bubblesort(arr,len);

	// 3、对升序排列后的结果进行打印
	for (int i = 0; i < 10; i++)
	{
		cout << arr[i] << " ";
	}
	cout << endl;

	system("pause");
	return 0;
}
  • 输出结果
    在这里插入图片描述

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

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

相关文章

企业在线培训场景下讲师+ppt课件直播应用效果

阿酷TONY / 原创 / 2022-11-17 / 长沙 企业在线培训场景下讲师ppt课件直播应用效果 &#xff1a; 图 / 直播示意图 设备需求&#xff1a; 1. 现场布摄像头&#xff0c;用于采集讲师摄像头视频和音频数据&#xff1b; 2. PC电脑或笔记本电脑一台&#xff08; 安装直播客户端&…

学会Python开发的第一步:写一个桌面小程序

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 又到了学Python时刻~ 当使用桌面应用程序的时候&#xff0c;有没有那么一瞬间&#xff0c; 想学习一下桌面应用程序开发&#xff1f; 建议此次课程大家稍作了解不要浪费太多时间&#xff0c; 因为没有哪家公司会招聘…

科普系列:AUTOSAR与OSEK网络管理比较(下)

在上篇中我们分别在状态机和报文格式方面对OSEK和AUTOSAR网络管理进行了简单介绍&#xff0c;感兴趣的小伙伴请移步至文章《科普系列&#xff1a;AUTOSAR与OSEK网络管理比较&#xff08;上&#xff09;》。 三、OSEK与AUTOSAR网络管理特点对比 本篇就是本文的重点了&#xff…

华为机试 - 区间交集

目录 题目描述 输入描述 输出描述 用例 题目解析 算法源码 题目描述 给定一组闭区间&#xff0c;其中部分区间存在交集。 任意两个给定区间的交集&#xff0c;称为公共区间(如:[1,2],[2,3]的公共区间为[2,2]&#xff0c;[3,5],[3,6]的公共区间为[3,5])。 公共区间之间…

Springboot普通类获取运行时环境,获取运行时容器,获取Bean,等等获取运行时一切参数总结大全

文章目录获取ApplicationContextApplicationContext有什么用获取ApplicationContext使用ApplicationContext获取EnvironmentEnvironment有什么用获取Environment使用Environment获取ApplicationContext ApplicationContext有什么用 ApplicationContext为应用程序提供配置的中…

供应点击化学PEG试剂Azide-PEG-Rhodamine B,叠氮聚乙二醇罗丹明

点击化学PEG试剂——叠氮-聚乙二醇-罗丹明&#xff0c;化学试剂其英文名为Azide-PEG-Rhodamine B&#xff0c;N3-PEG-RB&#xff0c;它所属分类为Azide PEG Fluorescent PEG。 peg试剂的分子量均可定制&#xff0c;有&#xff1a;5000、2000、1000、3400、10000、20000 。该试…

java计算机毕业设计ssm气象百事通系统-天气预报系统

项目介绍 本气象百事通系统是针对目前仓库的实际需求,从实际工作出发,对过去的天气系统存在的问题进行分析,完善用户的使用体会。采用计算机系统来管理信息,取代人工管理模式,查询便利,信息准确率高,节省了开支,提高了工作的效率。 本系统结合计算机系统的结构、概念、模型、原…

Matlab:设置日期和时间显示格式

Matlab&#xff1a;设置日期和时间显示格式单个日期和持续时间数组的格式datetime 显示格式duration 显示格式calendarDuration 显示格式默认 格式datetime单个日期和持续时间数组的格式 datetime、duration 和 calendarDuration 数组有一个 Format 属性&#xff0c;可控制每个…

【java篇】你真的了解“基本数据类型”吗?

目录 基本介绍&#xff1a; 整数类型 浮点类型 布尔类型和char类型 自动类型转换 数据类型转换必须满足如下规则&#xff1a; 基本介绍&#xff1a; Java是一门强类型语言&#xff0c;这就意味着必须为每一个变量声明一种类型。Java为我们提供了八种基本类…

基于Qlearning强化学习的机器人路线规划仿真

目录 1.算法概述 2.仿真效果预览 3.核心MATLAB代码预览 4.完整MATLAB程序 1.算法概述 假设我们的行为准则已经学习好了, 现在我们处于状态s1, 我在写作业, 我有两个行为 a1, a2, 分别是看电视和写作业, 根据我的经验, 在这种 s1 状态下, a2 写作业 带来的潜在奖励要比 a1 看…

C++ Reference: Standard C++ Library reference: Containers: deque: deque: assign

C官网参考链接&#xff1a;https://cplusplus.com/reference/deque/deque/assign/ 公有成员函数 <deque> std::deque::assign C98 范围 (1) template <class InputIterator> void assign (InputIterator first, InputIterator last); 填充 (2) void ass…

用户体验成为继MAU后,手机银行竞争分化的下一分水岭,易观千帆重磅发布手机银行APP用户体验GX评测

作为银行金融服务线上场景渗透的有效抓手&#xff0c;当前手机银行APP已经成为其触达用户的重要渠道。随着银行发力场景服务平台成为发展趋势&#xff0c;5G技术问世对金融服务场景端提出新要求&#xff0c;用户体验反馈成为银行线上场景化运营的重要一环。 手机银行APP作为银…

自定义node版本,实现node多版本控制

这是我在安装依赖时报的两个错&#xff0c;一个是关于Cant find Python的问题&#xff0c;一个是node版本过高的问题。我一开始解决这边的Python的问题&#xff0c;网上找了好几个方法&#xff0c;安装了Python&#xff0c;环境配置也配置了&#xff0c;但是还是在报这个错&…

【python3】6.pickle json 序列化

2022.11.17 本学习内容总结于莫烦python:6.pickle/json 序列化 https://mofanpy.com/tutorials/python-basic/interactive-python/pickle-json 参考&#xff1a;https://blog.csdn.net/weixin_43625577/article/details/866997896 pickle/json 序列化 6.1 序列化 序列化&…

Linux-RPM与YUM

RPM包 rpm用于互联网下载包的打包及安装工具&#xff0c;它包含在某些Linux分发版中&#xff0c;它生成具有.RPM扩展名的文件&#xff0c;RPM是RedHat Package Manager&#xff08;RedHat软件包管理工具&#xff09;的缩写&#xff0c;类似于windows的setup.exe rpm包的管理 …

【Hack The Box】windows练习-- Timelapse

HTB 学习笔记 【Hack The Box】windows练习-- Timelapse &#x1f525;系列专栏&#xff1a;Hack The Box &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4c6;首发时间&#xff1a;&#x1f334;2022年11月17日&#x1f334; &…

原理图与 PCB 绘制备忘

PCB 绘制 考虑到各制板厂的工艺水平的不同&#xff0c;过孔不可过小&#xff0c;最小为 12/25 mil&#xff0c;常用过孔为 16/28 mil 和 24/40mil 。铺铜时&#xff0c;与管脚有连接时做成部分相连。这是因为整体相连后&#xff0c;焊接元器件时因为铜皮散热快而难以化开焊锡。…

如何使用 Spring Data JPA 在存储过程中使用 IN、OUT 和 INOUT 参数

介绍 在本教程中&#xff0c;我将向您展示如何使用 Spring Data JPA 在存储过程中使用 IN、OUT 和 INOUT 参数。我还将调用一个完全没有参数的存储过程。 我将使用 MySQL 服务器&#xff0c;因此 MySQL 服务器可能存在一些限制&#xff0c;或者 Spring Data JPA 本身在调用存…

【网络安全】记一次APP登录爆破

使用工具 安卓12 jadx-gui 抓取登录HTTP请求包 安装burp证书&#xff0c;并抓取登录请求。 POST /loginUser HTTP/1.1 Host: api.xxxx.xxxxx.comapiaccountvrpuc-aaf91f835147ce2d01216bd3bd5c3516&phonexxxx&sign72C132B392873B3F4F6C0872E5EC4B5A&encM%2F8h…

经典排序方法思路简介

参考&#xff1a;https://zhuanlan.zhihu.com/p/166199924&#xff0c;https://www.runoob.com/w3cnote/ten-sorting-algorithm.html **稳定性&#xff1a;**是表示相同值的数据在排序好的结果中的位置前后关系依然不会变&#xff0c;例如[3,1,3],排序后的最后一个3位置不变&am…