赞
踩
最近写代码时遇到一个问题,使用指针变量作为函数参数时,如何交换两个数的值。这个问题看似简单,但却关系到对C语言中指针的理解程度。请看下面三个swap函数
#include "stdafx.h"
void swap1(int a,int b)
{
int t;
t=a;a=b;b=t;
printf("a:%d,b:%d\n",a,b);
}
void swap2(int *a,int *b)
{
int *t;
t=a;a=b;b=t;
}
void swap3(int *a,int *b)
{
int t;
t=*a;*a=*b;*b=t;
}
int main(int argc, char* argv[])
{
int a =5,b=9;
swap1(a,b);
printf("a:%d,b:%d\n",a,b);
swap2(&a,&b);
printf("a:%d,b:%d\n",a,b);
swap3(&a,&b);
printf("a:%d,b:%d\n",a,b);
return 0;
}
第一个swap,定义为void swap1(int a,int b),如果使用java或者其它高级语言,使用该函数没什么问题,甚至是天经地义的,但是C语言里却不行,原因是main中调用swap1()时,将实参a,b的值传递给了交换函数,如果此时在swap1中打印,可以看到a为9,b为5,但是,由于未改变a,b所对应的地址的值,当函数退出时,形参a,b的值已经释放,地址的值未发生改变,因此这里不会返回任何结果,。因此main()中第一行打印的结果仍然未a:5,b:9。
第二个swap,看似的确使用了指针,但输出的也是“a:5,b:9”,为什么呢?由于未给t赋值,t中并没有确定的值,索引t中的值是不可预见的。此时t可能指向一个未知的存储单元,而严重的情况是,该单元的数据可能是有用的,因此swap2()不但没有实现两个数的交换,反而给系统的稳定性带来威胁。本例的作用是将t作为临时指针变量,实现&a和&b的地址交换,而值并未发生变化。
第三个swap是正确的。为了在函数中改变了的变量能被其它函数调用,正确的办法是用指针变量作为函数参数,在函数执行过程中使指针变量所指向的变量值发生变化,函数调用结束后,哲别变量值的变化依然保留下来,这样就实现了通过函数调用是变量的值发生变化,在其它函数中可以使用这些改变了的值的目的。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。