C++中引用的使用总结
1引用的定义
引用时C++对C的一个重要的扩充,引用的作用是给变量起一个别名。
例如:
int a;
int &b=a;//声明b是a的引用
经过以上的声明,b就成为了a的别名,a和b的地位以及作用都是一样的。
将b声明为a的引用,不需要再为b开辟新的单元,b和a在内存中占同一存储单元,它们具有相同的地址。
#include<iostream>
using namespace std;
int main(){
int a=10;
int &b=a;//声明b是a的引用
cout<<"b="<<b<<endl;
a=a-5;
cout<<"b="<<b<<endl;
b=b-1;
cout<<"a="<<a<<endl;
return 0;
}
在程序中,
声明了b是a的引用,然后输出b=10;
然后使a的值减小5,再输出b=5,说明b会随着a的变化做出变化;
然后使b的值减小1,再输出a=4,说明a会随着b的变化做出变化。
在声明一个引用的同时,必须同时对它进行初始化,即声明它代表哪一个变量。在声明变量b是变量a的引用后,就可以将b作为a的别名来进行操作,并且b不能再作为其他变量的引用(别名)。
声明引用,而不进行初始化操作:
#include<iostream>
using namespace std;
int main(){
int a=10;
int &b;
return 0;
}
编辑器报错
========================================
已经申明p为a的引用之后,在声明p为b的引用
#include<iostream>
using namespace std;
int main(){
int a=10;
int &p=a;
int b=5;
int &p=b;
return 0;
}
编辑器报错:
注意区分:
int &b=a;表示b是a的引用
int *b=&a;表示b是指针变量,并且b的值是a的地址
引用不是一种独立的数据类型,必须指定其代表的某一类实体(如变量,类对象),不能定义引用数组,不能定义指向引用的指针,也不能定义指针的引用。
2 引用作为函数的参数
C++增加引用机制,主要是把它作为函数参数,以扩充函数传递数据的功能。
函数的参数传递有三种情况
将变量名作为形参和实参
这是传给形参的是变量的值,传递是单向的。如果在执行被调用函数期间,形参的值发生变化,是不能反映到实参的。因为形参只是复制了实参的数值,两变量并不是占用同一存储单元。
#include<iostream>
using namespace std;
int main(){
void change(int x,int y);
int i=3,j=2;
change(i,j);
cout<<i<<endl;
cout<<j<<endl;
return 0;
}
void change(int x,int y){
int z;
z=x;
x=y;
y=z;
}
x复制了i的值,y复制了j的值。但i和j与x和y占不同的存储单元,因此只改变x和y的值,并不能改变i和j的值。
将变量地址作为实参,指针作为形参
这种方式仍然是值传递的方式,不过他传递的不是变量的数值,而是变量的地址。因此可以在被调用函数中,通过调用指针指向的变量来改变相应变量的值。
#include<iostream>
using namespace std;
int main(){
void change(int * x,int * y);
int i=3,j=2;
change(&i,&j);
cout<<i<<endl;
cout<<j<<endl;
return 0;
}
void change(int * x,int * y){
int *z;
z=x;
x=y;
y=z;
}
因为是值传递,所以只改变指针的值,而不去改变指向的变量的值,还是不能改变相应的变量的值。
#include<iostream>
using namespace std;
int main(){
void change(int * x,int * y);
int i=3,j=2;
change(&i,&j);
cout<<i<<endl;
cout<<j<<endl;
return 0;
}
void change(int * x,int * y){
int *z;
*z=*x;
*x=*y;
*y=*z;
}
当改变指针指向的变量的值的时候,相应的变量的数值也会发生变化。
将变量名作为实参,引用作为形参
将变量名作为形参和实参和将变量地址作为实参,指针作为形参都是采用的值传递的方式。而引用作为形参的时候,采用的是地址传递的方式。
#include<iostream>
using namespace std;
int main(){
void change(int & x,int & y);
int i=3,j=2;
change(i,j);
cout<<i<<endl;
cout<<j<<endl;
return 0;
}
void change(int & x,int & y){
int z;
z=x;
x=y;
y=z;
}
在函数change的形参中声明了a,b是整形变量的引用。当main函数调用change函数时,把实参i的地址传递给形参x,把实参j的地址传递给形参y,从而使i和x共享同一个单元,使j和y共享同一个单元。也可以理解成,把i的变量名传递给了x,把j的变量名传递给了y。
引用作为形参与指针变量作为形参的区别
1使用引用类型,就不必在swap函数中声明形参是指针变量。指针变量要另外开辟内存单元,其内容是地址。而引用不是一个独立的变量,不单独占内存单元,引用的数据类型应该应该与实参相同。
2 在main函数中,实参不必用变量的地址,而是直接用变量名。系统向形参传递的是实参的地址而不是实参的值。
3 由于不能声明指针的引用,那我们如何像指针那样传递可以通过传递数组的首元素来实现传递整个数组的数据呢?
使用指针作为形参:
#include<iostream>
using namespace std;
int main(){
void Print(int *p,int n);
int a[5]={1,2,3,4,5};
Print(a,5);
return 0;
}
void Print(int *p,int n){
int i;
for(i=0;i<n;i++){
cout<<p[i]<<endl;
}
}
======================================================
使用引用作为形参
#include<iostream>
using namespace std;
int main(){
void Print(int &p,int n);
int a[5]={1,2,3,4,5};
Print(a[0],5);
return 0;
}
void Print(int &p,int n){
int i;
int *a=&p;
for(i=0;i<n;i++){
cout<<a[i]<<endl;
}
}
因为引用就是给原来的变量起了别名,并且不能声明指针的引用,所以我们就声明指针指向的变量的引用,然后再对引用取地址,就达到了这个目的。
为了更清楚的说明,下面再举一个例子:
#include<iostream>
using namespace std;
int main(){
int i=10;
int *p;
p=&i;//将i的地址赋给指针p
int &y=*p;//将y作为指针p指向的变量的引用
cout<<y<<endl;
if(&y==p)cout<<"succeed"<<endl;//检查y的地址和指针p的值是否相等
return 0;
}
#include<iostream>
using namespace std;
int main(){
int a[5]={1,2,3,4,5};
int &y=a[0];//声明y作为数组的首元素的引用
int *p=&y;//将y的地址赋给指针p
int i=0;
for(;i<5;i++){
cout<<p[i]<<endl;
}
return 0;
}
相关文章
- vector是表示可以改变大小的数组的序列容器,本文主要介绍了C++STL标准库std::vector的使用详解,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2022-03-06
- 这篇文章主要介绍了C++中取余运算的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-23
- 这篇文章主要介绍了C++ string常用截取字符串方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
- 本文通过例子,讲述了C++调用C#的DLL程序的方法,作出了以下总结,下面就让我们一起来学习吧。...2020-06-25
- 本篇文章主要介绍了C++中四种加密算法之AES源代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。...2020-04-25
- 整数拆分,指把一个整数分解成若干个整数的和。本文重点给大家介绍C++ 整数拆分方法详解,非常不错,感兴趣的朋友一起学习吧...2020-04-25
- 这篇文章主要介绍了C++中Sort函数详细解析,sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变...2022-08-18
- 这篇文章主要介绍了C++万能库头文件在vs中的安装步骤(图文),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-23
- 这篇文章主要介绍了C++ bitset用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
- 本篇文章小编并不是为大家讲解string类型的用法,而是讲解我个人比较好奇的问题,就是string 类型占几个字节...2020-04-25
- 这篇文章主要为大家详细介绍了C++ Eigen库计算矩阵特征值及特征向量,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-04-25
- 这篇文章主要介绍了C++ pair的用法实例详解的相关资料,需要的朋友可以参考下...2020-04-25
- 这篇文章主要介绍了VSCode C++多文件编译的简单使用方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-03-29
- 虽然C++11引入了智能指针的,但是开发人员在与内存的斗争问题上并没有解放,如果我门实用不当仍然有内存泄漏问题,其中智能指针的循环引用缺陷是最大的问题。下面通过实例代码给大家介绍c++中的循环引用,一起看看吧...2020-04-25
- 这篇文章主要给大家介绍了关于C++随机点名生成器的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
- map容器是C++ STL中的重要一员,删除map容器中value为指定元素的问题是我们经常与遇到的一个问题,下面这篇文章主要给大家介绍了关于利用C++如何删除map容器中指定值的元素的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。...2020-04-25
- 这篇文章主要介绍了C++ 约瑟夫环问题案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...2021-08-15
- 这篇文章主要介绍了C++中cin的用法详细,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
- 本篇文章是对C++中的常见编译错误进行了详细的分析介绍,需要的朋友参考下...2020-04-25
- 在本篇内容里小编给大家分享了关于C++实现递归函数的教学步骤,需要的朋友跟着参考下。...2020-04-25