您的位置:首页 > 编程语言 > C语言/C++

区分 C++ 指针跟引用

2016-01-18 14:47 281 查看
声明:文章内部使用了其他blog的举例说明,声索权在于blog作者本身,若有需要请在本blog下留言 追加引用链接等.

总述:

指针跟引用都是地址的概念

指针 指向一块内存,它的内容是 所指内存的地址

引用某块内存的别名

区别:

指针是一个实体 ; 而引用仅是一个别名

被使用时,引用可以直接使用 ; 而指针需要解引用

引用只能在定义时被初始化一次,之后不可变 ; 指针的指向可以改变

引用的指向 “从一而终,不会发生变化”

引用没有const ; 指针有const

被const修饰的指针的指向不可变

引用不能为NULL ; 指针可以为NULL

指针和引用的自增(++)运算意义不一样

当使用sizeof 来获取大小时:

sizeof(引用名) = **引用指向的变量(或对象)的大小**
sizeof(指针名)= **指针本身的大小**,而非指针指向的变量或对象的大小


说明:

指针本身的大小,仅仅跟机器的字长(32/64/128位)有关

但是当引用作为 对象成员函数参数 时,其占用空间与指针相同

下面的两个条件表达式恒为真

typeid(T) == typeid(T&) 与 sizeof(T) == sizeof(T&)


联系:

引用在语言内部是用指针实现的

对一般应用而言,把引用理解为指针不会犯下严重语义错误

说白了 引用是操作受限制的指针(仅被允许对内容进行读取的操作)


实例讲解:

引用是C++中的概念, 初学者容易把引用和指针混淆一起.

int m;
int &n = m;


上面的程序代码片段的说明:

1. nm 的一个引用(reference), m是被引用物(referent)

2. n 既不是 m 的拷贝, 也不是指向 m 的指针, 其实n就是 m 它自己.

3. n 相当于 m 的别名(绰号), 对 n 进行的任何操作就是对 m 的操作

例如有人名叫王小毛, 他的绰号是"三毛".说"三毛"怎么怎么的,其实就是对王小毛说三道四


引用相关的东西:

使用规则如下

引用被创建的同时必须进行初始化动作(即,被赋予初始值)

比较:

未被 const 修饰的指针 则可以在任何时候进行初始化赋值

被 const 修饰的指针则类同于引用的情形

不能NULL引用,引用必须与合法的存储单元关联

一旦引用被初始化,就不能改变引用的关系

引用的主要功能

是传递函数的参数和返回值.

* C++中, 函数的参数返回值的传递方式有三种值传递,指针传递,引用传递

* 引用传递的性质象指针传递, 而书写方式象值传递. 实际上引用可以做的任何事情指针也都能够做, 为什么还要引用?

回答

1. 用适当的工具做恰如其分的工作. 指针能够毫无约束地操作内存中的任何东西, 尽管指针功能强大,但是非常危险. 就像有一把刀,它可以用来砍树、裁纸、修指甲、理发等等. 谁敢这样用?

2. 如果的确只需要借用一下某个对象的别名, 那么就用引用, 而不要用指针,以免发生意外. 比如说, 某人需要一份证明, 本来在文件上盖上公章的印子就行了, 如果把取公章的钥匙交给他,那么他就获得了不该有的权利.

指针的引用

这是个容易让人头脑混乱的现象

指针的引用 其实跟 指针的指针类似,其用法总结为:

简单的指针(*) 指针本身不变,仅指向的内容可变。

指针的引用(*&) 使指针本身可变;

指针的指针(即多级指针) 同样可以使指针达到 本身可变的目的,但是相比于 指针的引用而言 需要很多判断是否为NULL的语句来保证条件满足
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: