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处理交互的命令,可以将交互…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...
MySQL 8.0 事务全面讲解
以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...
【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制
目录 节点的功能承载层(GATT/Adv)局限性: 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能,如 Configuration …...
