如何解决参数的单一传递性来改变主函数里的值

来源:互联网 发布:sql二进制数据导出 编辑:程序博客网 时间:2024/05/16 06:03

(1)首先我们定义一个函数swap,它的作用是交换两个变量a和b的值

void swap(int *p1, int *p2)

{
int temp;

temp = *p1;

*p1 = *p2;

*p2 = temp;

}

swap 函数的两个形参p1和p2是指针变量

然后再写主函数

int main()

{

int a  = 4, b = 6;

int *p3;

int *p4;

p3 = &a;

p4 = &b;

swap(p3, p4);

prinrtf(“a = %d, b = %d”,a, b);

return 0;

}

分析一下, main程序运行时,a和b的地址分别赋给p3和p4,使p3指向a,p4指向b。 然后进行值传递此时的实参p3和p4是指针变量,形参p1和实参p3都指向了变量a,形参p2和实参p4都指向了变量b,都是两个指针变量指向了同一个内存区域,都可以对内存里的值进行修改,然后执行swap函数,*p1和*p2的值互换,也就是a和b的值进行互换,函数执行完成后,形参被释放掉了,a的值与b的值也进行了交换。


如果下面着这种形式就不对了,int*temp定义了一个整形的指针变量,*temp是指针指向的变量,但是temp中并无确定值,所以temp所指向的单元也是不确定的,而*p1就是a,就是整形变量,所以不对。

void swap(int *p1, int *p2)

{
int*temp;

temp = *p1;

*p1 = *p2;

*p2 = temp;

}


再看下面这个函数

void swap(int x, int y)

{

int temp;

temp = x;

x = y;

y  = temp;

}

如果在main函数中掉用swap函数,那么a与b的值就不会被改变了,因为形参和实参的传递关系为单向传递,只能由实参传给形参。


了解了实参和形参的关系后,我们就可以很好的利用它们,为了使在函数中改变了的值能被main函数使用,我们不能采取把要改变值的变量作为参数的办法,而应该采用指针变量作为函数参数,这样经过函数调用后,这些变量值的变化依然可以保留下来 。











0 0
原创粉丝点击