关于自定义各种swap()函数(函数参数传递)

在C预言的学习中,提到函数参数的值传递和指针传递,最为经典的是例子莫过于 交换两个参数的值:SWAP( int p, int q);

int  a = 1, b = 2;

(1)void  swap ( int p, int q)

{

int  temp;

temp = p;

p = q;

q = temp;

}

swap ( a, b);是不能交换a和b的值的。这样传的是值得副本,函数体内的p和q只是a和b的一个拷贝,p和q的值确实交换了,但是他们是局部变量,不会影响到a和b。当swap()函数调用结束后,p和q所在的栈也就被删除了。所以可以说是做了无用功。

(2)  void  swap ( int *p, int *q)

{

int  *temp;

*temp = *p;

*p = *q;

*q = *temp;

}

swap( &a, &b);也是有问题的。函数体内的形参p和q是指向实际参数a和b的指针。但是temp作为一个新的指针变量还没有分配内存。*temp = *p是把p所指向的内存里的值拷贝到temp所指向的内存里,由于temp还没有分配内存,于是系统在拷贝时临时给了一个随机的地址存拷贝的值,分配的随机地址是“不正常”的,且函数结束后不收回,造成内存泄露。此函数是否可以编译通过,和编译器有关。在VS2010中不能通过编译。

(3) void  swap ( int *p, int *q)

{

int  *temp;

temp = p;

p = q;

q = temp;

}

swap(&a, &b);也是不能实现交换a和b的值的目的的。在函数体内的确是交换了p和q的值:p原来指向a的值,q原来指向b的值,交换后p指向b的值,q指向a的值。但是,当函数执行结束时,p和q便消失了,用a和b访问将会是交换前的值。

(4) void  swap ( int *p, int *q)

{

int  temp;

temp = *p;

*p = *q;

*q = temp;

}

swap(&a, &b);是可以实现交换a和b的值得目的的。通过temp这个中间变量,改变了a和b的值。

(5) void  swap ( int &p, int &q)

{

int  temp;

temp = p;

p = q;

q = temp;

}

swap(a, b);也是可以的。引用传递修改的结果直接影响实参。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值