c++2引用和指针

1.引用


概念:引用不是一个定义新的变量,而是给一个已经定义的变量重新起一个名字。


用法:


定义的格式为:类型& 引用变量名=已定义过的变量名;


引用的特点:1. 一个变量可取多个别名


2. 引用必须初始化


3. 引用只能在初始化的时候引用一次,不能改变为再引用其他的变量。


void TestReference1 ()


{


int a = 1;


int& b = a;


cout<<"a:address->" <<&a<< endl;


cout<<"b:address->" <<&b<< endl;






b = 2;


int& c = b; // 引用一个引用变量,别名的别名


c = 3;


}


2.引用做参数


 


1.【值传递】如果形参为非引用的传值方式,则生成局部临时变量接收实参的值
void Swap (int left, int right) // 这里能实现交换吗?
{
int temp = left;
left = right ;
right = temp ;
}
2.【引用传递】如果形参为引用类型,则形参是实参的别名。
void Swap (int& left, int& right)
{
int temp = left;
right = left ;
left = temp ;
}
3.【指针传递】
void Swap (int* pLeft, int* pRight)
{
int temp = *pLeft;
*pLeft = *pRight;
*pRight = temp;
}
void TestReference2 ()
{
int a = 1;
int b = 2;
cout<<"a:" <<a<< endl;
cout<<"b:" <<b<< endl;
Swap (a , b);
cout<<"a:" <<a<< endl;
cout<<"b:" <<b<< endl;
}
测试值传递/引用传递的效率
struct BigData
{
int array [1000];
};
void DealBigData (BigData& x)
{
x.array [0]= 0;
x.array [1]= 1;
x.array [2]= 2;
}
#include <Windows.h>
void TestReference3 ()
{
BigData bd ;
int begin = GetTickCount ();
for (int i = 0; i < 1000000; ++i )
{
DealBigData(bd );
}
int end = GetTickCount ();
cout<<"cost time:" <<end - begin<<endl ;
}
// 3.当不希望函数内改变参数x的值时,尽量使用常引用传参。
void ReadBigData (const bigData& x)
{
int a = x. array[100];
}


3.引用做返回值


int& Add (int d1, int d2)


// int Add ( int d1 , int d2)


{
int ret = d1 + d2;


return ret ;
}


void ()


{


int a = 3, b = 4


int c = Add( a, b );


cout<<"c:" <<c<< endl;
}


4.引用和指针的区别 


1. 引用只能在定义时初始化一次,之后不能改变指向其它变量(从一而终);指针变量的值可变。


2. 引用必须指向有效的变量,指针可以为空。


3. sizeof指针对象和引用对象的意义不一样。sizeof引用得到的是所指向的变量的大小,而sizeof指针是对象地址的大小。


4. 指针和引用自增(++)自减(--)意义不一样。


5. 相对而言,引用比指针更安全。





猜你喜欢

转载自blog.csdn.net/qq_40408443/article/details/79688371
今日推荐