首页 > 编程语言 >C++ 引用认知

C++ 引用认知

时间:2023-05-23 20:00:42浏览次数:38  
标签:int 认知 mov C++ eax 引用 printf var ptr

引用

0x00 引用是什么?

  • 在应用层面是数据的别名, 值、数据宽度、数据地址、加、减与指向的类型一样。

  • 在汇编里 引用和指针指令、数据宽度一样
    编译器经行了处理,个人推测: 当你调用引用类型时,编译器帮咱们直接加*处理。

给引用赋值 : 不能直接赋值;

    int& a = (int&)7; //C2101	常量上的“&”

需要通过一个中间变量吗? 编译通过。

int var = 7;
int& a = var;

打印结果看看? 是什么?

int var = 7;
int& a = var;
printf("%d\n", a);  //a = 7

能否++、-- ?

    printf("%d\n", a); // 7
    a++;
    printf("%d\n", a); // 8
    a--;
    printf("%d\n", a);// 7

宽度是多少?

int var = 7;
int& a = var;
printf("%d\n",sizeof(a));  //4字节
char var_2 = 'c';
char& b = var_2;
printf("%d\n",sizeof(b)); //1字节

它们的地址一样吗?

int var = 7;
int& a = var;
printf("%x,%x\n", &var, &a);//0x10ffc58,0x10ffc58


修改下引用类型的值,看看指向的那个值发生变化没?

    int var = 7;
    int& a = var;
    a = 9;
    //printA(a);
    printf("%x,%x\n", var, a); //9, 9	

结论Ⅰ:引用类型的值、数据宽度、数据地址、加、减与指向的类型一样。

看看汇编代码显示?

9:     int var = 7;
 mov         dword ptr [var],7  
10:     int& a = var;
 lea         eax,[var]  
 mov         dword ptr [a],eax  

lea eax,[var] 看到了lea: 取地址操作。 尝试用指针类型对比。

9:     int var = 7;
 mov         dword ptr [var],7  
10:     int* a = &var;
 lea         eax,[var]  
 mov         dword ptr [a],eax  

结论Ⅱ: 在汇编成面上, 引用、指针指令是一样

在形参传值是什么效果?

void printA(int& a) {
    printf("%d\n", a);
}

int var = 7;
int& a = var;
printA(a);
    13:     int var = 7;
 mov         dword ptr [var],7  
    14:     int& a = var;
 lea         eax,[var]   //将 var的地址取出放置eax内部
 mov         dword ptr [a],eax  将eax值存入[a]
    15:     printA(a);
 mov         eax,dword ptr [a]  将[a]里的值出去放置eax 相当于传递了var的地址。
 push        eax  
 call        printA (01C1433h)  

标签:int,认知,mov,C++,eax,引用,printf,var,ptr
From: https://www.cnblogs.com/ducnblog/p/17426217.html

相关文章

  • UE4学习笔记:Windows系统下如何在C++项目里调用第三方动态库
    本随笔介绍在Windows系统下,由UE4引擎创建的C++项目里如何实现调用第三方动态库的方法。随笔作者还在学习阶段,对UE4引擎的使用和理解还不是非常透彻,难免会在随笔内容里出现技术上或书写上的问题,如果出现了类似的问题欢迎在评论区或者私信讨论。 目录设置第三方库头文件的路......
  • c++打卡练习(37)
    比较两个分数的大小流程图:伪代码:源代码:#include<iostream>usingnamespacestd;intmain(){ inta1,a2,b1,b2,c1,c2,d1,d2,i; cout<<"输入要比较的两个分数"<<endl; cin>>a1; getchar(); cin>>a2; cin>>b1; getchar(); cin>>b2; if(a2>b2){ ......
  • perl 通过 swig 调用 c++ 代码
    perl通过swig调用c++代码  Swig是一个软件开发工具,可以简化不同语言与C/C++的交互(直接在其它语言的代码中调用C/C++的代码)。  记录一下成功用perl调用c++代码的例子。环境操作系统:centos7.9perl:version5.16.3swig:version2.0.10g++:version9.4.0......
  • 泛型编程(GP)和C++标准模板库(STL)
    GenericProgramming(GP)泛型编程,就是使用template(模板)为主要工具来编写程序level0:使用C++标准库level1:认识C++标准库level2:良好使用C++标准库level3:扩充C++标准库C++StandardLibraryC++标准库,编译器带的,可以看到sourcecode至于StandardTemplateLibrary->STL标......
  • C++ 线程安全和可重入函数
    线程安全线程安全是指在多线程环境下,同一函数或函数库被不同线程调用,不会出现数据不一致的情况。如何确保一个函数是线程安全的:1.对共享资源加锁。2.从逻辑上进行设计,保证资源的访问修改不会冲突。一般情况下我们使用加锁的方式保证线程安全,具体加锁操作有互斥锁、条件变量、......
  • C++
    实现一个类模板,它可以接受一组数据,能对数据排序,也能输出数组的内容。每行输入的第一个数字为0,1,2或3:为0时表示输入结束;为1时表示将输入整数,为2时表示将输入有一位小数的浮点数,为3时表示输入字符。如果第一个数字非0,则接下来将输入一个正整数,表示即将输入的数据的数量。templat......
  • c++打卡第三十五天
    一、最大公约数1、问题描述 2、设计思路本题中可以有三种算法,其中我们提供第三种辗转相除法的代码,第一种是从1开始,由于最大公约数可以是最小的那个数,所以我们循环条件到两个之中的小数,如果这个数满足可以整除两个整数,遍历到最大的那个数时,打印出来。第二种是从小数开始循环,当......
  • C++ 模板 使用 enum 代替 typename
    enumtestEnum{A,B,C};template<testEnumC>classTestClassTemplate{public:voidprint(){printf("common\n");}};template<>classTestClassTemplate<A>{public:voidprint(){printf(&quo......
  • SQLite3 客户端程序,Win32 SDK ,C/C++
    1 WIn32SDK程序,尽量放在一个文件中,主要用到Tree,ListView,Edit控件。2 把控件封装成类,但不封装窗口回调函数。类实例为全局变量,方便消息回调函数调用执行。这样做最简单。3 Edit控件处理按键输入,模仿shell执行SQL查询4打开数据库文件时若没有此文件则新建,否则打开,打开......
  • c++的前世今生
    C++语言是本贾尼·斯特劳斯特卢普在1982年发明的,早期版本被称为CwithClasses,之后在1983年更名为C++。C++语言在发明后很快就获得了广泛的应用,由于其具有高效、灵活和兼容性强的特点,成为了许多领域的首选编程语言。在计算机科学和工程领域,C++语言被广泛用于开发操作系统、......