关闭

C++基础---引用

标签: 引用引用与指针的区别引用-指针与堆空间常引用
296人阅读 评论(0) 收藏 举报
分类:

1. 引用

1.1 引用

  • 引用:就是别名,就是变量的别名。

    (1)定义变量num与初始化变量num的别名rnum
        int num = 1;
        int &rnum = num;
    
    (2)给变量num赋值:
        num = 10;
        =>num = 10; rnum = 10;
    
    (3)给别名rnum赋值:
        rnum = 100;
        =>num = 100;    rnum = 100;

1.2 指针与引用的区别

  • 指针:
    (1)就是用来保存内存地址的变量
    (2)指针进行删除操作后,需要将它们赋为空,也就是说指针可以为空;
    (3)指针可以被赋值
    (4)如果想使一个变量记录不同对象的地址,那么就必须使用指针;
  • 引用:
    (1)就是用来作为变量的别名,它们标识的内存地址是一样的;
    (2)引用不需要作置空处理,因为引用是原来对象的别名;
    假如该对象存放在栈中:那么在对象超出作用域时别名会和对象一起消失;
    假如该对象存放在堆中:由于堆中内存空间必须使用指针来访问,因此用不着别名,即使再定义一个该指针的别名,那么将指针删除并赋空后,该指针的别名中的地址也相应的赋空了;
    (3)引用只能被初始化,不可以被赋为另一个对象的别名;
    (4)引用不能指向不同的对象;

1.3 引用就是别名常量

  • 定义了某个变量的别名,那么该别名就永远属于这个变量。一个别名只能对应一个变量,不能同时作为多个变量的别名,而一个变量可以有多个别名
  • 定义引用时,一定要对该引用进行初始化。引用就如同常量,只能对其初始化,不能对其赋值

    1)正确的例子:
        int a;
        int &ra = a;
    
    (2)错误的例子:
        int a;
        int &ra;
        ra = b;  

1.4 引用、指针与堆空间

  • 在堆中创建一块内存区域,必须要用指针来指向它,否则该区域就会变成无法访问的内存空间。当然也可以使用引用来引用指向内存空间的指针。

    int *p = new int;
    int &r = *p; //这样r就成了指针p读取到的值的别名
    r = 4;
    cout<<*p; //*p 和 r 的值都是4
  • 我们不可以直接用引用来指向堆中新建的空间,因为引用只是个别名,它不可以作为指针来使用。如int &r = new int;这是错误的。正确的写法是int *&r = new int;定义了r为新空间的别名。

    
    #include <iostream>
    
    using namespace std;
    int main()
    {
        int *&r = new int;
        *r = 6;
        cout<<"读取新建空间地址处的值:"<<*r<<endl;
        cout<<"输出新建空间的地址:"<<r<<endl;
        cout<<"读取r地址处的值:"<<*&r<<endl;
        cout<<"r的内存地址:"<<&r<<endl; 
        return 0;
    }
    =>读取新建空间地址处的值:6
      输出新建空间的地址:00031148
      读取r地址处的值:00031148
      r的内存地址:0013FF78
    (1)*r:用星号来*访问r,就是访问堆中空间的数据;
    (2)r:保存的是堆中空间的地址;
    (3)&r:由于"&r"前加了个星号*,那么&r就是一个指针变量,获取系统自动为这个变量分配的内存地址,就像获取一个指针变量的内存地址一样,如int*  p; cout<<&p;;
    (4)*&r:就是读取堆中空间的地址,与r一样;

    注:上述例子建议不要使用,明白原理即可
    (1)正常情况下: 定义了r为新空间的别名;
    (2)不正常的情况下: 也就是机器虚拟内存太小,无法创建新空间的情况下,那么new int会自动返回一个空指针。引用不能为空, 因此在这种情况下使用语句int * &r = new int;就会导致产生一个无用的别名。而是用星号(”*“ ) 读取一个无用的别名则会引起系统崩溃
    解决方法: 就是不要将引用初始化为新建内存区域的别名,而将r初始化为指向该区域的指针的别名。
    int *p = new int;
    if (p != null)
    {
     int &r = *p;
    }

1.5 常引用的定义

  • 常引用:用这种方式声明的引用,不能通过引用对目标变量的值进行修改,从而使引用的目标成为const,达到了引用的安全性。
  • 常引用声明方式:const 类型标识符 &引用名=目标变量名;

    int a;
    const int &ra=a;
    
    ra=1; //错误,由于引用定义为常引用,因此不能通过引用对目标变量的值进行修改
    
    a=1; //正确
  • 常引用的作用:避免通过别名的方式修改变量的值

参考文献:
[1]《C++全方位学习》范磊——第九章
[2]《C++程序设计教程(第二版)》钱能——第三章
[3] 百度搜索关键字:C++引用、引用与指针的区别、常引用

0
0
查看评论

C++基础知识汇总

C++面试题——基础概念篇 唐璐 http://blog.csdn.net/worldwindjp/         面试C++程序员的时候一般都是3板斧,先是基础问答,然后一顿虚函数、虚函数表、纯虚函数、抽象类、虚函数和析构函数、虚函数...
  • weiyuefei
  • weiyuefei
  • 2016-08-01 20:59
  • 1099

C++基础(九)-引用

1. 引用概念 c++中新增了引用的概念,引用可以作为一个已定义变量的别名。引用是c++对c的重要扩充。在c/c++中指针的作用基本都是一样的,但是c++增加了另外一种给函数传递地址的途径,这就是按引用传递(pass-by-reference),它也存在于其他一些编程语言中,并不是c++的发明。 1...
  • mbl114
  • mbl114
  • 2017-09-22 00:31
  • 90

【C++ 基础】——引用

基本数据类型的引用 #include int main(void){ int a=3; int &b=a;//引用必须初始化 b=10; cout<<a<<endl; return 0; } 输出结果:10 改变的引...
  • u013045971
  • u013045971
  • 2015-07-07 22:57
  • 686

C++基础试题,面试题,基础知识点

转自:http://blog.sina.com.cn/s/blog_a8b2435901013nw3.html 1,关于动态申请内存 答:内存分配方式三种: (1)从静态存储区域分配:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。 全局变量,sta...
  • qq_24378389
  • qq_24378389
  • 2017-09-12 16:33
  • 495

C++基础:引用

函数中参数的传递方式: 传值:在函数域中为参数重新分配内存,而把实参的数值传递到新分配的内存中。     优点:不会改变实参的值; 引用:引用不是定义一个新的变量,而是给一个已经定义的变量重新起一个别名,也就是C++系统不为引用类型变量     分配内存...
  • wjxxaut
  • wjxxaut
  • 2016-07-17 19:49
  • 129

C++编程基础题

题目: 1.字符串转为int 输入1234 输出1234 注意:输入的必须为字符串,输出必须为int型 2.偶数位转为大写 例如: 输入:lanzhihui is a boy! 输出:lAnZhIhUi Is A BoY! 注意:空格也算一位,符号不变. 3.每个单词偶数位转为大写 例如:...
  • byr940923
  • byr940923
  • 2015-04-02 01:06
  • 185

学习C++程序设计需要什么基础

在上学期的C语言程序设计后 这学期开设c++程序设计,这次课上的很波澜,在封装继承上完之后,课程被多数人反应由于C语言基础不好听不懂,老师又不得以返回从面的C语言基础部分再从新上起,个人凭感觉再经行通俗的总结一下。 语言有千万总,精通了一门语言之后,去学习下一门语言,需要继承什么之前学习的特征...
  • tyh18226568070
  • tyh18226568070
  • 2017-11-09 22:50
  • 119

经典基础C++笔试题2(附答案)

1. C中static有什么作用? (1)隐藏。 当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性,故使用static在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。 (2)static的第二个作用是保持变量内容的持久。存储在静态数据区的变量会在程序刚...
  • panda1234lee
  • panda1234lee
  • 2013-05-15 20:30
  • 2061

对C++基础知识的总结(主要针对笔试面试)

C++的魅力在于其丰富多彩的性格特征:其行为方式既可以像C一样面向过程也可以面向对象(专注Class 很多年)、封装性(城府很深)、继承性(富二代)、多态性(多重人格/精神分裂/变态),谜一样的男神,常年霸占编程语言“琅琊榜”前三甲(今年排行第一的高富帅是Java)。本篇将根据以下C++男神养成的大...
  • black_yu
  • black_yu
  • 2016-03-19 17:37
  • 1380

笔试整理之C++基础试题

1、i++跟++i (1)单独执行后,i的值都增加了1 (2)i++可以做左值,++i不可以 左值:C/C++语言中可以放在赋值符号左边的变量,即具有对应的可以由用户访问的存储单元,并且能够由用户去改变其值的量。 具体函数实现: // 前缀形式: int& int::operator++...
  • wzy0754
  • wzy0754
  • 2017-02-27 19:03
  • 256
    个人资料
    • 访问:273223次
    • 积分:6208
    • 等级:
    • 排名:第4742名
    • 原创:158篇
    • 转载:0篇
    • 译文:0篇
    • 评论:24条