引用
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