C++第17周项目1——体会函数参数传递

来源:互联网 发布:人工智能简史 尼克 编辑:程序博客网 时间:2024/05/16 09:35

课程首页地址: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;}}