C++-------指针
把地址当做数值
在 C++ 中,指针本质上就是存储内存地址的变量。每个变量在内存中都有一个唯一的地址,通过取地址运算符 & 可以获取变量的地址,这个地址本质上是一个整数(在 32 位系统中是 32 位整数,64 位系统中是 64 位整数)。例如:
int num = 10;
int* ptr = # // ptr 存储了 num 的内存地址
这里,&num 获取 num 的地址并赋值给指针 ptr,我们就可以把这个地址当成一个数值来操作,不过通常不会像普通整数那样随意运算,更多是为了实现指针相关的语义,比如指针偏移。
声明指针变量
指针变量的声明需要指定它指向的数据类型,语法形式为 数据类型* 指针变量名。例如:
int* p1; // 指向 int 类型数据的指针
double* p2; // 指向 double 类型数据的指针
char* p3; // 指向 char 类型数据的指针
声明后指针变量需要初始化,指向合法的内存地址,否则可能出现悬空指针(野指针)的情况,引发未定义行为。初始化方式可以是指向已声明变量的地址,或者动态分配内存:
int num = 5;
int* p = #int* q = new int; // 动态分配一个 int 大小的内存,q 指向这块内存
*q = 10;
delete q; // 使用完后释放内存
基本的指针运算
- 指针偏移:指针加上或减去一个整数
n,实际偏移的字节数是n乘以指针所指向数据类型的大小。例如:
int arr[5] = {1, 2, 3, 4, 5};
int* p = arr; // p 指向数组首元素
p++; // p 指向数组第二个元素,偏移了 sizeof(int) 个字节
- 指针相减:两个指向同一数组元素的指针相减,结果是它们之间间隔的元素个数,而不是字节数。
int* p1 = &arr[1];
int* p2 = &arr[3];
int diff = p2 - p1; // diff 为 2
指向结构和对象的指针
对于结构体和类对象,同样可以用指针来指向它们:
struct Point {int x;int y;
};Point p = {1, 2};
Point* ptr = &p; // 指向结构体对象的指针// 通过指针访问结构体成员
ptr->x = 3;
ptr->y = 4;
对于类也是类似:
class MyClass {
public:void print() {cout << "Hello" << endl;}
};MyClass obj;
MyClass* pObj = &obj;
pObj->print();
关键字 this
this 是 C++ 类中的一个关键字,它是一个指向当前对象的指针。当类的成员函数被调用时,this 指针会自动传递给函数,指向调用该函数的对象实例。例如:
class Rectangle {
public:int width, height;Rectangle(int w, int h) {this->width = w;this->height = h;}
};
这里 this 用来区分形参 w、h 和类成员变量 width、height,明确表示是给类成员变量赋值。
特殊指针 NULL
NULL 是一个预定义的宏,在 C++ 中它表示空指针,即不指向任何有效内存地址的指针。通常用于指针初始化,或者判断指针是否有效:
int* p = NULL;
if (p == NULL) {// 指针未指向有效地址
}
在现代 C++ 中,更推荐使用 nullptr,它是类型安全的空指针常量,避免了一些因 NULL 类型不明确带来的潜在错误 。
指针和引用调用
- 指针调用:通过指针访问对象或变量,可以修改所指向内存的内容。例如:
void increment(int* num) {(*num)++;
}int main() {int n = 5;increment(&n);cout << n << endl; // 输出 6return 0;
}
- 引用调用:引用是对象的别名,声明形式为
数据类型& 引用名 = 对象名。引用必须初始化,之后对引用的操作等同于对它绑定对象的操作:
void increment(int& num) {num++;
}int main() {int n = 5;increment(n);cout << n << endl; // 输出 6
}
引用相较于指针,语法上更加简洁直观,且不需要像指针那样担心空指针的问题,但引用一旦绑定就不能再重新绑定到其他对象。

C++中this关键字的作用是什么?
在C++中,this关键字主要有以下几个重要作用:
- 区分成员变量和局部变量(或参数)
- 在类的成员函数中,如果局部变量(包括函数参数)与成员变量同名,使用
this指针可以明确地访问成员变量。例如:
- 在类的成员函数中,如果局部变量(包括函数参数)与成员变量同名,使用
class MyClass {
private:int value;
public:MyClass(int value) {// 使用this指针来区分参数value和成员变量valuethis->value = value;}void printValue() {std::cout << this->value << std::endl;}
};
- 这里,`this->value` 表示类的成员变量`value`,而单独的`value`在构造函数的参数列表中是指传入的参数。通过`this`指针,可以确保将参数正确地赋值给成员变量,并在其他成员函数中正确地访问成员变量。
- 在对象链式调用中返回对象本身
this指针可以用于返回对象本身,使得对象的方法调用可以像链条一样连续进行。例如,考虑一个表示数学向量的类,我们可以定义加法操作,使得多个向量相加的操作可以链式调用:
class Vector {
private:double x;double y;
public:Vector(double x, double y) : x(x), y(y) {}Vector& add(const Vector& other) {this->x += other.x;this->y += other.y;// 返回对象本身,以便进行链式调用return *this;}void print() {std::cout << "(" << x << ", " << y << ")" << std::endl;}
};
- 可以这样使用:
int main() {Vector v1(1.0, 2.0);Vector v2(3.0, 4.0);Vector v3(5.0, 6.0);v1.add(v2).add(v3).print();return 0;
}
- 在`add`函数中,`return *this`返回了当前对象的引用,这样就可以继续调用该对象的其他成员函数,实现链式操作,使得代码更加简洁和易读。
- 作为函数参数传递当前对象的地址
- 在某些情况下,可能需要将当前对象的地址传递给其他函数。
this指针本质上是指向当前对象的指针,所以可以直接将this作为参数传递。例如,当需要将对象插入到一个数据结构(如链表)中时,可能需要传递对象的指针:
- 在某些情况下,可能需要将当前对象的地址传递给其他函数。
class Node {
private:int data;Node* next;
public:Node(int data) : data(data), next(NULL) {}void insertIntoList(Node*& head) {// 一些插入节点到链表的逻辑,可能需要传递当前对象的指针if (head == NULL) {head = this;} else {// 其他插入逻辑}}
};
- 这里`this`作为当前对象(`Node`)的指针被用于在链表中插入节点的操作,帮助实现对象与其他数据结构之间的交互。
总之,this关键字在C++中是一个非常重要的工具,用于在类的内部明确地引用当前对象,提供了对成员变量和成员函数的正确访问方式,同时也支持了一些高级的编程技巧,如链式调用等。

相关文章:
C++-------指针
把地址当做数值 在 C 中,指针本质上就是存储内存地址的变量。每个变量在内存中都有一个唯一的地址,通过取地址运算符 & 可以获取变量的地址,这个地址本质上是一个整数(在 32 位系统中是 32 位整数,64 位系统中是 …...
Linux文件目录 --- 移动和改名命令MV、强制移动、试探性移动过、按时间移动
二、MV移动改名命令 重命名文件:mv [选项] 旧文件名 新文件名 移动文件/文件夹:mv [选项] 源文件 目标目录 选项作用-b当覆盖文件时会对被覆盖文件进行先行备份。-i交互式操作,当目标文件已经存在时,会询问是否覆盖。-n试探性覆盖…...
03.HTTPS的实现原理-HTTPS的工作流程
03.HTTPS的实现原理-HTTPS的工作流程 简介1. HTTPS的工作流程1.1. TCP的工作流程1.1.1. 三次握手的详细步骤1.1.2. 三次握手的作用 1.2. HTTPS的工作流程1.2.1. HTTPS与TCP的关系1.2.2. HTTPS的工作流程 2. 公钥和私钥的作用3. 对称密钥的生成和交换4. 对称加密和非对称加密的区…...
vue实现批量下载文件流并压缩
为了实现文件流压缩,我们可以使用 JSZip 和 FileSaver 这两个第三方库。JSZip 是一个用于创建、读取和编辑 .zip 文件的 JavaScript 库,而 FileSaver 则用于在客户端保存文件。 JSZip:用于创建和操作zip文件。可以通过 file 方法将文件添…...
前端入门之VUE--ajax、vuex、router,最后的前端总结
前言 VUE是前端用的最多的框架;这篇文章是本人大一上学习前端的笔记;欢迎点赞 收藏 关注,本人将会持续更新。本人不是学前端的,这个是大一的时候上学的和做的笔记,那个时候学的也蒙,故这里对前端做一个总…...
安装k8s涉及命令(方便放到txt离线使用)
查看操作系统信息 uname -a # 查看所有操作系统信息 uname -s # 查看内核名称 uname -r # 查看内核版本号 uname -m # 查看机器硬件名称 cat /etc/os-release # 查看所有操作系统信息 配置hosts cat >> /etc/hosts << EOF 172.171.16.147 crawler-k8s-mast…...
FLV视频封装格式详解
目录(?)[-] OverviewFile Structure The FLV headerThe FLV File BodyFLV Tag Definition FLVTAGAudio TagsVideo TagsSCRIPTDATA onMetaDatakeyframes Overview Flash Video(简称FLV),是一种流行的网络格式。目前国内外大部分视频分享网站都是采用的这种格式. File Structure…...
搭建vue3+vant项目架构
git代码仓库,直接下载压缩包使用 1、首先要安装node.js(18.3 或更高版本) 2、创建vue3项目 npm create vuelatest然后按照自己的需要进行选择就行 到此vue3项目创建完成,接下来是搭建项目架构 3、配置Vant (移动端ui) vue3项目引入vant,…...
【Linux】进程间通信 -> 匿名管道命名管道
进程间通信的目的 数据传输:一个进程许需要将它的数据发送给另外一个进程。资源共享:多个进程之间共享同样的资源。通知事件:一个进程需要向另一个或一组进程发送消息,通知它们发生了某种事件(如进程终止时要通知父进程…...
大数据开发学习路线
编程语言: Python:数据分析、数据预处理 Java:Hadoop和许多大数据工具的基础 Scala:用于Apache Spark数据库知识: SQL和NoSQL数据库的基本概念 数据库系统如MySQL、MongoDB等操作系统: Linux基础命令和脚本…...
华为云计算HCIE笔记05
第七章:其它模式 灾备组网 高可用性组网,单核心场景下,直接在两个站点中设置一个第三方仲裁站点,两个站点同时连接到仲裁,并且连接到对方。一旦出现问题,则由仲裁站点进行判断,进行业务切换 双核…...
wordpress网站用token登入开发过程
生成跳转token 示例: function generate_login_token($user_id, $secret_key) {$payload [user_id > $user_id,timestamp > time(),];$payload_json json_encode($payload);$signature hash_hmac(sha256, $payload_json, $secret_key);return base64_en…...
Python基础知识回顾
数据类型 Python可以区分整数(integers、下文简写为int)、浮点数(float)、字符串(string)和布尔值(Boolean)等数据类型。 1)int是可正可负的整数 2)float包…...
C++--------效率和表示
C 效率和表示 效率 时间效率:在 C 中,不同的数据结构和算法有着各异的时间复杂度。例如,访问数组元素的时间复杂度是 O ( 1 ) O(1) O(1),而遍历链表查找元素的时间复杂度最坏情况下是 O ( n ) O(n) O(n)。选择合适的算法与数据…...
在 Ubuntu 服务器上添加和删除用户
在 Ubuntu 服务器上添加和删除用户通常使用命令行工具,如 adduser、useradd、deluser 等。以下是详细的步骤和说明: 添加用户 使用 adduser 命令 adduser 是一个更为友好的脚本,用于创建新用户并设置相关信息。 添加新用户 sudo adduser 用…...
安卓 SystemServer 启动流程
目录 引言 Android系统服务启动顺序 zygote fork SystemServer 进程 SystemServer启动流程 1、SystemServer.main() 2、SystemServer.run() 3、初始化系统上下文 4、创建系统服务管理 5、启动系统各种服务 总结 引言 开机启动时 PowerManagerService 调用 AudioSer…...
深度分析 es multi_match 中most_fields、best_fields、cross_fields区别
文章目录 1. multi_match 查询的类型1.1 best_fields(默认)1.2 most_fields1.3 cross_fields 2. 不同类型的示例查询示例数据: 3. 示例 1: 使用 best_fields查询:说明: 4. 示例 2: 使用 most_fields查询:说…...
中职计算机网络技术理实一体化实训室建设方案
构建理实一体化教学模式对于改善中等职业学校计算机网络技术课程的教学现状、提升教学质量和效率具有重要意义。在中职教育不断深化改革的背景下,积极推进理实一体化教学模式的发展,不仅能够提高计算机网络技术课程的教学水平,满足教育改革的…...
Java技术专家视角解读:SQL优化与批处理在大数据处理中的应用及原理
引言 在大厂架构中,提升系统性能和稳定性是技术团队的首要任务。SQL优化与批处理作为两大关键技术手段,对于处理大规模数据和高并发请求具有重要意义。本文将从Java技术专家的视角出发,深入探讨SQL优化与批处理在大数据处理中的应用及原理&a…...
数据结构(Java版)第六期:LinkedList与链表(一)
目录 一、链表 1.1. 链表的概念及结构 1.2. 链表的实现 专栏:数据结构(Java版) 个人主页:手握风云 一、链表 1.1. 链表的概念及结构 链表是⼀种物理存储结构上⾮连续存储结构,数据元素的逻辑顺序是通过链表中的引⽤链接次序实现的。与火车…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...
基于SpringBoot在线拍卖系统的设计和实现
摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...
