Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1362974
  • 博文数量: 284
  • 博客积分: 3251
  • 博客等级: 中校
  • 技术积分: 3046
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-26 17:23
文章分类

全部博文(284)

文章存档

2019年(2)

2018年(5)

2015年(19)

2014年(13)

2013年(10)

2012年(235)

分类:

2012-10-09 22:06:03

要理解值传递、指针传递和引用传递的区别,主要要理解函数的实参和形参,函数的作用域(自动变量、栈),内存的布局以及指针和引用的特点。这里主要总结三种参数传递方式使用的主要场合。

  • 值传递:只给函数提供输入值,需要复制开销,大对象很少使用值传递。
  • 指针传递:可以改变指针指向内容的值,但是不能改变指针本身,无需复制开销。如果需要改变指针本身,可以使用二重指针或者指针引用。
  • 引用传递:除了提供输入值外,还返回操作结果,无需复制开销。
#include<stdlib.h>

//值传递,函数体内变量n是参数n的一份拷贝,函数体内改变n的值不会改变外面的n
void addTenByVal(int n)
{
    n 
= n + 10;
    
return;
}

//指针传递,n是指向外部变量的指针,改变*n的值,也会改变外面变量的
void addTenByPtr(int *n)
{
    
*= *+ 10;
    
return;
}

//引用传递,别名引用,牵一发而动全身
void addTenByRef(int &n)
{
    n 
= n + 10;
    
return;
}

int main(int argc , char *argv[])
{

    
int n = 10;

    printf(
"值传递前,n=%d\n",n);

    
//值传递
    addTenByVal(n);

    printf(
"值传递后,n=%d\n",n);

    printf(
"指针传递前,n=%d\n",n);

    
//指针传递
    addTenByPtr(&n);

    printf(
"指针传递后,n=%d\n",n);

    printf(
"引用传递前,n=%d\n",n);

    
//引用传递
    addTenByRef(n);

    printf(
"引用传递后,n=%d\n",n);

    system(
"pause");

    
return 0;
}

 

后来复习的时候又写了一个DEMO,这个不需要解释,大家都懂的。

 #include <stdio.h>
#include 
<tchar.h>
#include 
<cstdlib>
#include 
<iostream>
#include 
<sys/timeb.h>
#include 
<ctime>
#include 
<climits>

using namespace std;

//交换参数-值传递
void SwapByVal(int v1,int v2)
{
    
int tmp = v2;
    v2 
= v1;
    v1 
= tmp;
}

//交换参数-引用传递
void SwapByRef(int &v1,int &v2)
{
    
int tmp = v2;
    v2 
= v1;
    v1 
= tmp;
}

//交换参数-指针传递
void SwapByPtr(int *v1,int *v2)
{
    
int tmp = *v2;
    
*v2 = *v1;
    
*v1 = tmp;
}

int _tmain(int argc, _TCHAR* argv[])
{
    
//值传递
    int a = 10 , b = 20;
    cout 
<< "值传递前:a = " << a << " ; b = " << b << endl;
    SwapByVal(a,b);
    cout 
<< "值传递后:a = " << a << " ; b = " << b << endl;

    
//复位-引用传递
    a = 10 , b = 20;
    cout 
<< "引用传递前:a = " << a << " ; b = " << b << endl;
    SwapByRef(a,b);
    cout 
<< "引用传递后:a = " << a << " ; b = " << b << endl;

    
//复位-指针传递
    a = 10 , b = 20;
    cout 
<< "指针传递前:a = " << a << " ; b = " << b << endl;
    SwapByPtr(
&a,&b);
    cout 
<< "指针传递后:a = " << a << " ; b = " << b << endl;

    system(
"pause");
    
return 0;
}

阅读(4774) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~