传值调用

该方法把参数的实际值复制给函数的形式参数。在这种情况下,修改函数内的形式参数对实际参数没有影响。

#include<iostream>
using namespace std; // 函数声明
void swap(int x, int y); int main ()
{
// 局部变量声明
int a = 100;
int b = 200; cout << "交换前,a 的值:" << a << endl;
cout << "交换前,b 的值:" << b << endl; // 调用函数来交换值
swap(a, b); cout << "交换后,a 的值:" << a << endl;
cout << "交换后,b 的值:" << b << endl; return 0;
}
// 函数定义
void swap(int x, int y)
{
int temp; temp = x; /* 保存 x 的值 */
x = y; /* 把 y 赋值给 x */
y = temp; /* 把 x 赋值给 y */ return;
}

调用函数的时候,在函数内部开辟了两个变量,x=a,y=b,然后对这两个局部变量进行操作,函数执行完毕之后随即销毁。

交换前,a 的值: 100
交换前,b 的值: 200
交换后,a 的值: 100
交换后,b 的值: 200

指针调用

该方法把参数的地址复制给形式参数。在函数内,该地址用于访问调用中要用到的实际参数。这意味着,修改形式参数会影响实际参数。

#include<iostream>
using namespace std; // 函数声明
void swap(int *x, int *y); int main ()
{
// 局部变量声明
int a = 100;
int b = 200; cout << "交换前,a 的值:" << a << endl;
cout << "交换前,b 的值:" << b << endl; /* 调用函数来交换值
* &a 表示指向 a 的指针,即变量 a 的地址
* &b 表示指向 b 的指针,即变量 b 的地址
*/
swap(&a, &b); cout << "交换后,a 的值:" << a << endl;
cout << "交换后,b 的值:" << b << endl; return 0;
}
// 函数定义
void swap(int *x, int *y)
{
int temp;
temp = *x; /* 保存地址 x 的值 */
*x = *y; /* 把 y 赋值给 x */
*y = temp; /* 把 x 赋值给 y */ return;
}

int* x=&a, int* y=&b,此时x,y分别为a,b的地址,函数中交换了地址x,y对应的值,因而在函数外部相当于a,b的地址不变,交换了a,b的值。

交换前,a 的值: 100
交换前,b 的值: 200
交换后,a 的值: 200
交换后,b 的值: 100

引用调用

该方法把参数的引用复制给形式参数。在函数内,该引用用于访问调用中要用到的实际参数。这意味着,修改形式参数会影响实际参数。

#include<iostream>
using namespace std; // 函数声明
void swap(int &x, int &y); int main ()
{
// 局部变量声明
int a = 100;
int b = 200; cout << "交换前,a 的值:" << a << endl;
cout << "交换前,b 的值:" << b << endl; /* 调用函数来交换值 */
swap(a, b); cout << "交换后,a 的值:" << a << endl;
cout << "交换后,b 的值:" << b << endl; return 0;
}
// 函数定义
void swap(int &x, int &y)
{
int temp;
temp = x; /* 保存地址 x 的值 */
x = y; /* 把 y 赋值给 x */
y = temp; /* 把 x 赋值给 y */ return;
}

&x=a,&y=b,x,y分别是a,b的引用,也就是别名,也就是x和a,y和b是相同的东西,

x和a具有相同的地址相同的值,y和b具有相同的地址相同的值。因而在函数内部对变量的操作等价于在函数外部对变量的操作。

交换前,a 的值: 100
交换前,b 的值: 200
交换后,a 的值: 200
交换后,b 的值: 100

参考

http://www.runoob.com/cplusplus/cpp-tutorial.html

C++函数的传值调用&指针调用&引用调用的更多相关文章

  1. 深刻理解C#的传值调用和传引用调用

    传值调用和传引用调用是几乎所有主流语言都会涉及到的问题,下面我谈谈我对C#中传值调用和传引用调用的理解. 1. 一般对C#中传值调用和传引用调用的理解 如果传递的参数是基元类型(int,float等) ...

  2. Java中的形参和实参的区别以及传值调用和传引用调用

    名词解析: 1.形参:用来接收调用该方法时传递的参数.只有在被调用的时候才分配内存空间,一旦调用结束,就释放内存空间.因此仅仅在方法内有效. 2.实参:传递给被调用方法的值,预先创建并赋予确定值. 3 ...

  3. 【Java-Method】读《重构》有感_Java方法到底是传值调用还是传引用调用(传钥匙调用)

    今天读<重构>P279, Separate Query from Modifier,将查询函数和修改函数分离. 问题的产生 突然想到 Java 的传对象作为参数的方法到底是 传引用调用,还 ...

  4. golang的传值调用和传引用调用

    传值还是传引用 调用函数时, 传入的参数的 传值 还是 传引用, 几乎是每种编程语言都会关注的问题. 最近在使用 golang 的时候, 由于 传值 和 传引用 的方式没有弄清楚, 导致了 BUG. ...

  5. virtual 函数只有在用指针或引用的方式访问,才会导致多态。

    只有用指针和引用,才会动态绑定.才会在运行时候从虚表中找对应的成员函数. 如果只是用.访问成员函数,是静态绑定,在编译时刻就固定好的. 另外,父类的虚函数,子类不管加不加virtual关键字,都是虚函 ...

  6. C++中为什么要用虚函数、指针或引用才能实现多态?

    原文链接:http://blog.csdn.net/zoopang/article/details/14071779 学过C++的都知道,要实现C++的多态性必须要用到虚函数,并且还要使用引用或者指针 ...

  7. C++中指针和引用、数组之间的区别

    指针指向一块内存,它的内容是所指内存的地址:而引用则是某块内存的别名,引用初始化后不能改变指向.使用时,引用更加安全,指针更加灵活. 初始化.引用必须初始化,且初始化之后不能呢改变:指针可以不必初始化 ...

  8. 从成员函数指针生成可调用对象:function<>、mem_fn()和bind()

    我们知道,普通函数指针是一个可调用对象,但是成员函数指针不是可调用对象.因此,如果我们想在一个保存string的vector中找到第一个空string,不能这样写: vector<string& ...

  9. 空类指针为什么可以调用类的成员函数 以及 A(){}和A();

    1. 代码及问题 #include <iostream> using namespace std; class A { public: A() {} //A *p = new A()时:此 ...

随机推荐

  1. Aspose.words四 bookmark

    通过添加bookmark书签来添加数据,首先通过方法MoverToBookmark移动指定的标签位置,然后添加数据,添加完成后清除掉bookmark标示. string templateFile = ...

  2. Three.js 对模型多个动画切换展示(fbx)

    来源 :https://blog.csdn.net/qq_30100043/article/details/80087471 简介 上一节本想直接了结动画这一章.最后一想,没有做过模型动画切换的案例. ...

  3. Java图形界面——Border

    Swing编程边框(Border)的用法总结 Java进行客户端编程,使用了大量的Swing控件,由于系统默认的边框无法满足项目的要求,不得不自己更改控件的边框样式,网上找了不少资料,本文对Swing ...

  4. .net 技术地图

    以下是技术牛人,灵感之源.在于15年7月23日归类的一个技术地图 主要包括10个大类.50个子类 http://jingyan.baidu.com/article/4ae03de344f9b33eff ...

  5. firefox打开链接自动跳转至新页面设置

    Firefox打开新页面时,活动页面会自动跳转到刚刚打开的页面,用着很不舒服,想打开新页面标签时,页面依然会停留在之前的页面. 在网上找了一下,设置方法如下: 在地址栏里输入about:config, ...

  6. (转找了好久)实现一个2008serve的IIS的虚拟目录(通过网络路径(UNC)的形式,共享在另外一个2008服务器上

    目的:实现一个2008serve的IIS的虚拟目录(通过网络路径(UNC)的形式,共享在另外一个2008服务器上) 准备工作 1.共享资源服务器为 ShareServer,IP地址为:192.168. ...

  7. Docker虚拟化实战学习——基础篇(转)

    Docker虚拟化实战学习——基础篇 2018年05月26日 02:17:24 北纬34度停留 阅读数:773更多 个人分类: Docker   Docker虚拟化实战和企业案例演练 深入剖析虚拟化技 ...

  8. spring.boot mybaits集成

    https://www.cnblogs.com/pejsidney/p/9272562.html (insertBatch批量插入) 第一篇博客循环部分有错误,参照下面的例子去更改 List<S ...

  9. Activiti任务认领

    Activiti任务认领 TaskService taskService; taskService.setAssignee(String taskId, String userId);taskServ ...

  10. Spring Boot学习笔记:传统maven项目与采用spring boot项目区别

    项目结构区别 传统的maven构建的项目结构如下: 用maven构建的采用springboot项目结构如下: 二者结构一致,区别如下:传统项目如果需要打成war包,需要在WEB-INF目录结构配置we ...