指针与引用的二三事

指针:一个储存一个地址的整型对象,即一个整数,以指针所存地址开头,指针类型对应类型那么大(如char指针对应内存大小为1个字节)的那块内存,我们称作指针所指内存,编译器根据指针的类型操作指针指向内存。

引用:作为一个对象的别名,对引用的所以操作均可看做对其绑定对象的操作,并且引用在定义时必须初始化,且此后不能再改变它。

对于指针,有两种const。

1:constant pointer

常量指针,即指针本身即为常量。也就是不可以修改指针本身,指针像引用一样,初始化以后,从一而终。

2:pointer to constant 指向常量的指针。

这里指向常量的意思,并不是说,指针指向的那块内存真的是只读的,不可修改的,而且编译器这么认为,所以,你不可以通过指针做任何可能修改那块内存的行为,不仅如此,c++相对于c,还做出了一个合理的改变,禁止了pointer to constant 向pointer to variable 赋值,这个类型转换过程是禁止的,于是在c++里,我们就可以放心地使用const 常量而不用担心自己一不小心把常量给改了而只能使用宏,当然我不是说宏不好。只是const 感觉更自然。

接下来再说一下reference to constant

刚才说const 常量 可以放心使用了,就是因为我们断绝了通过指针间接改变它的途径,但是,除了指针外,还有一种方式可以间接改变内存,没错就是引用,为了防止这种尴尬的事发生,引用同样也有const 不能赋值给非const 的规则,此外常量引用还有一个神奇的地方就是可以接受字面值,于是如果在函数中我们不会修改参数的值,那么我们一般使用常量引用,这样就可以接受字面值减小可能的错误,但其实如果我们不想修改参数的话,一般我们直接使用形参就好,没必要使用引用。关于引用还有一点,一般来说,引用即别名,它只代表他所绑定的对象,但在作为decltype的参数时,会保留引用的特性。比如

int i;

int &ri=i;

decltype(ri  ) v;

v的类型是int &而不是int故上面程序会报错。

最后说一下顶层const与底层const

其实底层const 就是对那些间接使用内存的变量的const

就是 pointer to constant 与reference to

constant,在一些类型转换过程中,会出现const 向非const 的转换,如

const int ci=1;

int i=ci;

上面说过的两种const类型向非const转换是被禁止的,这种怎么变都不会消失的const我们称作底层const,其他类型的const与之对应的我们称为顶层const。其实本来是为了概念的清晰理解引出的分类,结果因为讲特例讲的太细,差点把我绕晕了。

时间: 2024-10-14 13:42:21

指针与引用的二三事的相关文章

动态创建二维vector数组+指针与引用的区别

二维vectorvector<vector <int> > ivec(m ,vector<int>(n));    //m*n的二维vector 动态创建m*n的二维vector方法一:vector<vector <int> > ivec;ivec.resize(m);for(int i=0;i<m;i++) ivec[i].resize(n); 方法二:vector<vector <int> > ivec;ivec

指针的指针,指针的引用(不是二维指针)

详解c++指针的指针和指针的引用 展示一下使用指针的指针和指针的引用修改传递给方法的指针,以便更好的使用它.(这里说的指针的指针不是一个二维数组) 为什么需要使用它们 当我们把一个指针做为参数传一个方法时,其实是把指针的复本传递给了方法,也可以说传递指针是指针的值传递. 如果我们在方法内部修改指针会出现问题,在方法里做修改只是修改的指针的copy而不是指针本身,原来的指针还保留着原来 的值.我们用下边的代码说明一下问题: int m_value = 1; void func(int *p) {

C++学习基础二——指针与引用的区别

一.指针: (1)如果对指针进行解引用操作 赋值,改变的是指针所指向对象的值:(2)如果不对指针进行解引用操作 赋值,则改变的是指针本身的值:(3)const指针本身的值不能修改,但是const指针所指向对象的值能不能修改取决于其所指向对象是否为const类型. 例如: 代码片段1: string s1("some value"); string *sp1 = &s1;//此时s1的值为“some value”,指针sp1指向s1 string s2("another

Golang 才是学习指针的安全之地,关于指针的二三事

感谢平台分享-http://bjbsair.com/2020-04-10/tech-info/53305.html 本章学习目标 学会声明和使用指针 理解指针和随机访问存储器(RAM)之间的关系 了解指针的使用时机 当我们在街上散步的时候,常常会看到一些用于指引方位的地址和街道标识.你可能曾经遇到过这样一种情况,一家大门紧闭的商店在它的橱窗上贴出了道歉标语"抱歉,本店已乔迁新址!",并在标语的下方给出新的地址.指针就有点儿像这个给出新地址的标语,它会把你指引至不同的地址. 指针是指向另

指针与引用同与不同

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

指针和引用的区别(More Effective c++ )

指针与引用看上去完全不同(指针用操作符"*"和"->",引用使用操作符". " ),但 是它们似乎有相同的功能.指针与引用都是让你间接引用其他对象.你如何决定在什么时候 使用指针,在什么时候使用引用呢? 首先,要认识到在任何情况下都不能使用指向空值的引用.一个引用必须总是 指向某些 对象 .因此如果你使用一个变量并让它指向一个对象, 但是该变量在某些时候也可能不指向 任何 对象,这时你应该把变量声明为指针,因为这样 你可以赋空值给该变量.相

转: 浅谈C/C++中的指针和数组(二)

转自:http://www.cnblogs.com/dolphin0520/archive/2011/11/09/2242419.html 浅谈C/C++中的指针和数组(二) 前面已经讨论了指针和数组的一些区别,然而在某些情况下,指针和数组是等同的,下面讨论一下什么时候指针和数组是相同的. C语言标准对此作了说明: 规则1:表达式中的数组名被编译器当做一个指向该数组第一个元素的指针: 注:下面几种情况例外 1)数组名作为sizeof的操作数 2)使用&取数组的地址 规则2:下标总是与指针的偏移量

C++_系列自学课程_第_8_课_指针和引用_《C++ Primer 第四版》

C语言最富有迷幻色彩的部分当属指针部分,无论是指针的定义还是指针的意义都可算是C语言中最复杂的内容.指针不但提供给了程序员直接操作硬件部分的操作接口,还提供给了程序员更多灵活的用法.C++继承这一高效的机制,同时引入了另一个与指针相似但不相同的机制: 引用. 一.引用 简单的来说,引用就是变量的别名(alias), 通过别名我们可以操作引用代表的变量. 定义一个引用的语法如下所示: 变量类型   &引用标识符 = 变量名. Exp: int iVar=10; int &iRef = iVa

初识zabbix需了解的二三事

简介 zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案: zabbix能监视各种网络参数,保证服务器系统的安全运营:并提供灵活的通知机制以让系统管理员快速定位/解决存在的各种问题: 监控平台的组成 数据采集 --> 数据存储 --> 数据展示和分析 --> 报警 常见监控实现方案对比 cacti 优点:利用rrdtool绘图,图形美观: 缺点:报警功能薄弱,不适合大规模监控场景: nagios 优点:报警功能强大: 缺点:只关心正常与否的状态,数