值传递、指针传递与引用传递

/*

**test12.cpp : Defines the entry point for the console application.

**系统winXP SP3 32位.

**值传递、指针传递与引用传递

*/

#include "stdafx.h"

void swap1(int x,int y)  //值传递1

    int tmp; 

    tmp=x; 

    x=y; 

    y=tmp;   

void swap2(int* x, int* y) //值传递2(传递地址,交换地址内存储的数据)

{

    printf("swap2-before-----iNum1所在的地址为:%x\n", &x);  //12ff24

    printf("swap2-before-----iNum2所在的地址为:%x\n", &y);  //12ff28

    printf("---------------------------\n");

    printf("swap2-before-----iNum1存储的值为:%x\n", *x);  //1

    printf("swap2-before-----iNum2存储的值为:%x\n", *y);  //2

    printf("---------------------------\n");

    int *tmp = NULL;

    tmp = x;

    x = y;

    y = tmp;

//所以交换x,y只是交换了两者存储的值(值为a,b的地址存储的数值),并没有涉及到a,b的值(值为a,b的地址)的交换

//所以只是操作地址并未起到作用

    printf("swap2-later-----iNum1存储的值为:%x\n", *x);  //2

    printf("swap2-later-----iNum2存储的值为:%x\n", *y);  //1

    printf("swap2-later-----iNum1所在的地址为:%x\n", &x);  //12ff24

    printf("swap2-later-----iNum2所在的地址为:%x\n", &y);  //12ff28

/***************************

我们看到不论传递的是值还是指针(指针也是一个值),

传递给被调用函数的都是函数参数的一个拷贝,

直接对拷贝进行操作不会影响参数本身。

    ******************************/

    printf("---------------------------\n");

}

void swap3(int& x, int& y)  //引用传递,也可以改变值,采用const int&

{

    int tmp;

    //这里使用了*表示操作的是指针x,y所指向变量的内容(即变量a,b的内容)

    tmp = x;

    x = y;

    y = tmp;

}

int main() 

//值传递1,值不改变

    int iNum1 = 1,iNum2 = 2; 

    printf("before--addr:%x,%x\n",&iNum1,&iNum2); //iNum1地址为 12ff7c,iNum2地址为 12ff78

    void swap1(int x,int y); 

    printf("before:%d,%d\n",iNum1,iNum2);  //1,2

    swap1(iNum1,iNum2); 

    printf("swap1-----later:%d,%d\n",iNum1,iNum2);  //1,2并未实现交换的结果

    printf("swap1-----later:%d,%d\n",iNum1,iNum2);  //1,2

//值传递2,值(地址中内容)改变

    iNum1 = 1,iNum2 = 2;

    printf("---------------------------\n");

    printf("swap2-----iNum1所在的地址为:%x\n", &iNum1);  //12ff7c

    printf("swap2-----iNum2所在的地址为:%x\n", &iNum2);  //12ff78

    //所以交换x,y只是交换了两者存储的值(值为a,b的地址),并没有涉及到a,b的值的交换

    //所以只是操作地址并没有卵用

    printf("---------------------------\n");

    swap2(&iNum1,&iNum2);

//引用传递,值发生改变

    iNum1 = 1,iNum2 = 2;

    printf("swap3-----before:%d,%d\n", iNum1, iNum2);//1,2

    printf("swap3-before-----iNum1所在的地址为:%x\n", &iNum1);  //12ff7c

    printf("swap3-before-----iNum2所在的地址为:%x\n", &iNum2);  //12ff78

    swap3(iNum1,iNum2);

    printf("swap3-----later:%d,%d\n", iNum1, iNum2);//2,1值发生改变

    printf("swap3-later-----iNum1所在的地址为:%x\n", &iNum1);  //12ff7c

    printf("swap3-later-----iNum2所在的地址为:%x\n", &iNum2);  //12ff78

    return 0; 


Tips:当采用值传递的时候,最好采用const &形式来传递,可增加程序运行效率,因为引用的创建与传递不会调用构造与解析函数。

你可能感兴趣的:(值传递、指针传递与引用传递)