|
void swap(int *p1,int *p2)
{ //p1 = 0x0012fa84 p2 = 0x0012fa78
int i = *p1; //*p1 = 23 i = 23;
*p1 = *p2; //*p2 = 45 此时重点来了,当*p1是在"="号的前面,表示的含义是指针指向的数值(而不是地址)被赋值为45,如下图1
*p2 = i; //*p2表示的含义同图1
}
int main()
{
int i,j;
i = 23; //&i = 0x0012fa84
j = 45; //&j = 0x0012fa78
swap(&i,&j);
}
void swap2(int &a1,int &a2)
{//此时,a1,a2的值分别是33,55。
int t = a1;
a1 = a2;
a2 = t;
//上面的三个步骤执行完之后,a和b的数值会被互换,ri和rj的数值也会被互换。
}
int main()
{
int a,b;
a = 33;
b = 55;
int &ri = a;
int &rj = b; //当执行到这一步的时候,看内存情况,如图2:
// 如上面的情况,&ri和&rj 中的&在"="的前面,表示的含义是创建了2个别名,ri,rj。如果执行语句ri = 44;那么a的值也会是44。
CString stri;
stri.Format(_T("%d"),ri);
swap2(a,b);
stri.Format(_T("%d"),ri);
}
也许有人会问了,上面的函数swap2(int &a1,int &a2),可以写成下面的模样吗?
swap2(int a1 ,int a2)
回答:这么编写可以,没有错误。但是,你传递的参数就变成了数值,那么a和b的数值不会互换,ri和rj的数值也是一样,不会互换。 |
-
图1
-
图2
上一篇: 基于UDP的select函数用法下一篇: 关于using namespace 的解释
|