A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© cctao 中级黑马   /  2014-10-27 20:24  /  954 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

刚刚在论坛里看到有同学提问关于函数参数的问题,正好我有整理,我常用的函数参数传递一般为值传递跟地址传递,引用传递不怎么用。那我就主要说说值传递跟地址传递吧
最常见的代码:
值传递的典型例子:
//理想功能:交换a ,b 的值
void change(int a,int b)
{
  int temp = a;
  a = b;
  b =temp;
}
int main()
{
int a1=4;
int b1=5;
change(a1,b1);
printf("a1=%d,b1=%d",a1,b1);
return 0;
}
我们可以预见其结果: a1=4,b1=5 为什么呢?
我们可以这样理解:当main函数调用 change(int ,int)时,隐藏的做了a=a1;b=b1;仅仅是将值付给了a,b,当a,b发生改变时并没有对a1,b1产生影响,这个就是值传递。
地址传递
我们将上边的代码改改:
void change(int *a,int *b)
{
  int *temp = a;
  *a = *b;
  *b = *temp;
}
int main()
{
int a1=4;
int b1=5;
change(&a1,&b1);
printf("a1=%d,b1=%d",a1,b1);
return 0;
}这样就能达到我们预期的结果a1=5,b1=4 为什么呢?分析如下:
change(&a1,&b1);执行时隐藏的做了:a=&a1;b=&b1;即将a1的地址付给a,b1的地址付给b,在函数chang(int *,int *)中利用*a,*b交换了a1,b1的值。
引用传值:
void change(int &a,int &b)
{
  int temp = a;
  a = b;
  b =temp;
}
int main()
{
int a1=4;
int b1=5;
change(a1,b1);
printf("a1=%d,b1=%d",a1,b1);
return 0;
}
注意这里只有在函数定义时与值传递有些不同,
void change(int &a,int &b)==引用传递==理想结果
a1=5,b1=4
void change(int a,int b)== 值传递==非理想结果
原因:引用,我至今都还记得大一时老师讲的,引用就像给变量起了个小名,就像你有一个学名在外边被别人叫,在家里也会有一个小名被爸爸妈妈叫,但是无论你叫什么名字,你就是你,独一无二的你。当我们对应用做了一些操作,这些操作都会被作用到被引用者上去。
下面我把值传递与引用传递的一些区别贴上去(资料上看来的,我只是搬运工):
1)在函数定义格式上有不同: 值传递在定义处是:
change(int a,int b);
引用传递在这义处是:
change(int &a,int &b);
2)调用时有相同的格式: 值传递:change(a1, b1); 引用传递:change(a1, b1);  
3)功能上是不同的: 值传递的函数里操作的不是a、b变量本身,只是将a、b值赋给了x、y。 函数里操作的只是x、y变量而不是a、b,显示 a、b的值不会被change函数 所修改。

评分

参与人数 1技术分 +1 收起 理由
星河鹭起 + 1

查看全部评分

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马