#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
由图明显的出结论。
值传递效率远远低于传递引用和传递指针的效率。
因为值传递需要将传递的参数中的数据全部拷贝给形参。当数据数量很大的时候,就会特别慢。
指针传递也需要拷贝,但是拷贝的是固定字节的地址。不受变量内容大小的影响。
引用传递也需要拷贝,但是它只是在原来的地址上给变量另起一个别名。