1、简介

  1、值传递:形参时实参的拷贝,改变函数形参并不影响函数外部的实参,这是最常用的一种传递方式,也是最简单的一种传递方式。只需要传递参数,返回值是return考虑的;使用值传递这种方式,调用函数不对实参进行操作,也就是说,即使形参的值发生改变,实参的值也完全不受影响。

  2、指针传递:指针传递其实是值传递的一种,它传递的是地址。值传递过程中,被调函数的形参作为被调函数的局部变量来处理,即在函数的栈中有开辟了内存空间来存放主调函数放进来实参的值,从而成为一个副本。因为指针传递的是外部参数的地址,当调用函数的形参发生改变时,自然外部实参也发生改变。

  3、引用传递:被调函数的形参虽然也作为局部变量在栈中开辟了内存空间,但在栈中放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被间接寻址,即通过栈中的存放的地址访问主调函数中的中的实参变量(相当于一个人有两个名字),因此形参在任意改动都直接影响到实参。

2、例程

  1、值传递
#include <iostream>
using namespace std;
void swap(int,int);
int main()
{
int a=1,b=2;
cout<<"a="<<a<<",b="<<b<<endl;
swap(a,b);
cout<<"a="<<a<<",b="<<b<<endl;
return 0;
}
void swap(int x,int y)
{
int p=x;
x=y;
y=p;
}

  

  2、指针传递
#include <iostream>
using namespace std;
void swap(int *x,int *y);
int main()
{
int a=1,b=2;
cout<<"a="<<a<<",b="<<b<<endl;
cout<<"&a="<<&a<<",&b="<<&b<<endl;
cout<<"********1**********"<<endl;
swap(&a,&b);
cout<<"a="<<a<<",b="<<b<<endl;
cout<<"&a="<<&a<<",&b="<<&b<<endl;
cout<<"********3**********"<<endl;
return 0;
}
void swap(int *x,int *y)
{
int p=*x; //int p; p=*x;
*x=*y;
*y=p;
cout<<"x="<<x<<",y="<<y<<endl;
cout<<"*x="<<*x<<",*y="<<*y<<endl;
cout<<"&x="<<&x<<",&y="<<&y<<endl;
cout<<"********2**********"<<endl;
}

 int *x=&a;//用于指针传递,x有自己独立的内存地址,存储内容是a的地址,*x是存a的值。

根据图1 可知:x(y)是一个指向外部实参地址的指针,*x(*y)是指针的内容,如果改变了*x(*y)也必然导致外部实参的改变。

这是因为x或y的指针指向a或b的地址,因此*x*y值的交换导致外部实参发生变化。

  

  3、引用传递
#include <iostream>
using namespace std;
void swap(int &x,int &y);
int main()
{
int a=1,b=2;
cout<<"a="<<a<<",b="<<b<<endl;
cout<<"&a="<<&a<<",&b="<<&b<<endl;
cout << "*******1**********"<<endl;
swap(a,b);
cout<<"a="<<a<<",b="<<b<<endl;
cout<<"&a="<<&a<<",&b="<<&b<<endl;
cout << "*******4**********"<<endl;
return 0;
}
void swap(int &x,int &y)
{
cout<<"x="<<x<<",y="<<y<<endl;
cout<<"&x="<<&x<<",&y="<<&y<<endl;
cout << "*******2**********"<<endl;
int p=x;
x=y;
y=p;
cout<<"x="<<x<<",y="<<y<<endl;
cout<<"&x="<<&x<<",&y="<<&y<<endl;
cout << "*******3**********"<<endl;
}

  

引用实参和形参时一样的,只是名字不同而已。

最新文章

  1. 理解button标签的默认行为
  2. 联不上网 Unable to initialize Windows Sockets interface. General failure.
  3. scrollTop 鼠标往下移动到一定位置显示隐藏
  4. C语言---文件
  5. tomcat清除缓存
  6. 关键字const
  7. 从代码都发布遇到的问题总结(C#调用非托管dll文件,部署项目) 转
  8. Effective c++ 第一章 让自己习惯C++
  9. 分析Cocos2d-x横版ACT手游源 2、server场景
  10. 比较C++中的4种类型转换方式(转自http://blog.csdn.net/hrbeuwhw/article/details/7884797)
  11. stat命令
  12. Android可更换布局的换肤方案
  13. malloc() 和 calloc()有啥区别
  14. hdu 4279&quot;Number&quot;(数论)
  15. (转) Ubuntu 更改文件夹及子文件夹权限
  16. 教你怎么上传本地代码到github
  17. Java-Runoob-高级教程-实例-时间处理:01. Java 实例 - 格式化时间(SimpleDateFormat)
  18. 跨平台开发 -- C# 使用 C/C++ 生成的动态链接库
  19. scrapy 也能爬取妹子图?
  20. DWZ验证表单规则一览

热门文章

  1. Canvas杂谈
  2. typeof操作符和instanceof操作符的区别 标签: JavaScript 2016-08-01 14:21 113人阅读 评论(
  3. Python Json获取天气预报
  4. Linux系统中while管道的
  5. SQL Server的跨服务器数据访问方法
  6. python 中if-else的多种简洁的写法
  7. Linux总结(十二)set_uid set_gid stic_bit 软链接 硬链接
  8. Apple的UIAutomation环境搭建和入门知识
  9. @RestController失效
  10. Winodws SNMP服务安装和配置(Windows 2003 & 2008 R2)