「C++ 内存管理篇 00」指针

news2024/11/14 18:56:34

目录

一、变量,变量名和指针

1. 什么是变量?

2. 变量名和指针

3. 使用指针获取数据 

二、指针变量和数组变量 

三、编译器对指针的等级有着严格的检查 

四、指针的加减

1. 存放指针的变量的加减

2. 存放指针的变量的自增自减

3.  两个指针相减


一、变量,变量名和指针

1. 什么是变量?

        变量就是一个用来存储数据的容器,是内存中的一小块空间,变量的类型向编译器指出了变量可存储的数据的性质,编译器将为变量预留必要的空间。

2. 变量名和指针

        变量名对应一个内存地址,且通过变量名可以直接访问内存空间中的数据。在C/C++中编译器或运行时环境知道变量名对应一个内存地址(指针),并自动通过这个地址来访问或修改内存空间中数据,而不需要我们手动解引用。


        指针就是内存地址的别名,所以指针/地址/内存地址是同一个东西的不同说法,指针变量里存放的就是指针。

        可能为了方便,很多人把指针变量简称为指针,所以现在甚至很多书籍中都把指针变量简称为指针。这也就导致了指针现在有两种含义:地址和存放地址的变量。这样的说法实在是太容易让人混淆,所以为了让各位有更好的阅读体验,博主在文章中都是把指针和指针变量的概念分开:指针就是地址,指针变量才是存放地址的变量。


        如果把内存空间比作一个酒店房间指针就是这个房间的门牌,可以通过指针找到这个空间,但不能通过指针直接进入这个空间。而变量名就相当于这个房间的门卡,既可以通过变量名直接找到这个空间,也可以直接通过变量名进入这个空间,获取其中的内容。


我们可以通过&(取地址符)后跟变量名来取出一个变量名对应的地址。

3. 使用指针获取数据 

我们通过指针找到的是存放数据的房间,而不是真正的数据,这个时候我们需要使用一把钥匙—— *(解引用符),来进入这个存放数据的空间中取出数据。

二、指针变量和数组变量 

指针变量和数组变量之间的关系:

        两者就是同一种东西,两个变量里存放都是一个指针(地址)。指针变量可以使用[ ]来访问后面的空间中的内容,数组变量也可以使用指针加法来找到后面的空间。[ ] 相当于 指针加法后再解引用。


所以说一级指针变量就对应着一维数组变量,因为可以通过指针加法找到后面的空间。

三、编译器对指针的等级有着严格的检查 

vs编译器对指针的等级有着严格的检查:一级指针变量不能存放二级指针。


反之也一样:二级指针变量也不能存放一级指针。


四、指针的加减

1. 存放指针的变量的加减

存放指针的变量能加也能减,但不管加减都要小心越界。

上面的写法等价于:

2. 存放指针的变量的自增自减

  • 存放指针的变量有两种: 数组变量、指针变量。
  • 数组变量不能自增和自减,因为C语言规定它必须存放指向数组起始地址的指针,不能修改,但自增和自减会修改变量的值,所以数组变量不能自增和自减。
  • 指针变量可以自增和自减,和 +1 / -1 没有区别。

3. 两个指针相减

 两个指针不可以相加,但可以相减,相减结果为在数组中的下标之差。

	int a[] = { 1, 2, 3, 4, 5 };
	cout << &a[3] - &a[0] << endl; 


------------------------END-------------------------

才疏学浅,谬误难免,欢迎各位批评指正。

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

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

相关文章

【前端】-【防止接口重复请求】

文章目录 需求实现方案方案一方案二方案三 需求 对整个的项目都做一下接口防止重复请求的处理 实现方案 方案一 思路&#xff1a;通过使用axios拦截器&#xff0c;在请求拦截器中开启全屏Loading&#xff0c;然后在响应拦截器中将Loading关闭。 代码&#xff1a; 问题&…

CD-PAN复合纳米纤维膜

CD-PAN复合纳米纤维膜可能是通过某种特定的方法&#xff0c;如溶剂热反应或水热反应等&#xff0c;将CdS纳米颗粒与PAN&#xff08;聚丙烯腈&#xff09;纳米纤维结合起来的复合材料。 这种复合纳米纤维膜可能会继承CdS的光电性质和PAN纳米纤维的机械性能&#xff0c;从而在某些…

Golang | Leetcode Golang题解之第61题旋转链表

题目&#xff1a; 题解&#xff1a; func rotateRight(head *ListNode, k int) *ListNode {if k 0 || head nil || head.Next nil {return head}n : 1iter : headfor iter.Next ! nil {iter iter.Nextn}add : n - k%nif add n {return head}iter.Next headfor add > …

R语言4版本安装mvstats(纯新手)

首先下载mvstats.R文件 下载mvstats.R文件点此链接&#xff1a;https://download.csdn.net/download/m0_62110645/89251535 第一种方法 找到mvstats.R的文件安装位置&#xff08;R语言的工作路径&#xff09; getwd() 将mvstats.R保存到工作路径 在R中输入命令 source(&qu…

Day27:阻塞队列、Kafka入门、发送系统通知、显示系统

阻塞队列BlockingQueue BlockingQueue 解决线程通信的问题。阻塞方法:put、take。 生产者消费者模式 生产者:产生数据的线程。消费者:使用数据的线程。 &#xff08;Thread1生产者&#xff0c;Thread2消费者&#xff09; 实现类 ArrayBlockingQueueLinkedBlockingQueuePr…

软件工程专业就业方向及前景分析

软件工程专业作为一门应用广泛且持续发展的学科&#xff0c;其就业方向多样&#xff0c;就业前景十分乐观&#xff0c;以下是上大学网&#xff08;www.sdaxue.com)整理的软件工程专业一些主要的就业方向及该领域的总体前景分析&#xff0c;供大家参考&#xff01; 就业方向&…

一文理解前端如何调用后端(java)方法

阅读完文章大约需要3~5分钟 文章目录 一、什么是后端方法路径&#xff1f;二、ajax、axios调用后端方法总结 一、什么是后端方法路径&#xff1f; 这里针对的是 java 后端项目中在 controller 文件夹中的类文件&#xff0c;这类文件的后缀一般都会带有 controller&#xff0c…

如何远程访问连接管理器?

远程访问连接管理器是一种方便的工具&#xff0c;可以实现远程访问计算机和网络设备的功能。它使用户能够从任何地点连接到远程计算机&#xff0c;并进行文件传输、桌面共享和远程控制等操作。远程访问连接管理器不仅提供了便利性&#xff0c;还能提高工作效率&#xff0c;并为…

【Vue 2.x】学习vue之二组件

文章目录 Vue二组件第五章es6文件导入出1、导出export 组件&#xff08;component&#xff09;1、定义2、模块化与组件化3、组件的分类1、非单文件组件非单文件三步骤创建组件标准写法简化写法组件的嵌套非单文件的不足之处 2、单文件组件vue单文件组件的使用脚手架创建项目重点…

(学习日记)2024.05.09:UCOSIII第六十三节:常用的结构体(os.h文件)第二部分

之前的章节都是针对某个或某些知识点进行的专项讲解&#xff0c;重点在功能和代码解释。 回到最初开始学μC/OS-III系统时&#xff0c;当时就定下了一个目标&#xff0c;不仅要读懂&#xff0c;还要读透&#xff0c;改造成更适合中国宝宝体质的使用方式。在学完野火的教程后&a…

【JavaEE】线程的概念

文章目录 1、什么是线程2、进程和线程的区别3、多线程的概述4、在Java中实现多线程的方法1.继承Thread类2.实现Runnable接口3.使用匿名内部类来继承Thread类&#xff0c;实现run方法4.使用匿名内部类来实现Runnable接口&#xff0c;实现run方法5.使用 lambda表达式 1、什么是线…

018、Python+fastapi,第一个Python项目走向第18步:ubuntu24.04 安装cuda和pytorch环境

一、说明 我们安装了pytorch环境之后&#xff0c;会用yolo v9 来测试一下&#xff0c;看8g 显存能不能跑下来&#xff0c;上次用无影云电脑&#xff0c;4cpu8g内存直接爆了&#xff0c;云电脑也死机了&#xff0c;提示一直占用内存不释放&#xff0c;我自己的云电脑不能占用内…

基于alpha shapes的边缘点提取(matlab)

1、原理介绍 由Edelsbrunner H提出的alpha shapes算法是一种简单、有效的快速提取边界点算法。其克服了点云边界点形状影响的缺点&#xff0c;可快速准确提取边界点。如下图所示&#xff0c;对于任意形状的平面点云&#xff0c;若一个半径为a的圆&#xff0c;绕其进行滚动&…

类加载子系统之类的生命周期(待完善)

0、前言 文中大量图片来源于 B站 黑马程序员 0.1、类加载子系统在 JVM 中的位置 类加载器负责的事情是&#xff1a;加载、链接、解析 0.2、与类的生命周期相关的虚拟机参数 参数描述-XX:TraceClassLoading打印出加载且初始化的类 1、类的生命周期 堆上的变量在分配空间的时…

如何基于nginx搭建https网站

华子目录 使用nginx的http_ssl模块建立加密传输的网站查看配置文件ssl配置文件的主要参数实验&#xff1a;搭建nginxssl加密认证的web服务器 使用nginx的http_ssl模块建立加密传输的网站 查看 [rootserver ~]# nginx -V #查看是否有--with-http_ssl_module模块&#xff0c;如…

2024五一杯:煤矿深部开采冲击地压危险预测 (详细完整思路,已修改)

背景 了解即可 煤炭是中国的主要能源和重要的工业原料。然而&#xff0c;随着开采深度的增加&#xff0c;地应力增大&#xff0c;井下煤岩动力灾害风险越来越大&#xff0c;严重影响着煤矿的安全高效开采。在各类深部煤岩动力灾害事故中&#xff0c;冲击地压已成为威胁中国煤矿…

BigKey的危害

1.2.1、BigKey的危害 网络阻塞 对BigKey执行读请求时&#xff0c;少量的QPS就可能导致带宽使用率被占满&#xff0c;导致Redis实例&#xff0c;乃至所在物理机变慢 数据倾斜 BigKey所在的Redis实例内存使用率远超其他实例&#xff0c;无法使数据分片的内存资源达到均衡 Redis阻…

Vue---router实现路由跳转

Vue—router实现路由跳转 目录 Vue---router实现路由跳转基本使用路由跳转html实现路由跳转JS实现路由跳转 基本使用 所谓路由&#xff0c;就是将一个个组件映射到不同的路由url中 首先要将App内的内容换成router-view // App.vue <template><div id"app"…

商务谈判技巧与口才训练方法(3篇)

商务谈判技巧与口才训练方法&#xff08;3篇&#xff09; 商务谈判技巧与口才训练方法&#xff08;**篇&#xff09;&#xff1a;技巧篇 一、商务谈判技巧 明确目标&#xff1a;在谈判前&#xff0c;明确自己的谈判目标&#xff0c;并设定好底线和期望的谈判结果。 知己知彼…

AIGC技术:现状剖析与未来趋势展望

AIGC技术&#xff1a;现状剖析与未来趋势展望 随着科技的飞速进步&#xff0c;人工智能已经逐渐渗透到我们生活的方方面面。其中&#xff0c;AIGC&#xff08;人工智能生成内容&#xff09;技术更是以其独特的魅力和巨大的潜力&#xff0c;引起了业界的广泛关注。本文将深入探…