C++中引用的使用总结

 更新时间:2013年10月16日 10:26:31   作者:  
以下是对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(){
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int a=10;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int &b=a;//声明b是a的引用
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;cout<<"b="<<b<<endl;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;a=a-5;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;cout<<"b="<<b<<endl;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;b=b-1;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;cout<<"a="<<a<<endl; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;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;
}

相关文章

  • C语言中获取和改变目录的相关函数总结

    C语言中获取和改变目录的相关函数总结

    这篇文章主要介绍了C语言中获取和改变目录的相关函数总结,包括getcwd()函数和chdir()函数以及chroot()函数的使用方法,需要的朋友可以参考下
    2015-09-09
  • C++实现简易选课系统代码分享

    C++实现简易选课系统代码分享

    这篇文章主要介绍了C++实现简易选课系统及实现代码的分享,具有一定的参考价值,需要的小伙伴可以参考一下,希望对你有所帮助
    2022-01-01
  • C/C++中虚函数详解及其作用介绍

    C/C++中虚函数详解及其作用介绍

    这篇文章主要介绍了C/C++中虚函数详解及其作用介绍,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • C/C++实现segy文件的读取详解

    C/C++实现segy文件的读取详解

    SEGY是地震数据一般以地震道为单位进行组织,采用SEG-Y文件格式存储。标准SEGY文件一般包括三部分:卷头、道头与地震道数据。本文将介绍利用C++读取segy文件的方法,感兴趣的可以了解一下
    2022-03-03
  • 利用C++实现最长公共子序列与最长公共子串

    利用C++实现最长公共子序列与最长公共子串

    这篇文章主要给大家介绍了如何利用C++实现最长公共子序列与最长公共子串,文章一开始就给大家简单的介绍了什么是子序列,子串应该比较好理解就不用多介绍了,人后通过算法及示例代码详细介绍了C++实现的方法,有需要的朋友们可以参考借鉴,下面来一起看看吧。
    2016-12-12
  • C语言二维数组应用实现扫雷游戏

    C语言二维数组应用实现扫雷游戏

    这篇文章主要为大家详细介绍了C语言二维数组应用实现扫雷游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • 使用OpenGL创建窗口的示例详解

    使用OpenGL创建窗口的示例详解

    OpenGL,也就是Open Graphics Library。其主要就是用于我们去渲染2D、3D矢量图形的一种跨语言、跨平台的应用程序编程接口,这篇文章主要介绍了使用OpenGL创建窗口,需要的朋友可以参考下
    2022-04-04
  • C语言switch语句和if用法介绍

    C语言switch语句和if用法介绍

    本文详细讲解了C语言switch语句和if用法介绍,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-12-12
  • 详解Dijkstra算法原理及其C++实现

    详解Dijkstra算法原理及其C++实现

    Dijkstra算法用于计算一个节点到其他节点的最短路径。Dijkstra是一种按路径长度递增的顺序逐步产生最短路径的方法,是一种贪婪算法。本文将详解Dijkstra算法原理及其C++实现,感兴趣的可以了解一下
    2022-07-07
  • C语言实现出栈序列合法性判定

    C语言实现出栈序列合法性判定

    这篇文章主要为大家详细介绍了C语言实现出栈序列合法性判定,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-05-05

最新评论