在C语言中,形参与实参的关系有点像“复印件”与“原件”的关系。无论参数的类型是什么,传递给子函数的形参只是实参的一个副本。因此,如果你直接在函数内部修改形参的值,就像改动复印件上的内容一样,对原件(实参)没有任何影响。
不过,如果参数是指针类型,那就有点像你拿到了原件的地址。你可以通过这个地址去修改原件里的内容,这样就能影响到实参了。
所以,如果你想用SWAP函数来交换数据,必须注意两点:
1. 参数必须是指向待交换数据的指针。
2. 交换时,你得交换地址里的数据,而不是交换地址本身。
来看几个例子吧:
错误的交换代码1:
void swap1(int a, int b) //参数不是待交换数据的指针
{
int t = a;
a = b;
b = t;
}
这个函数的问题是,它只是在函数内部交换了a和b的值,但这些变化不会影响到调用这个函数时的实参,因为它们只是值的副本。
错误的交换代码2:
void swap2(int *a, int *b)
{
int *t = a; //交换形参变量本身
a = b;
b = t;
}
这个函数的问题是,它只是交换了指针变量a和b本身,而不是它们指向的数据。结果是,交换后a和b指向的地址变了,但它们指向的内存中的数据并没有交换。
正确的交换代码:
void swap(int *a, int *b)
{
int t = *a; //交换形参变量地址中的数据,指针变量不变
*a = *b;
*b = t;
}
这个函数才是正确的,因为它通过指针访问到了实参的数据,并交换了这些数据。
老兄,你得再深入理解一下函数的参数和返回值啊!
首先,一个函数的返回值只能是一个变量,你的swap函数中用return(a,b)可能连编译都过不了哦!
还有,函数的参数有传地址、传值、传引用的三种形式。你这种情况,建议用传指针的方式,直接在swap函数里改动a,b的值。代码如下:
void swap(int *a, int *b)
{
int t;
t = *a;
*a = *b;
*b = t;
}
然后在main函数中调用时,就用swap(&a, &b);这样就行了。
丁丁打折网©版权所有,未经许可严禁复制或镜像 ICP证: 湘ICP备20009233号-2
Powered by 丁丁打折网本站为非营利性网站,本站内容均来自网络转载或网友提供,如有侵权或夸大不实请及时联系我们删除!本站不承担任何争议和法律责任!
技术支持:丁丁网 dddazhe@hotmail.com & 2010-2020 All
rights reserved