用来实现交换的swap函数(交换指针 or 交换指针所指的值?)

1. 如何用指针交换两个数的值?

——我们都知道使用swap函数。

2. 以下有两种swap函数,

//交换指针
void swap1(int *a,int *b)  
{  
    int *c;  
    c=a;
    a=b;
    b=c; 
}  
//交换指针所指向的变量值
void swap2(int *a,int *b)  
{  
    int c;  
    c=*a;
    *a=*b;
    *b=*c; 
}  

能否都能实现值的交换?

//验证如下
int main(){
    int x=3,y=5;
    int *p=&x,*q=&y;
    printf("x=%d,y=%d\n",*p,*q);
    
    swap1(p,q);
    printf("swap1:x=%d,y=%d\n",*p,*q);
 
    swap2(p,q);
    printf("swap2:x=%d,y=%d\n",*p,*q);

    system("pause");
    return 0;
}

运行结果:
在这里插入图片描述

3. 分析如下

  • swap1()

对于C/C++语言来说,在调用函数时系统是传值给函数。所谓的“形参”和“实参”只是参数和值的关系,并不是实参取代了形参。

一个典型的例子:

void swap(int x, int y){
    int t;
    t=x;
    x=y;
    y=t;
}
int main(){
    int a=3,b=5;
    swap(a,b);
    printf("swap:a=%d,b=%d\n",a,b);
    return 0;
}

运行结果:
在这里插入图片描述
可知,这个函数无法实现值的交换。

分析:a的值传给了x,b的值 传给了y,x与y在swap函数的变量空间中进行了交换。当swap函数结束,x、y释放空间,main函数中的a、b没有任何变化。 也就是x、y与a、b没有关系。自己可以调试一下,在main函数中,x、y显示“Not found in current context.”,在swap函数中,a、b也会显示。

因此!上面的swap1函数也是一样的,它传递的是地址(地址也是值)。swap1函数内部指针a和指针b交换,但main函数中指针p和指针q,即a和b的地址并没有交换。

  • swap2()

main函数中的p、q分别传递给swap2函数中的a、b,也就是a与p、b与q的值是一样的,都是x和y的地址。在swap2函数中改变该地址上的值,那么main函数中该地址上的值同时也发生了变化。 因为地址是共享的。

~~ ~~
【结论】
指针互换无法实现值互换,但是,互换指针所指向的值可以实现。

4. 交换值的另一方法——引用

void swap(int &x, int &y){
    int t;
    t=x;
    x=y;
    y=t;
}
int main(){
    int a=3,b=5;
    swap(a,b);
    printf("swap:a=%d,b=%d\n",a,b);
    return 0;
}

运行结果:
在这里插入图片描述
形参x是实参a的引用,形参y是实参b的引用,实参取代了形参,所以对形参的操作实际就是对实参的操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值