区分 C++ 指针跟引用
2016-01-18 14:47
281 查看
声明:文章内部使用了其他blog的举例说明,声索权在于blog作者本身,若有需要请在本blog下留言 追加引用链接等.
指针 指向一块内存,它的内容是 所指内存的地址
引用 是 某块内存的别名
被使用时,引用可以直接使用 ; 而指针需要解引用
引用只能在定义时被初始化一次,之后不可变 ; 指针的指向可以改变
引用的指向 “从一而终,不会发生变化”
引用没有const ; 指针有const
被const修饰的指针的指向不可变
引用不能为NULL ; 指针可以为NULL
指针和引用的自增(++)运算意义不一样
当使用sizeof 来获取大小时:
说明:
指针本身的大小,仅仅跟机器的字长(32/64/128位)有关
但是当引用作为 对象成员 或 函数参数 时,其占用空间与指针相同
下面的两个条件表达式恒为真
对一般应用而言,把引用理解为指针不会犯下严重语义错误
上面的程序代码片段的说明:
1. n 是 m 的一个引用(reference), m是被引用物(referent)
2. n 既不是 m 的拷贝, 也不是指向 m 的指针, 其实n就是 m 它自己.
3. n 相当于 m 的别名(绰号), 对 n 进行的任何操作就是对 m 的操作
比较:
未被 const 修饰的指针 则可以在任何时候进行初始化赋值
被 const 修饰的指针则类同于引用的情形
不能有NULL引用,引用必须与合法的存储单元关联
一旦引用被初始化,就不能改变引用的关系
* C++中, 函数的参数和返回值的传递方式有三种值传递,指针传递,引用传递
* 引用传递的性质象指针传递, 而书写方式象值传递. 实际上引用可以做的任何事情指针也都能够做, 为什么还要引用?
回答是
1. 用适当的工具做恰如其分的工作. 指针能够毫无约束地操作内存中的任何东西, 尽管指针功能强大,但是非常危险. 就像有一把刀,它可以用来砍树、裁纸、修指甲、理发等等. 谁敢这样用?
2. 如果的确只需要借用一下某个对象的别名, 那么就用引用, 而不要用指针,以免发生意外. 比如说, 某人需要一份证明, 本来在文件上盖上公章的印子就行了, 如果把取公章的钥匙交给他,那么他就获得了不该有的权利.
指针的引用 其实跟 指针的指针类似,其用法总结为:
简单的指针(*) 指针本身不变,仅指向的内容可变。
指针的引用(*&) 使指针本身可变;
指针的指针(即多级指针) 同样可以使指针达到 本身可变的目的,但是相比于 指针的引用而言 需要很多判断是否为NULL的语句来保证条件满足
总述:
指针跟引用都是地址的概念指针 指向一块内存,它的内容是 所指内存的地址
引用 是 某块内存的别名
区别:
指针是一个实体 ; 而引用仅是一个别名被使用时,引用可以直接使用 ; 而指针需要解引用
引用只能在定义时被初始化一次,之后不可变 ; 指针的指向可以改变
引用的指向 “从一而终,不会发生变化”
引用没有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. n 是 m 的一个引用(reference), m是被引用物(referent)
2. n 既不是 m 的拷贝, 也不是指向 m 的指针, 其实n就是 m 它自己.
3. n 相当于 m 的别名(绰号), 对 n 进行的任何操作就是对 m 的操作
例如有人名叫王小毛, 他的绰号是"三毛".说"三毛"怎么怎么的,其实就是对王小毛说三道四
引用相关的东西:
使用规则如下
引用被创建的同时必须进行初始化动作(即,被赋予初始值)比较:
未被 const 修饰的指针 则可以在任何时候进行初始化赋值
被 const 修饰的指针则类同于引用的情形
不能有NULL引用,引用必须与合法的存储单元关联
一旦引用被初始化,就不能改变引用的关系
引用的主要功能
是传递函数的参数和返回值.* C++中, 函数的参数和返回值的传递方式有三种值传递,指针传递,引用传递
* 引用传递的性质象指针传递, 而书写方式象值传递. 实际上引用可以做的任何事情指针也都能够做, 为什么还要引用?
回答是
1. 用适当的工具做恰如其分的工作. 指针能够毫无约束地操作内存中的任何东西, 尽管指针功能强大,但是非常危险. 就像有一把刀,它可以用来砍树、裁纸、修指甲、理发等等. 谁敢这样用?
2. 如果的确只需要借用一下某个对象的别名, 那么就用引用, 而不要用指针,以免发生意外. 比如说, 某人需要一份证明, 本来在文件上盖上公章的印子就行了, 如果把取公章的钥匙交给他,那么他就获得了不该有的权利.
指针的引用
这是个容易让人头脑混乱的现象指针的引用 其实跟 指针的指针类似,其用法总结为:
简单的指针(*) 指针本身不变,仅指向的内容可变。
指针的引用(*&) 使指针本身可变;
指针的指针(即多级指针) 同样可以使指针达到 本身可变的目的,但是相比于 指针的引用而言 需要很多判断是否为NULL的语句来保证条件满足
相关文章推荐
- C++流程控制中用于跳转的return和goto语句学习教程
- C++ 虚函数表解析
- C 和 C++ 的输入输出总结
- c++11标准:匿名函数(匿名表达式)lambda
- -lstdc++
- OC习题 寻找出卖耶稣的叛徒 利用C语言知识来做
- 高亮测试
- C++【面试题】:类实现万年历(日期计算器),(含构造函数、拷贝构造、运算符重载、析构函数)
- C++中使用指针、引用进行参数传递
- C++:复数类构造函数、拷贝构造、运算符重载、析构函数
- VC++实现获取文件占用空间大小的两种方法(非文件大小)
- C++ 智能指针详解
- VC++ 获取文件属性创建时间、修改时间和访问时间
- C++ 拷贝构造函数 赋值构造函数
- memmove与memcpy区别
- 值得推荐的C/C++框架和库
- C++ overloading contructor
- 深入C++的new
- [积累]C++复习 海大2014硕士生面试题微信系统总结
- C语言 函数理解(以数组做参数)