传递动态内存

传递动态内存:

下面5个幻术哪一个能够成功进行两个数的交换?


#include   <iostream> 
using   namespace   std; 

void swap1(int p, int q)
{
    int temp;
    temp=p;
    p=q;
    q=temp;
}  

void swap2(int *p, int *q)
{
    int *temp;
    *temp=*p;
    *p=*q;
    *q=*temp;
} 

void swap3(int *p, int *q)
{
    int *temp;
    temp=p;
    p=q;
    q=temp;
}  

void swap4(int *p, int *q)
{
    int temp;
    temp=*p;
    *p=*q;
    *q=temp;
}         

void swap5(int &p,int &q)
{
    int temp;
    temp=p;
    p=q;
    q=temp;
} 

int main(){
    int a=1,b=2;
    //swap1(a,b);
    //swap2(&a,&b);
    //swap3(&a,&b);
    //swap4(&a,&b);
    //swap5(a,b);

    cout <<a <<"  " <<b << endl;
return 0;

}


 

swap1传的是值的副本,在函数体内被修改了形参p、q(实际参数a、b的一个拷贝),p、q的值的确交换了,但是它们是局部变量,不会影响到主函数中的a和b。当函数swap1生命周期结束时,p,q所在栈也就被删除了。

swap2传的是一个地址进去,在函数体内的形参*p、*q是指向实际参数a、b地址的两个指针。但是这里注意:

int *temp;
*temp = *p;

以上语句是不符合逻辑的一段代码,int *temp新建一个指针(但没有分配内存)。*temp = *p不是指向而是拷贝。把*p所指向的内存里的值(也就是实参a的值)拷贝到*temp所指向内存里了。但是int *temp不是不分配内存吗?的确不分配,于是系统在拷贝时临时给了一个随机地址,让它存值。分配的随机地址是个“意外”,且函数结束后不收回,造成内存泄露。


swap3传的是一个地址进去,在函数体内的形参*p、*q是指向实际参数a、b地址的两个指针。这里需要注意的是(itnt *temp; temp = p;)  int *temp新建一个指针(但没有分配内存)。temp = p是指向而不是拷贝。temp指向了*p所指向的地址(也就是a)。而代码

p=q;
q=temp;

意思就是p指向了*q所指向的地址(也就是b)。q指向了*t所指向的地址(也就是a)。但是函数swap3不能实现两个数的交换,这是因为函数体内只是指针的变化,而对地址中的值没有改变。


函数swap4可以实现两数的交换,因为它修改的是指针所指向地址中的值。


函数swap5函数与swap4类似,是一个引用传递,修改的结果直接影响实参。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值