首页 > 编程语言 >C++逆向分析——引用

C++逆向分析——引用

时间:2023-04-09 10:56:10浏览次数:40  
标签:逆向 int C++ 引用 printf 类型 ref 指针

引用类型

引用类型就是变量的别名,其在初始化时必须要赋值。

// 基本类型 int x = 1; int& ref = x; ref = 2; printf("%d \n",ref);   // 类 Person p; Person& ref = p; ref.x = 10; printf("%d \n",p.x);   // 指针类型 int****** x = (int******)1; int******& ref = x; ref = (int******)2; printf("%d \n",x);   // 数组类型 int arr[] = {1,2,3}; int (&p)[3] = arr; p[0] = 4; printf("%d \n",arr[0]);

如上是引用类型作用在各个类型下的例子,那么引用类型是如何实现的呢?其本质是什么?我们可以看下反汇编代码:

images/download/attachments/12714553/image2021-4-4_23-6-8.png

会发现这段反汇编和指针的反汇编一模一样的:

images/download/attachments/12714553/image2021-4-4_23-7-49.png

这时候我们暂时的出结论:引用类型就是指针。

但如果引用类型就是指针,为什么C++需要新创建一个引用类型的概念呢?它们之间必然存在着一些区别,我们可以从初始化、运算、赋值来看反汇编代码的区别:

images/download/attachments/12714553/image2021-4-4_23-17-23.png

我们可以很清晰的看见区别从运算到赋值都不一样,指针运算到赋值改变的是指针本身,而不是指针指向的那个地址,而引用则不一样其从运算到赋值改变的是所引用的变量,我们得出这几个结论:

  1. 引用必须赋初始值,且只能指向一个变量,从一而终(专一);

  2. 对引用赋值,是对其指向的变量赋值,而不是修改引用本身的值;

  3. 对引用做运算,就是对其指向的变量做运算,而不是对引用本身做运算;

  4. 引用类型就是一个弱化了的指针;个人理解:引用类型就是一个*p

images/download/attachments/12714553/image2021-4-4_23-25-6.png

C++设计引用类型是因为指针类型很难驾驭,一旦用不好就回出问题,所以取长补短设计了引用类型。

那么引用类型在实际开发中的作用是什么呢?我们可以用在函数参数传递中:

#include <stdio.h>   void Plus(int& i) { i++; return; }   void main() { int i = 10; Plus(i); printf("%d \n", i); return; }

如上代码中Plus函数的参数是一个引用类型,当我们把变量i传递进去,i就会自增1,而实际上也就修改变量i本身的值;换一种说法就是,我们之前函数参数传递的是值,而这里传递的是变量的地址。

images/download/attachments/12714553/image2021-4-4_23-34-17.png

那么在构造类型中又是怎么样的呢?

#include <stdio.h>   class Base { public: int x; int y; Base(int a, int b) { this->x = a; this->y = b; } };   void PrintByRef(Base& refb, Base* pb) {   printf("%d %d \n", pb->x, pb->y);   printf("%d %d \n", refb.x, refb.y);   }   void main() { Base b(1, 2);   PrintByRef(b, &b); return; }

images/download/attachments/12714553/image2021-4-4_23-46-5.png

我们可以看见除了读取的表现形式不一样,实际上汇编代码是一模一样的;但是指针类型是可以重新赋值并运算的,而引用类型不可以。

当一个变量是int类型的,而我们引用类型却是一个其他类型的,会怎么样呢?

int x = 10; Person& ref = (Person&)x;

这是可以编译的,但是没有实际意义,所以在使用引用的时候原来是什么类型就应该使用什么类型。

大家都知道,我们使用指针的时候是可以修改指针本身的,这会存在一定的风险,而C++中提供了引用类型,不可以修改引用本身,我们可以修改被引用的值,当我们不想其他人修改引用类型对应引用的值,可以使用const这个关键词,这种方式我们称之为常引用:

images/download/attachments/12714553/image2021-4-4_23-56-58.png

标签:逆向,int,C++,引用,printf,类型,ref,指针
From: https://www.cnblogs.com/bonelee/p/17299988.html

相关文章

  • C++逆向分析——继承与封装
    面向对象程序设计之继承与封装之前已经学习过继承和封装了,但是要在实际开发中使用,光学语法和原理是不够的,在设计层面我们需要做一些优化。如下代码是继承的例子:#include<stdio.h> classPerson{public:intAge;intSex; voidWork(){printf("Person:Work()......
  • C++逆向分析——多态和虚表
    虚表上一章了解了多态,那么我们来了解一下多态在C++中是如何实现的。了解本质,那就通过反汇编代码去看就行了,首先我们看下非多态的情况下的反汇编代码:然后再来看下多态情况下的反汇编代码:很明显这里多态的情况下会根据edx间接调用,而非多态则会直接调用。那么我们来看下间接......
  • OS-Linux-Ubuntu22.04x64-Python-C++调用Python缺少Python.h
    OS-Linux-Ubuntu22.04x64-Python-C++调用Python缺少Python.h使用C或C++扩展Python扩展和嵌入Python解释器Python3.10.11Python/CAPI参考手册Python3.11.3Python/CAPI参考手册参考https://www.cnblogs.com/lidabo/p/17043302.htmlhttps://blog.csdn.net/z......
  • C++ Allocator
    C++Allocator该开始搞项目了,但是在搞项目之前,先搞一下C++的Allocator,因为项目中会用到。现在还不确定到底模仿哪个,jemalloc和tcmalloc,先看看吧。1.为什么需要Allocator其实和new/delete是等价的,但是可以屏蔽一些底层细节,因为不一定所有平台都提供统一的内存分配方式,所以需要......
  • 2023年第14届蓝桥杯大赛软件赛省赛 C/C++ 大学 B 组
    2023年第14届蓝桥杯大赛软件赛省赛C/C++大学B组试题A:日期统计(5)直接暴力,8个for+优化,2~5分钟跑完。答案:365点击查看代码#include<bits/stdc++.h>usingnamespacestd;typedeflonglongLL;constintN=1e6+10,INF=0x3f3f3f3f;intmon[]={0,31,28,......
  • C++函数重载和对象
    函数的默认参数intfun(inta,intb=10,intc=20){returna+b+c;}intmain(){cout<<fun(10)<<endl;//当参数有值时也可以输出正确,如果程序员加了返回值就用程序员加入的值。}形参的数据从左到右当中间有参数后面也需要定义一个函数和声明只能实现一个;占位参数voidfun(int*a,int......
  • wpf CommunityToolkit.Mvvm8.1 MVVM工具包安装引用指南
    CommunityToolkit.Mvvm包(又名MVVM工具包,以前名为Microsoft.Toolkit.Mvvm)是一个现代、快速且模块化的MVVM库。它支持:.NETStandard2.0、.NETStandard2.1和.NET6(UIFramework不支持) 文档地址:https://learn.microsoft.com/zh-cn/dotnet/communitytoolkit/mvvm/......
  • 第十四届蓝桥杯大赛软件赛省赛C/C++大学生B组
    第十四届蓝桥杯大赛软件赛省赛C/C++大学生B组试题A:日期统计A题直接枚举即可,枚举日期,暴力匹配#include<iostream>#include<algorithm>#include<vector>usingnamespacestd;boolcheck(stringt){ if(t.substr(0,4)!="2023")returnfalse; stringmon=t.substr(4,2......
  • C++多核多线程同步实现
    使用MakefileC++11工程模拟dsp的多核同步逻辑,使用多线程模拟多核,多个线程通过C++11的条件变量实现同步。当某一线程执行到同步函数syn_func时,判断是否其他线程执行到此处了,若有其他线程没有执行到此处,本线程就应阻塞。当最后一个线程执行到同步函数时,通知所有线程解除阻塞,实现......
  • 小程序自定义组件 - 创建与引用
    简单理解组件即"页面的一部分".组件化开发也更多是为了代码复用,方便管理和提高开发效率.前端的组件化开发我想大抵也是借鉴后端开发思想吧.从前端的实现来看,以vue为例即通过扩展自定义HTML标签的的形式,让其局部拥有"单文件"的功能(包括了模板,样式,逻辑).然后组......