课程首页地址:http://blog.csdn.net/sxhelijian/article/details/7910565
【项目1-体会函数参数传递】
1、下面三段程序都试图通过定义函数,实现实际参数在必要时的交换,哪些能够实现,哪些不能实现?通过运行程序和单步执行,让自己对这一过程更加清楚,然后请在博文中给出明确的回答,并用你自己的话展开描述(自己的话,但要用术语,用术语讲技术的事,是必须经历的一个过程。)
2、设计一个程序,输入3个整数,将其按从大到小的顺序输出,要求
(1)排序功能通过函数实现
(2)写出两个版本的函数实现,一个采用传地址值的方法,另一个采用引用类型作参数
注意:不要一看排序就冒泡法、选择法,那是给大规模数据的排序而定的,此处不定义数组,只简单实现即可;不要只盯着完成任务,而更应该知道其中的机理,当编程(本项目第2个要求)难以完成时,通过读程序(本项目第1个要求)并领悟找到启发。
参考解答:
在函数调用时,实参的值要传递给形参。当形参是指针时,实参也是指针。形参与实参占用不同的内存空间,但通过传值(传地址值),指向的是同一内存单元。当形参指向的单元的值发生变化,也就是实参指向的空间的变化。
利用指针变量作形参,实现了用调用函数的方法,改变实参的值的目的。
#include <iostream> using namespace std; int main( ) { void sort(int *,int *,int *); int a=2,b=4,c=3; sort(&a,&b,&c); cout<<"sorted order is "<<a<<" "<<b<<" "<<c<<endl; return 0; } void sort(int *i,int *j,int *k) { int t; if (*i>*j) {t=*i;*i=*j;*j=t;} if (*i>*k) {t=*i;*i=*k;*k=t;} if (*j>*k) {t=*j;*j=*k;*k=t;} }
用引用类型作为形参,由于形参与实参实质上就是同一个变量,占用的是同一段内存空间,对形参的改变,实质就是对实参的改变。因此,排序函数中完成的形参的变化,使得在函数调用完后,实参也发生了变化。
用引用类型作为形参,效果上可以达到传地址值相同的效果,但程序的可读性更好了,更易于理解了。
#include <iostream> using namespace std; int main( ) { void sort(int &,int &,int &); int a=2,b=4,c=3; sort(a,b,c); cout<<"sorted order is "<<a<<" "<<b<<" "<<c<<endl; return 0; } void sort(int &i,int &j,int &k) { int t; if (i>j) {t=i;i=j;j=t;} if (i>k) {t=i;i=k;k=t;} if (j>k) {t=j;j=k;k=t;} }