个人理解:应该是这个样子,如有不对请多指教;
void swap(int *p,int *q)
{
int temp;
temp = *p;
*p = *q;
*q = temp;
}
*p及*q是指针,本质是一个内存的物理地址,而这个地址一般是用16进制表示的,但不管用什么进制表示都是一个数值,所以通过一个同样类型的temp中间变量来过渡,交换两个地址的值,从而实现两个指针指向的交换,达到要交换数值的目的。
从你的理解,我感觉你是把指针当一个箭头,是一个方向,当然某种理解上也对,但你想一下:比如*p指向1,*q指向2,直接交换指向就可以交换数值了,其实内存中1和2的真实的物理地址没有变,也就是保存1和2两个数值的地点没有改变。只是你改变了变量的指向,所以外面输出的时候,变量的两个值交换了;
下面举两个例子你看下,希望能帮到你:
1、通过一个中间变量来直接交换两个数值。
int a=1,b=2,t;
t=a;
a=b;
b=t;
这种交换是变量a和b的物理地址(即数字1,2的存储的位置)不变,把变量a中存储的1取出放到中间变量t(暂存在另一个存储位置)中,这样a变量内存空出,把b中的2取出存储a内存中,这样b变量分配到的内存空出,把t暂存的1取出存到b中,这样实现a和b数值的交换;这个过程中可以看出,变量a和变量b的所分配的内存的物理地址没变,交换的是两个内存中存储的数字。
形象举例:本来小明(变量a)住在1号屋子,小红(变量b)住在2号屋子,先在两座屋子边上另外临时找第三个屋子3号屋子(变量t),然后小明换到3号屋子,把1号屋子空出来(变量a的地址不变,分配的内存空出),接着把小红换到1号屋子;接着把小明从3号屋子(变量t)中取出换到2号房子,从而实现两个屋子换人住的目的(也就是交换a,b变量的值);
2、而通过指针实现数值交换呢,本质上来说变量a和变量b所分配内存中保存的数值在交换前和交换后没有变换,交换的是变量a与b的物理地址;
形象举例:本来小明(变量a)住在1号屋子(a分配内存的地址、指针p),小红(变量b)住在2号屋子(b分配内存的地址),通过交换两家房子的门牌号(交换变量a和b所分配内存的地址)来实现小明换到2号屋子,小红换到1号屋子的目的;其实上两人并没有换屋子住,换的是屋子的门牌号;
ps:你定义一个*temp(其实这个指针你定义出来没有赋初值,也就是个空指针,没有分配内存的),
[此贴子已经被作者于2016-5-4 08:28编辑过]