Chinaunix首页 | 论坛 | 博客
  • 博客访问: 353237
  • 博文数量: 197
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 303
  • 用 户 组: 普通用户
  • 注册时间: 2013-09-02 14:21
文章分类

全部博文(197)

文章存档

2014年(89)

2013年(108)

我的朋友

分类: C/C++

2013-10-31 14:45:02

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

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

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