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

浅析C++指针与引用,栈传递的关系

目录

前言

C++

堆指针

栈指针

常量指针

指针常量

引用 

 常量引用

总结


前言

目前做了很多项目,接触到各种语言,基本上用什么学什么,语言的边际就会很模糊,实际上语言的设计大同小异,只是语言具备各自的特性区别。其中一个重要的概念是指针,这个在C语言就风靡的技术,实际上在各个语言或显示或隐世的体现出来,而且在函数或者方法栈的调用展现本质相同的现象。相对而言Golang和Java在设计的时候差不多,C++概念真多。

C++

C++的指针,指针拓展至C,实际上默认情况下C++的指针类似go或者Java的引用,但是有特殊的定义,比如常量指针,指针常量,还有引用,demo如下。

堆指针

C++有栈对象和堆对象内存分配的说法,堆对象的指针需要手动回收。


#include <iostream>using namespace std;class Person{int age;string name;public:Person(){}Person(string name, int age){this->name = name;this->age = age;}string sayHello(){return name + " : " + to_string(age);};
};void setPerson(Person* person){delete person;new Person("tom", 35);//省略写法,默认就会对person赋值
//    Person p;
//    person = &p;
};int main(){Person* person = new Person("JIM", 33);setPerson(person);string result = person->sayHello();cout << result << endl;delete person;return 0;
}

随意写了一个类,使用指针访问,当然也可以创建栈对象,取地址,结果如下

TOM : 35

在指针的时候,即使在方法栈中赋值也会影响数据的改变,这个在Golang和Java中是不存在的,当然Golang类似C语言,可以使用指针的指针模拟这种情况,这就是为什么说Golang是最接近C语言的,C语言也是这么做的。 笔者也写了其他文章:go 函数或者方法参数调用的过程_fenglllle的博客-CSDN博客

栈指针

如果使用栈对象,不需要手动回收内存,引用计数法自动回收


#include <iostream>using namespace std;class Person{int age;string name;public:Person(){}Person(string name, int age){this->name = name;this->age = age;}string sayHello(){return name + " : " + to_string(age);};
};void setPerson(Person* person){//delete person;
//    new Person("tom", 35);Person p("TOM", 35);person = &p;
};int main(){Person person = Person("JIM", 33);setPerson(&person);string result = person.sayHello();cout << result << endl;//delete person;return 0;
}

结果就跟Java的模式一样

JIM : 33

如果直接修改地址的值,那么是可以修改的

#include <iostream>using namespace std;class Person{int age;string name;public:Person(){}Person(string name, int age){this->name = name;this->age = age;}void setPerson(string name, int age){this->name = name;this->age = age;}string sayHello(){return name + " : " + to_string(age);};
};void setPerson(Person* person){//delete person;
//    new Person("tom", 35);
//    Person p("TOM", 35);
//    person = &p;person->setPerson("TOM", 35);
};int main(){Person person = Person("JIM", 33);setPerson(&person);string result = person.sayHello();cout << result << endl;//delete person;return 0;
}

结果如下,这个经常在Java的八股文中提到,实际上就是对指针的使用,只不过Java的对象都分配至堆中(因为GC,发展了很多代)

TOM : 35

常量指针

实际上就是指针,指向常量的指针,就跟函数指针和指针函数的区别类似,是指针,意味着内存地址是可以修改的,指向的常量,意味着内存地址的值是不可修改的

const int*按照从先到后解析,表示是一个指针,使用常量修饰符的指针(跟Golang相反)

这个与Java和Golang不一样,在Java和Golang没有常量指针的设计,或者说没有限制指针只能指向常量。

指针常量

顾名思义:int* const 表示指针修饰常量,指针是常量,表示指针指向的内存地址不能修改,但是指针指向内存地址的值可以修改。在Java里面比如final List<String> list,在Golang限制使用指针类型为常量修饰。

报错与上面刚刚相反,可以修改值,但是不能修改地址 。

引用 

引用的本质就是指针常量,就是上面的简化写法。

 常量引用

 这个就类似Golang了,常量不允许修改值。

总结

实际上语言学多了,设计都差不多,只不过出于不同的能力考虑,功能就有额外的区别,所以就会有xx语言适合xx开发的说法,在实际运用中,可以一边做项目一边学习。比如笔者最近想看明白JDK的底层实现和K8S的一些ebpf的内容,就需要学习C++,不过C++的关键字是真多,而且语法很细,远超其他语言。比如指针,可能就是因为C语言没有细化指针,而C++具体化了。

相关文章:

浅析C++指针与引用,栈传递的关系

目录 前言 C 堆指针 栈指针 常量指针 指针常量 引用 常量引用 总结 前言 目前做了很多项目&#xff0c;接触到各种语言&#xff0c;基本上用什么学什么&#xff0c;语言的边际就会很模糊&#xff0c;实际上语言的设计大同小异&#xff0c;只是语言具备各自的特性区别。…...

图解LeetCode——剑指 Offer 10- II. 青蛙跳台阶问题

一、题目 一只青蛙一次可以跳上1级台阶&#xff0c;也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。 答案需要取模 1e97&#xff08;1000000007&#xff09;&#xff0c;如计算初始结果为&#xff1a;1000000008&#xff0c;请返回 1。 二、示例 2.1>…...

【Linux】用户分类+权限管理+umask+粘滞位说明

目录 1.用户分类 su指令 2.认识Linux权限 2.1 文件访问者的分类 2.2 文件类型和访问权限 a. 文件类型 file指令 b. 访问权限 2.3 文件权值的表示方法 a. 字母表示法 b. 八进制表示法 3.如何修改文件访问者的权限及相关指令 1. chmod指令 2. chown指令 3. chgrp指…...

【干货】如何打造HR无法拒绝的简历?测试开发大牛带手把手你写简历!

通过率90%&#xff0c;优秀的软件测试简历长什么样&#xff1f; 也许口才好的人会觉得简历不重要&#xff0c;能说就行了&#xff0c;那是因为你没有体会过石沉大海的感觉&#xff01; 很多人觉得疑惑&#xff0c;为什么我投了那么多简历&#xff0c;都没有接到面试通知&…...

nodejs学习-4:nodejs连接mongodb和相关操作

1. express生成器生成express模板 前提需要首先下载好&#xff1a;express-generator&#xff0c;命令如下(全局安装) npm install -g express-generator生成模板命令如下&#xff1a; express 项目名称 --viewejs // --view 参数表示前端界面使用的引擎&#xff0c;这里使用…...

【博客629】Linux DNS解析原理与配置

Linux DNS解析原理与配置 1、DNS缓存 作用&#xff1a; 程序客户端、下游的 DNS 服务器每次查询 DNS 成功之后&#xff0c;通常会将该 DNS 记录缓存一段时间&#xff0c;避免频繁发出查询请求的耗时。 Linux下的DNS缓存&#xff1a; Linux 系统默认不会在本地建立 DNS 缓存…...

【CSP】202212-2 训练计划

题目 问题背景 西西艾弗岛荒野求生大赛还有 天开幕&#xff01; 问题描述 为了在大赛中取得好成绩&#xff0c;顿顿准备在 天时间内完成“短跑”、“高中物理”以及“核裂变技术”等总共 项科目的加强训练。其中第 项&#xff08; &#xff09;科目编号为 &#xff0c;也可简…...

java基础学习 day42(继承中构造方法的访问特点,this、super的使用总结)

继承中&#xff0c;构造方法的访问特点 父类的构造方法不会被子类继承&#xff0c;但可以通过super()调用父类的构造方法&#xff0c;且只能在子类调用&#xff0c;在测试类中是不能手动单写构造方法的。子类中所有的构造方法默认先调用父类的无参构造&#xff0c;再执行自己构…...

生物医药多组学与生物信息方法介绍

基因组学告诉你可能发生什么&#xff0c;转录组学和蛋白组学告诉你即将发生什么&#xff0c;而代谢组学告诉你正在发生什么 1、多组学与生信方法 生物医学技术的组学包括基因组学、转录组学、蛋白质组学、代谢组学和表观基因组学等。这些组学研究领域通过大量数据的高通量技术…...

3|物联网控制|计算机控制-刘川来胡乃平版|第2章:计算机控制系统中的检测设备和执行机构-2.2过程控制中常用的执行器|课堂笔记|ppt

...

【进阶篇】线程的硬件基础

文章目录高速缓存缓存一致性协议写缓冲区和无效化队列高速缓存 简介 高速缓存是主内存与处理器之间的硬件&#xff0c;其容量小于主存&#xff0c;但存取速率远高于主存。因此处理器在执行读写操作时&#xff0c;可直接和高速缓存交互&#xff0c;提高响应速度。 我们常见的变…...

关于 ISP Tuning的学习,分享几点看法

关于学习&#xff0c;分享几点看法&#xff0c;欢迎讨论 。1、分阶段性的&#xff0c;阶梯式学习。2、带目的性的&#xff0c;任务式学习。3、有总结性的&#xff0c;输出式学习。如上3条&#xff0c;可以依次循环去执行&#xff0c;下面我以 ISP Tuning 的学习为例&#xff0c…...

RocketMQ源码阅读

没有用过rocketmq&#xff0c;但是一直对RocketMQ的实现很感兴趣&#xff0c;本次阅读源码基于5.0.0 一、 nameserver 通过源码阅读发现&#xff0c;它的作用主要是当作一个注册中心&#xff0c;注册broker、topic等信息&#xff0c;维护topic以及broker队列的路由信息&#…...

重磅 | 小O软件新品【鲸鱼地图】发布

千呼万唤始出来.......&#xff0c;小O系列软件又添新品【鲸鱼地图】&#xff01;&#xff01;&#xff01; 2023年新年伊始&#xff0c;小O就投入到新品研发工作中&#xff0c;秉承“发现地理价值”理念&#xff0c;为用户提供更加好用、易用的地图软件产品&#xff0c;经过春…...

软考高级信息系统项目管理师系列之二十五:项目合同管理

软考高级信息系统项目管理师系列之二十五:项目合同管理 一、项目合同管理内容整理一、合同管理基本概念1.项目合同管理定义2.合同的分类3.合同类型选择4.合同内容二、合同管理过程1.合同管理过程的内容2.合同签订和履行管理3.合同变更和档案管理4.合同违约索赔管理项目合同管理…...

测试开发之Django实战示例 第十三章 上线

在上一章&#xff0c;为其他程序与我们的Web应用交互创建了RESTful API。本章将学习如何创建生产环境让我们的网站正式上线&#xff0c;主要内容有&#xff1a;配置生产环境创建自定义中间件实现自定义管理命令1创建生产环境现在该将Django项目正式部署到生产环境中了。我们将按…...

python实战应用讲解-【语法基础篇】Python中的数值类型(附示例代码)

目录 前言 数值类型 十六进制、八进制和二进制 Python 数值类型转换 数值和表达式 前言...

Git常用命令以及如何在IDEA中使用Git

前言Git是一个分布式版本控制工具&#xff0c;主要用于管理开发过程中的源代码文件&#xff08;Java类、xml文件、html页面等&#xff09;。Git在管理文件过程中会记录日志&#xff0c;方便回退到历史版本&#xff1b;Git存在分支的概念&#xff0c;一个项目可以有多个分支&…...

音乐播放器-- 以及数据库数据存储

运行环境 &#xff1a; java1.8 数据库以及代码编写工具 &#xff1a; sqlserver -- mysql 也可以 工具 eclipse 编码gbk窗体 &#xff1a; Swing使用了jaudiotagger 进行了音乐处理 图片展示 ----- 空闲时间 做出来玩的项目 部分功能还没有完善 完善了的功能 音乐 /// 主页 &a…...

[JAVA安全]Spring Messaging之CVE-2018-1270

漏洞简介 Spring 框架中通过spring-messaging 模块来实现 STOMP &#xff08;Simple Text-Orientated Messaging Protocol&#xff09;,STOMP是一种封装 WebSocket的简单消息协议。攻击者可以通过建立WebSocket连接并发送一条消息造成远程代码执行&#xff0c; spring-messagin…...

前端(vue)学习笔记(CLASS 7):vuex

vuex概述 vuex是一个vue的状态管理工具&#xff0c;状态就是数据 大白话&#xff1a;vuex是一个插件&#xff0c;可以帮我们管理vue通用的数据&#xff08;多组件共享的数据&#xff09; 场景 1、某个状态在很多个组件来使用&#xff08;个人信息&#xff09; 2、多个组件…...

Python读取阿里法拍网的html+解决登录cookie

效果图 import time from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager from lxml import etreedef get_taobao_auct…...

Langgraph实战--自定义embeding

概述 在Langgraph中我想使用第三方的embeding接口来实现文本的embeding。但目前langchain只提供了两个类&#xff0c;一个是AzureOpenAIEmbeddings&#xff0c;一个是&#xff1a;OpenAIEmbeddings。通过ChatOpenAI无法使用第三方的接口&#xff0c;例如&#xff1a;硅基流平台…...

simulink这边重新第二次仿真时,直接UE5崩溃,然后simulink没有响应

提问 &#xff1a; simulink这边重新第二次仿真时&#xff0c;直接UE5崩溃&#xff0c;然后simulink没有响应 simulink和UE5仿真的时候&#xff0c;simulink这边先停止仿真&#xff08;也就是官方要求的顺序——注意&#xff1a;如果先在UE5那边停止仿真&#xff0c;如果UE5这…...

程序代码篇---Python串口

在 Python 里&#xff0c;serial库&#xff08;一般指pyserial&#xff09;是串口通信的常用工具。下面为你介绍其常用的读取和发送操作函数及使用示例&#xff1a; 1. 初始化串口 要进行串口通信&#xff0c;首先得对串口对象进行初始化&#xff0c;代码如下&#xff1a; i…...

PDF 转 Markdown

本地可部署的模型 Marker Marker 快速准确地将文档转换为 markdown、JSON 和 HTML。 转换所有语言的 PDF、图像、PPTX、DOCX、XLSX、HTML、EPUB 文件在给定 JSON 架构 &#xff08;beta&#xff09; 的情况下进行结构化提取设置表格、表单、方程式、内联数学、链接、引用和代…...

tableau 实战工作场景常用函数与LOD表达式的应用详解

这是tableau实战工作场景图表制作第七期--常用函数与LOD表达式的应用 数据资源已经与这篇博客捆绑&#xff0c;有需要者可以下载通过网盘分享的文件&#xff1a;3.2-8月成交数据.xlsx等3个文件 链接: https://pan.baidu.com/s/17WtUoZTqzoNo5kTFjua4hw?pwd0623 提取码: 06…...

Dynamics 365 Finance + Power Automate 自动化凭证审核

&#x1f680; Dynamics 365 Finance Power Automate 自动化凭证审核 &#x1f4d1; 目录 &#x1f680; Dynamics 365 Finance Power Automate 自动化凭证审核1. 依赖 &#x1f527;2. 目标 &#x1f3af;3. 系统架构 &#x1f3d7;️4. 凭证审批全流程 &#x1f6e0;️4.1 …...

Python 函数全攻略:函数进阶(生成器、闭包、内置函数、装饰器、推导式)

一、默认参数中的易错点 问题: 当函数的默认参数是可变类型(如 list, dict)时,存在“坑”。 现象: def func(a2=[]): # a2 默认是一个空列表a2.append(2)print(a2)func() # 第一次调用,a2 默认为 [],输出 [2] func([]) # 传入新列表,输出 [2] func([1]) # 传入带元素的…...

408第一季 - 数据结构 - 字符串和KMP算法

闲聊 这章属于难点但考频低 3个名词记一下&#xff1a;模式匹配&#xff0c;主串&#xff0c;字串&#xff08;模式串&#xff09; 举个例子 主串 aabaaaabaab 字串 aabaab 模式匹配 从主串找到字串 暴力解法 也是不多说 很暴力就是了 KMP算法 next数组 它只和字串有关 先…...