1、引用与取地址符的区别
引用在右边,取地址符号在左边,例如:
//a是i的引用 a和i有相同的地址 a是i的别名
//引用不能为空
int i=0;
int &a=i;
//如下是取地址符号 其中b为指向int型j变量的指针
int j=0;
auto b=&j;
2、测试直接传值、引用传值和地址传值
void swap(int a, int b) //2.1
{
int temp=a;
a = b;
b = temp;
}
/*
void swapptr(int *pa, int *pb) //2.2 该种写法不能实现转换,因为只是交换了pa pb的地址 比如原来pa指向0x1地址 存的值是10 pb指向0x02地址 存的值是20
//现在使得pb指向10的地址 pa指向20的地址,但输出时是按地址来输出的,0x1地址仍然存的是10 没有改变。
{
int *temp1 = pa; //两个变量去操作的是地址
pa = pb;
pb = temp1;
}
*/
void swapptr(int *pa, int *pb) //2.3
{
int temp1 = *pa; //两个变量去操作的是地址
*pa = *pb;
*pb = temp1;
}
/*
void swapyin(int &yina, int &yinb) //2.4
{
int &temp2 = yina;
yina = yinb;
yinb = temp2;
}
*/
void swapyin(int &yina, int &yinb) //2.5
{
int temp2 = yina;
yina = yinb;
yinb = temp2;
}
int main(void)
{
int ar = 10;
int br = 20;
swap(ar,br);
std::cout << ar << " " << br << endl;
swapptr(&ar,&br);
std::cout << ar << " " << br << endl;
swapyin(ar,br);
std::cout << ar << " " << br << endl;
system("pause");
return 0;
}
3、调试看内存
3.1 对于2.1来说,a,b值将ar和br拷贝了一份存在不同的地址中,a,b与ar与br的地址是不同的,如下图所示:
temp变量是将83c地址中的10和840地址中的20交换,因为ar和br的地址及地址中的值并没有变换,所以swap函数执行完并没有交换两者的值。
temp变量是将83c地址中的10和840地址中的20交换,因为ar和br的地址及地址中的值并没有变换,所以swap函数执行完并没有交换两者的值。
3.2 对于第2条中2.3来说,temp1做为临时变量,开辟空间,储存ar地址920中的值,接下来将地址914中值赋给920地址,然后将原来ar中的值,赋值到914,实现了互换。
转换之前:
转换之后:
3.3 对于对于第2条中2.5来说,temp2保存了yina中的引用值,然后将b中的引用值赋值给a,原来a中的引用值赋值给b,因为yina是传进参数ra的引用,所以它们有相同的地址,于是该方法也可以实现两个变量之间的交换,最终又变成10、20。
交换前:
交换后:
输出结果如下图所示: