一.引用的定义🍗
引用是已定义的变量的别名。
例如将data作为value的引用(别名),则可以随意使用data或value来表示该变量。
引用有何作用呢? 其主要作用是作为函数的形参(和函数的返回值)。这样 函数的形参就是实参本身,而不是其副本。这样除指针外,引用也为函数处理大型结构提供了一种非常方便的途径,同时对于设计类来说,引用也是必不可少的。
1.创建引用变量🍗
类型名 & 引用变量名 = 被引用的变量名;
int main()
{
int a = 100;
int& b = a;//b是a的引用
cout << "a=" << a << ",b=" << b << endl;
++a;
cout << "a=" << a << ",b=" << b << endl;
++b;
cout << "a=" << a << ",b=" << b << endl;
//输出两个变量的地址
cout << "&a=" << &a << ",&b=" << &b << endl;
return 0;
}
2.&的含义🍗
含义1:作为取地址符号,例如int a=10; int*p=&a; 这里的&是取地址的意思含义2:作为引用符号,例如int a=10 int &b=a; 这里的&是引用的意思
int a = 10;
cout<<&a<<endl;//&表示取地址符
int &b = a; //&表示引用
这两个怎么区分呢?
定义语句(前面有数据类型)中&表示引用;在使用语句(前面没有数据类型)中&表示取地址符。
//&:取地址符和引用的区别
int main()
{
int a = 10;
int b = 20;
int* p = &a;//&取地址符, a的前面没有类型
int& b = a;// &引用 ,b的前面有类型
int* q = p;//指针赋值
int* & p1 = p;//&引用,p1是p的引用
int** q2 = &p;//&取地址符,p的前面没有类型
return 0;
}
第9行int *& p1 = p;比较复杂,因为p的类型是int *,所以它的引用应该是int * &。
对于C语言用户而言,首次接触到引用时可能也会有些困惑,因为你很自然地会想到指针,但它们之间还是有区别的。例如,可以创建指向a的引用和指针:
int &b = a;//引用,b是a的别名
int *p = &a;//指针,p保存a的地址
这样,表达式b和*p都可以表示a,而表达式&b和p都可以表示&a。从这一点来说,引用看上去很像伪装的指针(其中,*解引用运算符被隐藏)。实际上,引用除了和指针表示法不同外,还有其它的区别。
指针和引用区别:1.引用在定义时必须将其初始化,而指针可以先定义,再赋值。
int c = 10;
int &d;//错误,引用在定义时必须初始化
d = c;
int *p;//合法,定义指针不初始化
p = &c;//合法,给指针赋值
注意: 引用在定义时必须进行初始化
指针和引用区别:2.引用更接近const指针,一旦与某个变量关联起来,就将一直效忠于它,不能再作为别的变量的引用。也就是说:
int &b = a;
实际上和下述代码的效果类似:
int *const p = &a;
其中,引用b扮演的角色和*p相同。
下面的代码,试图将a变量的引用,改为b变量的引用,将发生什么呢?
int main()
{
int a = 10;
int b = 20;
int& c = a; //c是a的引用
cout << "a=" << a << ",c=" << c << endl; //输出a,c的值
cout << "&a=" << &a << ",&c=" << &c << endl;//输出a,c的地址
cout << endl;
c = b; //试图将c修改为b的引用,c有没有引用b呢?
cout << "b=" << b << ",c=" << c << endl;//输出b,c的值
cout << "&b=" << &b << ",&c=" << &c << endl;//输出b,c的地址
cout << endl;
c = 50; //修改引用的值
cout << "a=" << a << ",b="<<b<<",c=" << c << endl;//输出a,b,c的值
cout << "&a="<<&a<<",&b=" << &b << ",&c=" << &c << endl;//输出a,b,c的地址
return 0;
}
二.将引用作为函数参数🍗
引用经常被用作函数参数,使得函数中的形参为调用程序中实参的别名。这种传递参数的方法称为按引用传递。C++新增这项特性是对C语言的超越,C语言只能按值传递或按指针传递。按值传递导致形参使用的仅仅是实参的副本,下面通过交换函数来进行演示:
//按值传递,形参只是实参的副本,不能达到交换值的效果 void Swapv(int x, int y)//错误的 { int tmp = x; x = y; y = tmp; } //按指针传递,可以实现两个数的交换 void Swapp(int* p1, int* p2) { int tmp = *p1; *p1 = *p2; *p2 = tmp; } //按引用传递 void Swapr(int& x, int& y) { int tmp = x; x = y; y = tmp; } int main() { int a = 10, b = 20;//创建三组需要交换的变量 int c = 10, d = 20; int e = 10, f = 20; cout << "按值传递,交换前:" << a << "," << b << endl; Swapv(a,b); cout << "按值传递,交换后:" << a << "," << b << endl; cout << endl;//输出空行 cout << "按指针传递,交换前:" << c << "," << d << endl; Swapp(&c, &d); cout << "按指针传递,交换后:" << c << "," << d << endl; cout << endl;//输出空行 cout << "按引用传递,交换前:" << e << "," << f << endl; Swapr(e, f); cout << "按引用传递,交换后:" << e << "," << f<< endl; return 0; }
三.指针与引用的区别🍗
1.从语法规则上讲,指针变量存储某个实例(变量或对象)的地址;引用是某个实例的别名。
2.程序为指针变量分配内存;而不为引用分配内存。
3.指针变量的值可以发生改变,存储不同实例的地址;引用在定义时就被初始化,之后无法改变(不能是其他对象的引用)。
4.指针变量的值可以为空(NULL,nullptr),但引用不能为空,没有空引用。
5.指针变量作为形参时需要测试它的合法性(判空NULL);引用不需要判空(引用不能为NULL);
创作不易,如果喜欢的化给个赞以表支持吧!