引用的意义

引用作为变量名而存在,因此在一些场合可以代替指针

引用相对于指针来说具有更好的可读性和实用性

void swp (int & a, int &b)

{

  int t = a;

  a =b;

  b =t;

}

const 引用

--在C++中可以声明 const 引用

--const Type& name = var;

--const 引用让变量拥有只读性

int a=4;

const int& b = a;

int* p = (int*) &b;

b = 5;//Error,只读变量

*p = 5; //OK,修改变量 a 值

当使用常量对 const 引用进行初始化时,C++编译器会为常量值分配空间,并将引用名作为这段空间的别名

    const int& b = 1; //OK

    int* p = (int*) &b;

    b = 5; // Error,只读变量

    *p = 5; //OK,修改变量 a 的值

结论:使用常量对const 引用初始化后将生成一个只读变量!!!

引用有自己的存储空间吗?

指针变量存的变量的地址,有自己的存储空间

#include <stdio.h>

struct TRef
{
    char& r;
};

int main(int argc, char *argv[])
{
    char c = ‘c‘;
    char& rc = c;
    TRef ref = { c };

    printf("sizeof(char&) = %d\n", sizeof(char&));
    printf("sizeof(rc) = %d\n", sizeof(rc));

    printf("sizeof(TRef) = %d\n", sizeof(TRef));
    printf("sizeof(ref.r) = %d\n", sizeof(ref.r));

    return 0;
}

引用在C++中的内部实现是一个常量指针

#include <stdio.h>

int& demo()
{
    int d = 0;

    printf("demo: d = %d\n", d);

    return d;   //警告,其实是报错,因为不可能返回局部变量的地址
}

int& func()
{
    static int s = 0;

    printf("func: s = %d\n", s);

    return s;
}

int main(int argc, char* argv[])
{
    int& rd = demo(); //这样rd变成野指针
    int& rs = func();

    printf("\n");
    printf("main: rd = %d\n", rd);
    printf("main: rs = %d\n", rs);
    printf("\n");

    rd = 10; //对野指针操作非常危险!
    rs = 11;

    demo();
    func();

    printf("\n");
    printf("main: rd = %d\n", rd);
    printf("main: rs = %d\n", rs);
    printf("\n");

    return 0;
}

时间: 2024-10-05 23:56:54

引用的意义的相关文章

指针与引用同与不同

一.指针与引用的定义及特性 A.引用(reference):为一个已经存在的对象另起一个名字.它有以下特性: 1.必须初始化 2.始终指向同一个对象,不能更改其所指向的对象 3.自身只是一个别名,不占内存,对其取地址是其指向对象的地址 4.常量引用的意义在于不能通过引用来修改其所指向对象的值,其所指对象可以不是常量 int tempA = 2; const int ctempA = 2; /*1.正常使用*/ int &refA = tempA; const int &crefA = ct

php 中引用的应用

<?php // http://blog.csdn.net/samxx8/article/details/37564103 /** 在PHP 中引用的意思是:不同的名字访问同一个变量内容. (1) 变量之间的引用: $a = 10 ; $b =$a ; // 此时$b和$a所指向的是同一存储地址 ,如果$a = 11 ; 则zend会开辟一个新的单元从来是的$a = 11 ; $b 还是原来的地址 $a = 10 ; $b =&$a ; // 此时$b 就是$a的别名,比如这个人叫小张,大名

c/c++引用真真的用法

1引用(普通引用) 0变量名回顾 变量名实质上是一段连续存储空间的别名,是一个标号 程序中通过变量来申请并命名内存空间 通过变量的名字可以使用存储空间 问题1:对一段连续的内存空间只能取一个别名吗? 引用是C++的概念,属于C++编译器对C的扩展 问题:C中可以编译通过吗? intmain() { inta = 0; int&b = a; //int * const b = &a b= 11; //*b = 11; return0; } 结论:请不要用C的语法考虑b=11 引用概念 在C+

指针、引用的区别和联系

时间:2014.05.27 地点:基地 ---------------------------------------------------------------------------------------- 一.指针和引用的区别 1.指针可以为空,引用不可以不空. 引用是一个对象的别用,定义一个引用时必须初始化,而声名指针时可以不指向任何对象,故使用指针时也常要做空的判断,而引用无需,因为引用总是绑定着一个对象. 2.指针可以改变指向,而引用不可以重新绑定新对象.(指针变异思迁,引用从

C++ 11 左值,右值,左值引用,右值引用,std::move, std::foward

这篇文章要介绍的内容和标题一致,关于C++ 11中的这几个特性网上介绍的文章很多,看了一些之后想把几个比较关键的点总结记录一下,文章比较长.给出了很多代码示例,都是编译运行测试过的,希望能用这些帮助理解C++ 11中这些比较重要的特性. 关于左值和右值的定义 左值和右值在C中就存在,不过存在感不高,在C++尤其是C++11中这两个概念比较重要,左值就是有名字的变量(对象),可以被赋值,可以在多条语句中使用,而右值呢,就是临时变量(对象),没有名字,只能在一条语句中出现,不能被赋值. 在 C++1

C++中引用的本质分析

引用的意义 引用作为变量别名而存在,因此在一些场合可以代替指针 引用相对于指针来说具有更好的可读性和实用性 swap函数的实现对比: void swap(int* a, int* b) { int t = *a; *a = *b; *b = t; } void swap_yinyong(int& a,int& b) { int t = a; a = b; b = t; } int main() { int a = 1; int b = 2; printf("a = %d,b =

C++ const引用

编译器会为const引用创建临时变量 当使用const关键字对引用加以限定后,引用就可以绑定到临时数据了.为什么? 编译器会为临时数据创建一个新的.无名的临时变量,并将临时数据放入该临时变量中,然后再将引用绑定到临时变量.注意,临时变量也是变量,所有的变量都会被分配内存. 为什么编译器为常引用创建临时变量是合理的,而为普通引用创建临时变量就不合理呢? 我们知道,将引用绑定到一份数据后,就可以通过引用对这份数据进行操作了,包括读取和写入(修改):尤其是写入操作,会改变数据的值.而临时数据往往无法寻

前端学PHP之正则表达式基础语法

前面的话 正则表达式是用于描述字符排列和匹配模式的一种语法规则.它主要用于字符串的模式分割.匹配.查找及替换操作.在PHP中,正则表达式一般是由正规字符和一些特殊字符(类似于通配符)联合构成的一个文本模式的程序性描述.正则表达式有三个作用:1.匹配,也常常用于从字符串中析取信息:2.用新文本代替匹配文本:3.将一个字符串拆分为一组更小的信息块.本文将详细介绍PHP中的正则表达式基础语法 [注意]关于javascript的正则表达式的详细信息移步至此 历史 在PHP中有两套正则表达式函数库,两者功

Maven实战02_Maven的安装和配置

1:在Windows上安装Maven 本人系统环境:win10  + JDK1.8 + apache-maven-3.3.9 在安装Maven之前,首先要确定你的Java环境是否已经配置好了,你是否已经正确的安装JDK了.Maven可以运行在JDK1.4及以上的版本. 检查Java安装: Win + R 调出 运行,输入cmd,进入命令行模式 输入: echo %JAVA_HOME%    //回显Java安装路径 java –version               //查看Java版本 如