C++学习笔记4
什么是指针?
指针是存储内存地址的变量。就像int变量用于存储整数值一样,指针变量用于存储内存地址。指针是一种指向内存单元的特殊变量。
内存单元地址通常使用的是16进制表示(0~9和A~F)来表示数字。显示16进制数时,通常使用前缀0x。
声明指针:作为一种变量,指针也需要声明。通常将指针声明为声明为指向特定的类型。如int,者意味着指针包含的地址对应的内存单元存储了一个整数。
PointedType * PointerVariableName;
注意:除非对指针进行初始化,否则它包含的将是垃圾值。对于指针来说,这种垃圾值非常危险,因为指针包含的值被视为地址。未初始化的指针可能导致程序访问非法内存单元,进而导致程序崩溃。因此将指针初始化为NULL。
使用引用运算符(&)获取变量的地址
int age = 30;
&age 将是存储该变量的值(30)的内存的地址。
使用指针存储地址
int age = 30;
int* pAage = &age;
给指针重新赋值,使其指向另外一个变量
动态内存分配
如果在程序中使用下面这样的数组声明:
int myNums[100];
程序存在两个问题:
1.这限制了程序的容量,无法存储100个以上的数字
2.如果只需存粗1个数组,却为100个数字预留存储空间,这将降低系统的性能。
原因:数组的内存分配是静态和固定的。
使用new和deldete动态地分配和释放内存
使用new来分配新的内存块,通常情况下,如果成功,new将返回指向一个指针,指向分配的内存,否则将引发异常。使用new时,需要指定要为哪种数据类型分配内存。
Type* p = new Type;
需要为多个元素分配内存时,还可指定要为多少个元素分配内存
Type * p = new Type[num];
举例:
int* p = new int;
int* p = new int[10];
注意:使用new分配的内ucn最终都需使用对应的delete进行释放。
delete p;
delet[] p;
将关键字const用于指针
1.指针包含的地址是常量,不能修改,但可修改指针指向的数据
int day = 30;
int* const p = &day;
*p = 31;//OK!Data pointed to can be changed
int day2 = 28;
p = &day2;//Not OK! Cannot change address!
2.指针指向的数据为常量,不能修改,但可以修改指针包含的地址,即指针可以指向其他的地方。
int a = 24;
const int* p = &a;
int b = 12;
p = &b;//OK
*p = 13;//Not OK
3.指针包含的地址以及它指向的值都是常量,不能修改
int a = 24;
const int* const p = &a;
*p = 13;//Not ok
int b = 12;
p = &b;//Not Ok
使用指针时常犯的编程错误
1.内存泄漏
如果使用new动态分配的内存不再需要后,程序员没有使用配套的delete释放。
2.指针指向无效的内存单元
在使用*对指针解除引用,以访问指向的值时,务必确保指针指向有效的内存单元,否则程序要么崩溃,要么行为不端。
指针编程应该遵守一些基本原则
1.务必初始化指针变量,否则它将包含垃圾值,初始化NULL
2.务必仅再指针有效时才使用它,否则程序可能崩溃
3.对于使用new分配得内存,一定要记得使用delete进行释放,否则应用程序将泄漏内存,进而降低系统得性能。
4.使用delete释放内存块或指针后,不要访问它
5.不要对同一个内存地址调用多次delete
6.使用完动态分配得内存块后,被网络对其调用delete
引用是变量得别名。声明引用时,需要将其初始化为一个变量,因此引用只是另一种访问相应变量存储数据得方式。
要声明引用,可使用引用运算符&
VarType original = value;
VarType& ReferenceVariable = original;
using namespace std;
int main(){
int a= 30;
cout << “a=” << a << endl;
cout << “a is at address:” << &a << endl;
int*& b = a;
cout << "b is at address:" << &b << endl;
}
输出:a 和 b 的地址相同
因此,引用是真正的别名,即相应变量的另一个名字
是什么让引用很有用?
引用让您能够访问相应变量所在的内存单元。
using namespce std;
void GetSquare(int& number){
number*= number;
}
int main(){
cout << “Enter a number you wish to square”;
int number = 5;
GetSquare(number);
cout << "number = " << number << endl;
}
输出:25
将关键字const用于引用
需要禁止通过引用修改它指向的变量的值,为此可在声明引用时使用关键子const
int a = 30;
const int& b = a;
b = 45;//Not allowed:constRef can’t change value in original
int& c = b;//Not allowed.c is not const
问与答
1.我声明了两个指针
int* a = new int;
int* b = a;为了释放内存,是否需要对他们都调用delete?
答:这样做是错误的,对new返回的地址,只能调用delete一次,最好避免让两个指针指向相同的地址,因为对其中一个调用delete将导致另外一个无效。
相关文章:
C++学习笔记4
什么是指针? 指针是存储内存地址的变量。就像int变量用于存储整数值一样,指针变量用于存储内存地址。指针是一种指向内存单元的特殊变量。 内存单元地址通常使用的是16进制表示(0~9和A~F)来表示数字。显示…...
x11 gtk qt gnome kde 之间的区别和联系
Linux 下的图形库介绍 一、Linux 图形领域的基础设施 1.1 X Window X Window从逻辑上分为三层:X Server、X Client和X协议。 最底层的X Server(X服务器)主要处理输入/输出信息并维护相关资源,它接受来自键盘、鼠标的操作并将…...
MAC访问MySQL下的data目录
1.查看创建表存储路径 show variables like datadir 2.快捷键comshiftG,输入查询到的地址 3.终端输入 sudo chmod -R arwx /usr/local/mysql/data 然后输入密码即可...

WebMagic - 创意前端项目集合(点击链接可在电脑上查看效果)
WebMagic - 创意前端项目集合 欢迎来到 WebMagic 仓库!这里汇集了一系列令人惊叹的前端项目,涵盖了HTML5、CSS3和JS等多项技术。无论你是前端开发者、设计师,还是对创意互动内容感兴趣的人,这个仓库都将为你带来无尽的惊喜。 每…...
黑马项目一阶段面试58题 苍穹外卖业务逻辑15题
一、员工登录流程 1.前端在登录页面登录,发送请求 2.进入拦截器,拦截器放行所有登录页面的请求 3.进入三层架构,查询用户是否存在,若存在,则加盐加密,返回JWT的token,存放在请求头部。用户不…...
C++学习笔记总结练习: 字符串类MyString的实现
MyString是一个自定义的字符串类,它封装了一些常见的字符串操作和功能。下面是一个简单的MyString类的实现示例: #include <iostream> #include <cstring>class MyString { private:char* m_data; // 用于存储字符串的字符数组int m_length…...

测试人进阶技能:单元测试报告应用指南
为什么需要单元测试 从产品角度而言,常规的功能测试、系统测试都是站在产品局部或全局功能进行测试,能够很好地与用户的需要相结合,但是缺乏了对产品研发细节(特别是代码细节的理解)。 从测试人员角度而言࿰…...
非2的幂次的ASTC纹理格式尺寸对带宽的影响
1)非2的幂次的ASTC纹理格式尺寸对带宽的影响 2)C#端如何处理xLua在执行DoString时候死循环 3)如何制定美术规范或者各个模块的指标 4)如何处理Lua的io.open出现中文路径 这是第348篇UWA技术知识分享的推送,精选了UWA…...
Java设计模式之策略模式
1. 策略模式介绍 1、根据它来避免 if-else 或 switch 分支判断,避免使用多重条件转移语句; 2、支持“开闭原则”,可以在原有基础上选择行为方法,同时允许增加行为方法。 2. 策略模式结构类 ① 接口或抽象类:自定义接口…...

IPv4分组
4.3.1 IPv4分组 IP协议定义数据传送的基本单元——IP分组及其确切的数据格式 1. IPv4分组的格式 IPv4分组由首部和数据部分(TCP、UDP段)组成,其中首部分为固定部分(20字节)和可选字段(长度可变࿰…...

Jmeter常用功能-参数化介绍
JMeter也有像LR中的参数化,本篇就来介绍下JMeter的参数化如何去实现。 参数化:录制脚本中有登录操作,需要输入用户名和密码,假如系统不允许相同的用户名和密码同时登录,或者想更好的模拟多个用户来登录系统。 这个时…...
“深入探索JVM内部机制:解密Java虚拟机的工作原理“
标题:深入探索JVM内部机制:解密Java虚拟机的工作原理 摘要:本文将深入探索Java虚拟机(JVM)的内部机制,解密其工作原理。我们将介绍JVM的基本组成部分、类加载过程、内存管理和垃圾回收、即时编译器等关键概…...

C++超基础语法
💓博主个人主页:不是笨小孩👀 ⏩专栏分类:数据结构与算法👀 C👀 刷题专栏👀 C语言👀 🚚代码仓库:笨小孩的代码库👀 ⏩社区:不是笨小孩👀 🌹欢迎大…...
位运算相关题目:下一个数、整数转换、配对交换
题目1:下一个数 给定一个正整数,找出与其二进制表达式中1的个数相同且大小最接近的那两个数(一个略大,一个略小)。 示例: 输入:num 2(或者0b10) 输出:[4,…...

【数据结构】链表常见题目
文章目录 链表合并两个有序链表反转链表复制带随机指针的链表环形链表环形链表II相交链表移除链表元素链表中倒数第k个节点链表分割链表的回文结构链表的中间节点旋转链表链表排序链表求和 (逆序求)链表求和II (正序求)重排链表奇偶链表反转链表II <==> 链表内指定区间反…...

多家企业加入即将在2024年发射的量子卫星SpeQtral-1任务
近日,总部位于新加坡的量子通信技术公司SpeQtral宣布将与纳米航空电子公司NanoAvionics和卫星光子学公司Mbryonics合作执行即将到来的SpeQtral-1量子密钥分发(Quantum Key Distribution, QKD)卫星任务。NanoAvionics被选为卫星平台提供商&…...

shell脚本基础
目录 前言 一、概述 (一)、shell脚本基础概念 (二)、shell的类型 二、Shell变量 (一)、组成 1.变量名 2.变量值 (二)、类型 1.系统内置变量(环境变量) 2.自定…...

创建maven的Springboot项目出现错误:Cannot access alimaven
创建maven的Springboot项目出现错误:Cannot access alimaven 1)问题2) 分析问题3)解决问题 1)问题 创建maven的Springboot项目出现错误: Cannot access alimaven (http://maven.aliyun.com/nexus/content/groups/p…...
神经网络基础-神经网络补充概念-32-神经网络与大脑
概念 神经网络(Neural Networks)是受到生物神经系统启发而设计的机器学习模型,用于处理和学习复杂的数据模式。尽管神经网络的设计和工作原理与大脑有一些相似之处,但它们并不完全相同,以下是神经网络和大脑之间的一些…...
linux自动填充密码及提示信息
背景:需要自动创建nvc的登录密码 sudo apt-get install expect expect 是由Don Libes基于Tcl(Tool Command Language )语言开发的,主要应用于自动化交互式操作的场景,借助Expect处理交互的命令,可以将交互…...

XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...

dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist
现象: android studio报错: [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决: 不要动CMakeLists.…...

基于Java+VUE+MariaDB实现(Web)仿小米商城
仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意:运行前…...