C++ 引用认知

引用

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)  
posted @ 2023-05-23 19:51    阅读(28)  评论(0)    收藏  举报