当前位置: 首页 > news >正文

C++-指针

在C++中,指针是至关重要的组成部分。它是C++语言最强大的功能之一,也是最棘手的功能之一。 指针具有强大的能力,其本质是协助程序员完成内存的直接操纵。

指针:特定类型数据在内存中的存储地址,即内存地址。

指针变量的定义语法: 先声明,后赋值:

变量类型 * 指针变量名;       // 声明
指针变量名 = 内存地址值;     // 赋值int num = 10;
int * p;		// 声明
p = #	// 赋值

- 变量类型(如上int)表示,指针(内存地址)指向的内存区域,存放的是整型数据              

- *符号有两种含义:             

- 声明时:*p,表示变量p,是指针变量(存的是内存地址)             

- 使用时:*p,表示取指针p执行内存区域的数据              

- &符号表示取变量内存地址,是一个取内存地址的单目操作符

野指针和空指针

野指针:被声明但未初始化(赋值)的指针。这个指针会指向随机的内存空间,可能导致未知问题。

int * p;    // 声明指针(分配了8字节空间), p是野指针因为未被赋值
*p = 10;    // 将10赋予指针p所指向的空间

*p = 10;是向未知的、随机的4字节内存区域,修改存储值为10

为避免野指针,应养成良好的变成习惯,及时初始化,或将指针置为空指针更为安全

int * p = NULL;
int * p = nullptr;

指针运算

int num = 10;
int *p = #
cout << p << endl;    // 结果:0x20d1ff6e4;
cout << p++ << endl;    // 结果:0x20d1ff6e8

指针进行加减运算的结果,和指针指向内存区域的数据类型有关,以加法为例:

char 类型指针 +1, 地址+1 (字节)

int 类型指针+1, 地址+4(字节)

double 类型指针+1, 地址+8 (字节)

指针运算

数组对象本身记录的是内存地址(第一个元素地址) 可以通过指针运算,完成使用指针存取数组元素。

int v[] = {1, 2, 3, 4, 5};
int *p = v;
*p = 11;                // 赋值数组第一个元素
*(p+1) = 22;            // 赋值数组第二个元素
*(p+2) = 33;            // 赋值数组第三个元素
cout << *p << endl;     // 取数组第一个元素
cout << *(p+1) << endl; // 取数组第二个元素
cout << *(p+2) << endl; // 取数组第三个元素

动态内存分配

动态内存分配:即由程序员手动的进行内存空间的分配、内存空间的释放等内存管理操作。

C++代码中,变量、数组等对象的创建,是由C++自动分配内存的,称之为(自动)静态内存分配。

(自动)静态内存管理,是不会进行内存空间的自动清理的。(无垃圾回收机制) 我们需要手动的管理内存,即手动分配,用完清理。

手动管理方式:

new运算符申请空间,提供该空间的指针(地址)

delete运算符申请的空间,仅用于new申请的空间

建议:写完new后,立刻写delete,然后再写业务逻辑代码

int * p = new int;      // 申请int类型(4字节)空间
int * p = new double;   // 申请double类型(8字节)空间
delete p;               // 删除申请的空间
int * p = new int[5];   // 申请5元素int数组空间
delete[] p;             // 删除申请的5元素数组空间

优势: 手动控制内存,避免内存空间浪费

劣势: 考验程序员水平,用的好效率高,用不好有反效果

new

new运算符用于申请并分配内存空间 并提供指向该空间的指针(内存地址) 基本语法:

new type 申请普通变量空间

new type[n] 申请数组空间

delete

delete运算符用于释放内存 仅可用于new运算符申请的内存区域

基本语法:

delete 指针 删除普通变量空间

delete[] 指针 删除数组空间

数组元素的插入举例:

#include "iostream"
using namespace std;/* 在下标1和3插入数字:11和66 */int main()
{// 示例数组int * pArr = new int[5] {1, 3, 5, 7, 9};// 创建新数组int * pNewArr = new int[7];// 循环新数组,挨个进行元素填充(非插入的位置,填充老数组元素,插入位置填充新元素)int offset = 0;     // 偏移量用来控制新老数组元素的下标对照for (int i = 0; i < 7; i++){if (i == 1){// 走到了下标1,应当执行新元素插入pNewArr[i] = 11;offset++;       // 每插入一个新元素,offset+1continue;} else if (i == 3){// 走到了下标3,应当执行新元素插入pNewArr[i] = 66;offset++;       // 每插入一个新元素,offset+1continue;}// 不是插入位置,从老数组中提取元素放入新数组中// 公式:老数组的元素下标 + offset = 新数组元素下标// 当前循环的i是新数组的元素下标pNewArr[i] = pArr[i-offset];}// 收尾工作delete[] pArr;pArr = pNewArr;// 将新数组的内容输出for (int i = 0; i< 7; i++){cout << pNewArr[i] << ",";}return 0;
}

数组元素的删除举例:

#include "iostream"
using namespace std;int main()
{// 示例数组int * pArr = new int[5] {1, 3, 5, 7, 9};// 创建一个新的数组,将需要保留的复制到新数组中int * pNewArr = new int[4];// 循环去遍历老的数组,将需要的元素放入新数组中(不要的要跳过)for (int i = 0; i < 5; i++){if (i == 2){continue;}if (i > 2){pNewArr[i-1] = pArr[i];}else{pNewArr[i] = pArr[i];}}// 可选delete[] pArr;      // 回收老数组的空间(可选,根据需要来说)// 可选pArr = pNewArr;     // 将老数组的指针指向新数组的内存空间(可选,根据需要)for (int i = 0; i < 4; i++){cout << "新数组的元素是:" << pNewArr[i] << endl;cout << "新数组的元素是:" << pArr[i] << endl;}return 0;
}

指针悬挂:

指针指向区域已经被回收(delete),这种问题称之为:指针悬挂。

不要轻易进行指针之间相互赋值

delete回收空间前,确保此空间100%不再被使用

错误示范:

int main()
{   int * p1 = new int;int * p2 = p1;  // 将p1赋值给p2*p1 = 10;   delete p1;cout << "p2指针记录的是:" << *p2 << endl;return 0;
}

const指针

const是C++关键字,被译为常量,const指针即表示:常量指针。

const用来修饰常量(不可更改),可以配合指针使用 以int为例。

const int * p; 指向常量的指针,即存储值不可变,但指针可修改指向

int * const p = 地址; 常量指针

存储的值可以变 指着不可修改指向 必须初始化指针的地址

const int * const p = 地址; 指向常量的常量指针

存储的值和指针的指向,均不可修改

相关文章:

C++-指针

在C中&#xff0c;指针是至关重要的组成部分。它是C语言最强大的功能之一&#xff0c;也是最棘手的功能之一。 指针具有强大的能力&#xff0c;其本质是协助程序员完成内存的直接操纵。 指针&#xff1a;特定类型数据在内存中的存储地址&#xff0c;即内存地址。 指针变量的定…...

Three.js 研究:2、如何让动画线性运动

1、默认的动画含有加速度并非线性的 制作好的动画很明显是非线性的&#xff0c;这是一个运动环&#xff0c;为了让环运行线性进行如下设置。 2、设置动画成为线性动画...

z3-加法器实验

补码器加减法&#xff0c;运算方法简介 我们要知道什么是补码的加法&#xff0c;我们为什么要用补码的加法&#xff1f; 补码的加法其实就是将两个补码形式的二进制数字直接相加&#xff0c;处理的时候忽略超出固定位数的进位。补码的加法运算和无符号二进制数的加法操作一样&…...

解决git克隆项目出现fatal无法访问git clone https://github.com/lvgl/lvgl.git

Windows 11系统 报错 $ git clone https://github.com/lvgl/lvgl.git Cloning into lvgl... fatal: unable to access https://github.com/lvgl/lvgl.git/: Failed to connect to github.com port 443 after 21141 ms: Couldnt connect to server 解决方法 git运行这两段代码…...

Vue中引入组件需要哪三步

在Vue中引入组件通常需要以下三步&#xff1a; 导入组件&#xff1a;首先&#xff0c;你需要在父组件中导入你想要使用的子组件。这通常是通过ES6的import语法完成的。 注册组件&#xff1a;接下来&#xff0c;你需要在父组件中注册这个子组件。这可以通过components选项完成&…...

到底该用英文括号还是中文括号?

这篇博客写的还挺详细的&#xff0c;不错。...

一个普通双非女生的秋招之路

大家好&#xff0c;我是小布丁。 先简单地做个自我介绍&#xff1a; 我今年本科毕业于某双非院校&#xff08;属于那种没什么人听说过的小学校&#xff09;&#xff0c;学的是计算机专业&#xff0c;英语四级水平&#xff08;没办法&#xff0c;六级确实没过&#xff09;。我本…...

一个模型用了几层神经网络怎么算?

有权重参数的层算作一层&#xff0c;没有权重参数的就是参数不更新&#xff0c;不能称之为一层 有权重&#xff1a;卷积层、全连接层 没有权重的层&#xff1a;激活函数层、池化层 即数卷积层和全连接层的个数&#xff0c;就是这个模型用了几层神经网络。...

python获取cookie的方式

通过js获取cookie&#xff0c;避免反复登录操作。 经验证在JD上没有用&#xff0c;cookie应该无痕或者加密了&#xff0c;只能用单浏览器不关的模式来实现&#xff0c;但是代码留着&#xff0c;其他网站可能有用。 def cookie_set():driver webdriver.Chrome(optionschrome_…...

Nginx-狂神说

Nginx概述 公司产品出现瓶颈&#xff1f; 我们公司项目刚刚上线的时候&#xff0c;并发量小&#xff0c;用户使用的少&#xff0c;所以在低并发的情况下&#xff0c;一个jar包启动应用就够了&#xff0c;然后内部tomcat返回内容给用户。 但是慢慢的&#xff0c;使用我们平台…...

Python筑基之旅-运算符

目录 一、运算符 1、了解定义 2、理解意义 2-1、基本数据处理 2-2、条件判断 2-3、逻辑操作 2-4、赋值和更新 2-5、位操作 2-6、提高代码可读性 2-7、解决实际问题 2-8、学习其他编程语言的基础 3、探索方法 3-1、理解概念 3-2、练习基本运算 3-3、掌握优先级 …...

【Text2SQL】Spider 数据集

论文&#xff1a;Spider: A Large-Scale Human-Labeled Dataset for Complex and Cross-Domain Semantic Parsing and Text-to-SQL Task ⭐⭐⭐⭐⭐ EMNLP 2018, arXiv:1809.08887 Dataset: spider GitHub: github.com/taoyds/spider 一、论文速读 本文提出了 Text2SQL 方向的…...

语雀——云知识库/笔记

对于日常进行学习/创作或是记录学习、工作内容与心得的群体来说&#xff0c;能够及时同步的云笔记应用有着广泛的应用场景。近期&#xff0c;我也探索了许多款不同的软件应用&#xff0c;今天来分享一款很有特点的应用——语雀。 语雀&#xff0c;为每一个人提供优秀的文档和知…...

Java学习:电影查询简单系统

1.创建一个movice的对象来存放电影 里面设置构造器&#xff08;有参和无参&#xff09; package com.movie;public class movice {//创建一个movice的对象存放电影private int id;private String name;private double price;private double score;private String diector;pri…...

在Mac电脑下怎么部署QAnything?

在Mac电脑下部署QAnything&#xff0c;可以选择使用纯Python环境进行部署&#xff0c;这种方式不依赖GPU&#xff0c;适合在Mac等笔记本电脑上运行。以下是基于QAnything的纯Python环境安装教程的步骤[18]&#xff1a; 安装要求 Python 3.10&#xff08;建议使用Anaconda3来管…...

单条16g和双条8g哪个好

单条16g和双条8g各有优劣,具体选择要根据个人需求和电脑配置来决定。 以下是一些参考信息: •单条16g内存的价格比双条8g内存的价格低,而且16g的内存容量大,一条内存十分的方便。 •两条8g内存可以组成双通道,电脑运行速度要快一些。 •对于普通使用电脑的人群与热衷于…...

Microsoft VBA Excel 去重小工具

问题简述 在本工作表中&#xff0c;A1:B3单元格样式如下&#xff0c;通过名称管理器B列的单元格被命名为"LinkFile"、“SheetName”、“InputArea”&#xff0c;请实现以下功能&#xff1a;读取Excel文件中的数据&#xff0c;去除重复的数据&#xff0c;并记录每个数…...

数据库管理-第194期 网络加速RDMA初探(20240526)

数据库管理194期 2024-05-26 数据库管理-第194期 网络加速RDMA初探&#xff08;20240526&#xff09;1 概念2 发展3 使用总结 数据库管理-第194期 网络加速RDMA初探&#xff08;20240526&#xff09; 作者&#xff1a;胖头鱼的鱼缸&#xff08;尹海文&#xff09; Oracle ACE A…...

C++小游戏 合集

生化危机 #include<conio.h> #include<string.h> #include<stdio.h> #include<stdlib.h> #include<windows.h> #include<time.h> #include<direct.h> int n,round,gold0; bool f1,f2,f3,deadfalse,PC_64Bit; char str[4]; struct n…...

【Python爬虫篇】Selenium在获取网页数据方面的使用及采集中国大学课程评论数据

1 selenium概述 1.什么是selenium&#xff1f; &#xff08;1&#xff09;Selenium是一个用于Web应用程序测试的工具。 &#xff08;2&#xff09;Selenium 测试直接运行在浏览器中&#xff0c;就像真正的用户在操作一样。 &#xff08;3&#xff09;支持通过各种driver&#…...

Eino-Workflow 实战详解

Eino-Workflow 实战详解 概述 本文详细讲解 Eino 框架中 Workflow 的概念、初始化、编排和编译过程。Workflow 是 Eino 框架中用于构建分支 AI 流程的核心组件&#xff0c;提供了比 Chain 更灵活的编排能力&#xff0c;代码链接。 一、Eino 框架中 Workflow 的概念 1.1 什么…...

Javadoc自动生成终极指南:告别手动注释的烦恼

Javadoc自动生成终极指南&#xff1a;告别手动注释的烦恼 【免费下载链接】easy_javadoc IntelliJ IDEA 插件&#xff0c;自动生成javadoc文档注释 项目地址: https://gitcode.com/gh_mirrors/ea/easy_javadoc 作为Java开发者&#xff0c;你是否还在为编写规范的Javadoc…...

MICROCHIP微芯 AT24C32D-SSHM-T SOP8 EEPROM

特性 低压和标准电压操作-工作电压范围:1.7至5.5V 内部组织的4096x8,8192x82线串行接口 Schmitt触发器&#xff0c;带滤波输入以抑制噪声 双向数据传输协议 .1MHz(5.0V)和400KHz(1.8V兼容性) 写保护引脚用于硬件数据保护 .32字节页面写入模式(允许部分页面写入) .自动定时写周期…...

Vue 插槽(Slot)完全指南

插槽是 Vue 中组件内容分发的机制&#xff0c;让父组件可以向子组件传递 HTML 内容。一、为什么需要插槽&#xff1f;<!-- 子组件 Card.vue --> <div class"card"><div class"header">标题</div><div class"body">…...

GitFS与CI/CD集成:如何实现持续部署的版本控制

GitFS与CI/CD集成&#xff1a;如何实现持续部署的版本控制 【免费下载链接】gitfs Version controlled file system 项目地址: https://gitcode.com/gh_mirrors/gi/gitfs GitFS作为一个版本控制文件系统&#xff0c;为开发者提供了将Git仓库直接挂载为文件系统的能力&am…...

利用闲置板卡体验飞牛NAS

### GENE-BT05主要资源 GENE-BT05采用Intel Atom E3845处理器。系统内存使用204针SODIMM插槽的DDR3L 1066/1333内存&#xff0c;最高8 GB。板载有IntelI211&#xff0c;支持两个10/100/1000Base-TX以太网&#xff0c;可以实现更快的网络连接。GENE-BT05的显示系统支持CRT/LCD和…...

CenterPoint 模型结构与输出语义解析

本文以地平线 Open Explorer&#xff08;OE&#xff09;中的 CenterPoint 参考算法为主线&#xff0c;系统梳理 CenterPoint 的模型结构设计、Head 与 box 语义拆分方式&#xff0c;以及在工具链中从训练、导出到编译部署的完整工程语义。文末通过 nuScenes → KITTI 的一次实际…...

RT-Thread系统时钟深度解析:从SysTick到rt_hw_us_delay的底层实现与优化技巧

RT-Thread系统时钟深度解析&#xff1a;从SysTick到rt_hw_us_delay的底层实现与优化技巧 在嵌入式实时操作系统中&#xff0c;精确的时间管理是确保系统实时性的关键。RT-Thread作为一款开源的实时操作系统&#xff0c;其时钟系统设计精巧而高效。本文将深入剖析RT-Thread 4.0.…...

ESP8266轻量MQTT Broker:零依赖离线直连实现

1. 项目概述MQTTbroker 是一款专为 ESP8266 设计的轻量级嵌入式 MQTT 消息代理&#xff08;Broker&#xff09;实现&#xff0c;其核心目标是构建一个零依赖、离线可用、端到端直连的物联网本地通信枢纽。它并非传统意义上的全功能云级 Broker&#xff08;如 Mosquitto 或 EMQX…...

SSD1289 TFT-LCD驱动开发:面向AUTOSAR与Cariad平台的嵌入式显示适配

1. SSD1289显示驱动库技术解析&#xff1a;面向Cariad平台的TFT-LCD底层适配实践SSD1289是Solomon Systech&#xff08;现属Silicon Motion&#xff09;推出的高性能16位并行接口TFT-LCD控制器芯片&#xff0c;广泛应用于工业HMI、车载信息娱乐系统&#xff08;IVI&#xff09;…...