您的位置:首页 > 其它

函数值传递,指针传递与引用传递的区别 及解释。

2014-11-02 12:14 246 查看
#include<iostream>

#include <ctime>

using namespace std;

/*第一部分 基础*/

//值

/*void mySwap(int a, int b)

{

int temp = a;

a = b;

b = temp;

}

*/

//指针一

/*void mySwap(int *a, int *b)

{

int *temp = a;

a = b;

b = temp;

}*/

//指针二

/*void mySwap(int *a, int *b)

{

int temp = *a;

*a = *b;

*b = temp;

}*/

//引用

/*void mySwap(int &a, int &b)

{

int temp = a;

a = b;

b = temp;

}*/

int main()

{

int n = 15, m = 20;

cout << "before:\tn = " << n << ", \tm = " << m << endl;

// 如果是传指针请用这种方式调用:

// mySwap(&n, &m);

mySwap(n, m);

cout << "after:\tn = " << n << ", \tm = " << m << endl;

return 0;

}

/*第二部分 提升*/

//值

/*void mySwap(int a, int b)

{

cout << "mySwap:\t&a = " << &a << ", \t&b = " << &b << endl;

}*/

//指针

/*void mySwap(int *a, int *b)

{

cout << "mySwap:\t&a = " << &a << ", \t&b = " << &b << endl;

cout << "mySwap:\ta = " << a << ", \tb = " << b << endl;

}

*/

//引用

/*void mySwap(int &a, int &b)

{

cout << "mySwap:\t&a = " << &a << ", \t&b = " << &b << endl;

}*/

/*int main()

{

int n = 15, m = 20;

cout << "before:\t&n = " << &n << ", \t&m = " << &m << endl;

cout << endl;

cout << "mySwap function called:" << endl;

// 如果是传指针请用这种方式调用:

// mySwap(&n, &m);

mySwap(n, m);

cout << "mySwap function end:" << endl;

cout << endl;

cout << "after:\t&n = " << &n << ", \t&m = " << &m << endl;

return 0;

}*/

/*第三部分 超神*/

//利用clock函数测试是时间

/*struct Node

{

int num[10000];

};

void testByValue(Node a) { }

void testByReference(Node &a) { }

void testByPointer(Node *a) { }

int main()

{

time_t startTime, endTime;

Node n;

n.num[0] = 2222;

int maxNum = 10000000;

int i = maxNum;

// testByValue starts

startTime = clock();

while (i--)

testByValue(n);

endTime = clock();

cout << "testByValue: " << (double)(endTime-startTime) << "ms" << endl;

// testByValue ends

i = maxNum;

// testByReference starts

startTime = clock();

while (i--)

testByReference(n);

endTime = clock();

cout << "testByReference: " << (double)(endTime-startTime) << "ms" << endl;

// testByReference ends

i = maxNum;

// testByPointer starts

startTime = clock();

while (i--)

testByPointer(&n);

endTime = clock();

cout << "testByPointer: " << (double)(endTime-startTime) << "ms" << endl;

// testByPointer ends

return 0;

}*/

第一部分

值传递




指针传递(一)




(二)






传递引用






区别:

值传递 被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主函数中的实参变量的值。



指针传递(一) 这种方法是在被调函数中,传入n,m的地址给两个局部指针a,b。是原本指向n的a指向m,b指向n。这个函数仅仅使两个局部指针指向交换,对于n,m本身的值并无任何修改。

(二) 传入n,m的地址给两个指针a,b,然后交换a,b所指向地址内存储的值,这是通过指针对其所指向地址内的值也即n,m的值进行修改。



引用传递 引用传递虽然也为两个局部变量开辟了内存,但是这两个局部变量中存储的实际是主函数中n,m的地址。所以对局部变量的修改就相当于对主函数中变量的修改。









第二部分

值传递





指针传递








引用传递






由图可清晰显示。

值传递时调用函数创建局部变量是新开辟内存,与主函数中变量无关。

指针传递时创建的指针所指向的地址是主函数中n,m的地址。

引用传递新创建的变量的地址仍是原来的地址。只是名称改变而已



















第三部分



Max = 1000000






Max = 10000000






Max = 1000000

数组大小 10000








由图明显的出结论。

值传递效率远远低于传递引用和传递指针的效率。



因为值传递需要将传递的参数中的数据全部拷贝给形参。当数据数量很大的时候,就会特别慢。

指针传递也需要拷贝,但是拷贝的是固定字节的地址。不受变量内容大小的影响。

引用传递也需要拷贝,但是它只是在原来的地址上给变量另起一个别名。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: