C++传值&传引用&传指针

转载 2012年03月25日 21:06:40
【C/C++语法外功】传值&传引用&传指针

相关概念

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

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

总结:传引用=传指针

相关文章推荐

C++传值&传指针&传引用

我同学看见我的电脑都说我浏览器开太多了,忍不住要帮我关掉,但是宝宝一个窗口是写博客,一个窗口写javascript,一个窗口写算法,虽然每个都开了十几个,但是条理很清晰啊,没毛病!C++传参数的三种方...

【C/C++语法外功】传值&传引用&传指针

相关概念 c++三种传递参数方式 传参数的值(称值传递,简称传值),传参数的地址(称地址传递,简称为传址),和引用传递(称为传引用),相应的函数传值调用,传址调用和传引用调用 形...
  • redouba
  • redouba
  • 2014年03月13日 14:02
  • 1229

传值,传指针和传引用区别和联系

C++写了很多年,有一天,写着写着代码。竟然自己发现对传值,传指针,传引用这个每天都在用的传递方式的区别还不是很清楚。以为自己懂了,其实还理解得还不够深入,基础还需要花时间琢磨。今天参考了很多篇博客和...

传值、传指针、传引用

值传递、指针传递、引用传递的区别c语言的规则很简单:“所有的参数都是传值调用”。在这句话的基础上,我们来分析值传递、指针传递、引用传递的区别。一、值传递值传递,这与C函数的性质有关。C函数的所有参数均...

C++学习笔记(1)之传值、传指针、传引用的区别

1.引用和指针的区别:引用定义就要初始化、引用初始化后不能引用其他的引用、不能给引用赋空值,引用具有 1)不占空间  2)效率 3)安全优点 2.什么时候使用指针,什么时候又该使用引用? 指针和引...

初学者怎样区分 传值,传引用,传指针

在参数传参过程中 如需保护指针指向的内容,则实参需要定义为指向const 对象的指针 改变实参的值,可以传入参数的引用或者传入该实参的指针 引用和指针在对时间的开销上有区别,尤其是非内置类型的对...

从汇编和高级语言的角度理解传值方式,传值,传引用,传指针的本质机制与区别。白话通俗易懂。

函数的传参与返回值的方式有传值和传递引用,c语言中就是传值,而c++扩展传引用。 而传值分为传递值(实参的值,此时形参是实参在内存中的一份拷贝,形参在使用时分配内存,结束时释放,实参和形参在内存中的...

C++中引用、指针,传值的联系和区别

本文简述了引用、指针、传值的的联系和区别,还说明了pass by value和pass by reference的区别,并附上大量代码进行举例说明...

C++ Data Structure 学习笔记 (2011.5.3)——传值,指针,引用的区别及Vector与String的详细用法

今天学的第一个内容是传值,传引用的问题。在Mark Weiss的书中,他非常简明扼要的对此作了说明:Call by reference is required for objects that may...

C/C++中函数的传值调用、指针调用、引用调用问题

以swap函数来说明问题:   #include #include void swap1(int a, int b) { int temp; temp=a; a=b; ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++传值&传引用&传指针
举报原因:
原因补充:

(最多只允许输入30个字)