文档章节

函数调用三种方式:传值&传引用&传指针

o
 onedotdot
发布于 2017/08/27 11:25
字数 1075
阅读 21
收藏 1
点赞 0
评论 0

相关概念

c++三种传递参数方式

传参数的值(称值传递,简称传值),传参数的地址(称地址传递,简称为传址),和引用传递(称为传引用),相应的函数传值调用,传址调用和传引用调用

形参、实参

 函数定义时参数表中的参数称为形式参数,简称形参;函数调用时参数表中的参数称为实际参数,简称实参。实参和形参之间的数据传递称为形实结合

说明

通常情况下,C++是传值调用,它是单向的,只能从实参到形参。形参实质上市实参的一种拷贝,所以传递时不会改变外部实参的值

引用的含义及功能

即别名,功能主要是传递函数的参数和返回值

引用的规则

(1)引用被创建的同时必须被初始化(指针则可以在任何时候被初始化)。

(2)不能有NULL引用,引用必须与合法的存储单元关联(指针则可以是NULL)。

(3)一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象)。

 

 

 

 

实例

#include <iostream>

using namespace std ;

void Swap(int x, int y) ;

int main(void)

{

int a = 1 ;

int b = 2 ;

 

cout << "a = " << a << ", " << "b = " << b << endl ;

 

Swap(a, b) ;

 

cout << "a = " << a << ", " << "b = " << b << endl ;

 

system("pause") ;

return 0 ;

}

 

一:值传递

void Swap(int x, int y)

{

int temp = x ;

x = y ;

y = temp ;

}

 

输出结果:

a = 1, b = 2

a = 1, b = 2

原因:Swap(int x, int y)函数采用值传递的方式,传入的实参实际上是a和b的副本而非其本身,所以对副本的改变并不会反应到a和b本身上。

 

二:引用传递

void Swap(int &x, int &y)

{

int temp = x ;

x = y ;

y = temp ;

}

输出结果:

a = 1, b = 2

a = 2, b = 1

原因:Swap(int x, int y)函数采用引用传递的方式,传入的实参实际上是a和b的引用,对引用的改变会直接反应到a和b本身上。

 

三:指针传递

1.  改变指针本身

void Swap(int *x, int *y)

{

int *temp = x ;

x = y ;

y = temp ;

}

 

调用方法:Swap(&a, &b) ;

 

输出结果:

a = 1, b = 2

a = 1, b = 2

原因:Swap(int x, int y)函数采用指针传递的方式,传入的实参实际上是a和b的指针的副本,而且改变的是副本本身而非其间接引用,所以不会影响的指针所指向的值,即a和b本身上。

 

2.  改变指针的间接引用

 

void Swap(int *x, int *y)

{

int temp = *x ;

*x = *y ;

*y = temp ;

}

 

调用方法:Swap(&a, &b) ;

 

输出结果:

a = 1, b = 2

a = 2, b = 1

原因:Swap(int x, int y)函数采用指针传递的方式,传入的实参虽然也是a和b的指针的副本,但是改变的是副本的间接引用,无论是指针本身还是其副本,都指向相同的值,所以这个改变会反应到a和b本身上。

效率比较

程序代码

//#include "stdafx.h"

#include "iostream"

#include "windows.h"

//#include "winbase.h"

using namespace std;

void TestValue(double val1,double val2);

void TestRef(double &val1,double &val2);

void TestPointer(double *val1,double *val2);

main()

{

double a = 1.5;

double b = 5.0;

DWORD dwStartTime;

DWORD dwEndTime;

dwStartTime= GetTickCount();

int i;

for(i=0;i<100000000;i++)

TestValue(a,b);

dwEndTime= GetTickCount();

cout << "\nTime1=" << dwEndTime - dwStartTime << endl;

dwStartTime= GetTickCount();

for(i=0;i<100000000;i++)

TestRef(a,b);

dwEndTime= GetTickCount();

cout << "\nTime2=" << dwEndTime - dwStartTime << endl;

dwStartTime= GetTickCount();

for(i=0;i<100000000;i++)

TestPointer(&a,&b);

dwEndTime= GetTickCount();

cout << "\nTime3=" << dwEndTime - dwStartTime << endl;

cin.get();

return 0;

}

void TestValue(double val1,double val2)

{

double val = val1 + val2;

}

void TestRef(double &val1,double &val2)

{

double val = val1 + val2;

}

void TestPointer(double *val1,double *val2)

{

double val = *val1 + *val2;

}

运行结果

Debug下:

第一次:1713 1718 1719

第二次:1714 1708 1709

第三次:1713 1718 1719

Release下:

第一次:266 266 218

第二次:282 265 219

第三次:266 265 235

可以进一步查看反汇编代码,分析比较其指令

总结:传引用=传指针

 

===================

 

第二个传引用,传的不就是指针变量么?

第三个传指针,传的实际是地址类型变量?

因为    int i = 10;   int * p = &i;   第二个写法 是对的?

第一个传值,其实就是函数从新开辟新的动态内存,然后从新声明的新的变量在赋值而已;

 

 

本文转载自:http://blog.csdn.net/gyysmall/article/details/8247059

共有 人打赏支持
o
粉丝 6
博文 320
码字总数 14350
作品 0
朝阳
C++传值、传引用

C++传值、传引用 C++的函数参数传递方式,可以是传值方式,也可以是传引用方式。传值的本质是:形参是实参的一份复制。传引用的本质是:形参和实参是同一个东西。 传值和传引用,对大多数常见...

lovedan
2017/05/07
0
0
C语言-传值,传地址(指针),传引用区别和联系

很多编程老手对传值,传地址,传引用的区别搞的也不会很清楚,今天我就花一点时间再次介绍一下这些概念的本质。 其实,不用分为三类,只有两类即可。传值和传引用。为什么会出现传地址(即传...

abaojin
2015/11/11
0
0
PHP传值和传引用、传地址的区别是什么?

传值, 是把实参的值赋值给行参 那么对行参的修改, 不会影响实参的值 传地址 是传值的一种特殊方式,只是他传递的是地址,不是普通的如int 那么传地址以后,实参和行参都 指向同一个对象 传...

morebetter1
07/02
0
0
Go语言的传参和传引用

传参和传引用的问题 很多非官方的文档和教材(包括一些已经出版的图书), 对Go语言的传参和引用的讲解都有很多问题. 导致众多Go语言新手对Go的函数参数传参有很多误解. 而传参和传引用是编程语...

chai2010
2013/09/14
16.9K
30
javascript(八) 函数

函数 声明式函数: function funName(param1,param2......,param){ statement//语句 return//返回值 } 关键点:函数传参和传引用。 当参数为变量时,是传值的方式,对该参数的修改不会影响到...

年少爱追梦
2016/06/01
10
0
详解 JAVA 创建对象 NEW

假设我们在函数中写了如下这个简单的语句:   StringBuffer str = new StringBuffer("Hello world");   别看这个语句简单,其实包含了如下三个步骤:   首先,newStringBuffer("He...

klog
2016/11/27
18
0
java中值传递的理解,C++中传值传递、引用传递和指针方式的理解

通过对参考文献中两篇文章的理解消化,自己运行测试分析总结如下: java的值传递理解: 代码1: public class Test { /** * @param args */ public static void main(String[] args) { Stri...

Nob
2014/09/20
0
1
Java新手进阶:细说引用类型

引用类型的变量非常类似于C/C++的指针。为了形象起见,也为了打字方便,本文后面的内容,都把“引用类型的变量”称为指针。所以,如果你原先有C/C++背景,今天讲的内容对你来说应该很好理解;...

精华之王
2009/04/11
0
0
PHP-CPP Php::ByVal和Php::ByRef详解

理解Php::ByRef和Php::ByVal之前我们先来补充几个知识点(关于C语言): 指针:指针的基本概念 在计算机中,所有的数据都是存放在存储器中的。 一般把存储器中的一个字节称为一个内存单元, ...

王And木
06/05
0
0
《Golang 入门系列七》Go语言参数传递是传值还是传引用

对于了解一门语言来说,会关心我们在函数调用的时候,参数到底是传的值,还是引用? 其实对于传值和传引用,是一个比较古老的话题,做研发的都有这个概念,但是可能不是非常清楚。对于我们做...

IT--小哥
06/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

前端基础

1. get请求传参长度的误区 误区:我们经常说get请求参数的大小存在限制,而post请求的参数大小是无限制的。 实际上HTTP 协议从未规定 GET/POST 的请求长度限制是多少。对get请求参数的限制是...

wenxingjun
今天
0
0
Android 复制和粘贴功能

做了一回搬运工,原文地址:https://blog.csdn.net/kennethyo/article/details/76602765 Android 复制和粘贴功能,需要调用系统服务ClipboardManager来实现。 ClipboardManager mClipboardM...

她叫我小渝
今天
0
0
拦截SQLSERVER的SSL加密通道替换传输过程中的用户名密码实现运维审计(一)

工作准备 •一台SQLSERVER 2005/SQLSERVER 2008服务 •SQLSERVER jdbc驱动程序 •Java开发环境eclipse + jdk1.8 •java反编译工具JD-Core 反编译JDBC分析SQLSERVER客户端与服务器通信原理 SQ...

紅顏為君笑
今天
6
0
jQuery零基础入门——(六)修改DOM结构

《jQuery零基础入门》系列博文是在廖雪峰老师的博文基础上,可能补充了个人的理解和日常遇到的点,用我的理解表述出来,主干出处来自廖雪峰老师的技术分享。 在《零基础入门JavaScript》的时...

JandenMa
今天
0
0
linux mint 1.9 qq 安装

转: https://www.jianshu.com/p/cdc3d03c144d 1. 下载 qq 轻聊版,可在百度搜索后下载 QQ7.9Light.exe 2. 去wine的官网(https://wiki.winehq.org/Ubuntu) 安装 wine . 提醒网页可以切换成中...

Canaan_
今天
0
0
PHP后台运行命令并管理运行程序

php后台运行命令并管理后台运行程序 class ProcessModel{ private $pid; private $command; private $resultToFile = ''; public function __construct($cl=false){......

colin_86
今天
1
0
数据结构与算法4

在此程序中,HighArray类中的find()方法用数据项的值作为参数传递,它的返回值决定是否找到此数据项。 insert()方法向数组下一个空位置放置一个新的数据项。一个名为nElems的字段跟踪记录着...

沉迷于编程的小菜菜
今天
1
1
fiddler安装和基本使用以及代理设置

项目需求 由于开发过程中客户端和服务器数据交互非常频繁,有时候服务端需要知道客户端调用接口传了哪些参数过来,这个时候就需要一个工具可以监听这些接口请求参数,已经接口的响应的数据,这种...

银装素裹
今天
0
0
Python分析《我不是药神》豆瓣评论

读取 Mongo 中的短评数据,进行中文分词 对分词结果取 Top50 生成词云 生成词云效果 看来网上关于 我不是药神 vs 达拉斯 的争论很热啊。关于词频统计就这些,代码中也会完成一些其它的分析任...

猫咪编程
今天
0
0
虚拟机怎么安装vmware tools

https://blog.csdn.net/tjcwt2011/article/details/72638977

AndyZhouX
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部