All things are difficult before they are easy. 没有软件的裸机是一具僵尸,没有硬件的软件是一个幽灵。2012,专注于Linux和C语言,关注自动化、性能测试,关注开源社区和开源测试工具、方法,尝试测试团队管理!

说一说C++中引用与指针的区别

上一篇 / 下一篇  2010-10-07 15:53:13 / 个人分类:C/C++

C++中引入了引用这种概念,简单说一下什么是引用吧。
引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。
声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名的一个别名,它本身不是一种数据类型,因此引用本身不占存储单元
引用的声明方法:类型标识符 &引用名=目标变量名;
例:int a; int &ra=a; //定义引用ra,它是变量a的引用,即别名
PS:在C语言中,它除了可以作为按位运算“与”之外,还有更常用的功能——取变量地址;在C/C++中,每个变量都有其相应的地址,通过在变量标识符前加&符号即可获得变量的地址。

引用,一个变量的别名,为什么引入别名呢?原因是我们想定义一个变量,他共享另一个变量的内存空间,使用别名无疑是一个好的选择。变量是什么?是一个内存空间的名字,如果我们给这个内存空间在起另外一个名字,那就是能够共享这个内存了,引用(别名)的由此而来。
指针,指向另一个内存空间的变量,我们可以通过它来索引另一个内存空间的内容,本身有自己的内存空间。
二者区别:
(1)引用访问一个变量是直接访问,而指针是间接访问。
(2)引用是一个变量的别名,本身不单独分配自己的内存空间,而指针有自己的内存空间。
(3)引用在开始时就绑定到了一个内存空间(开始必须赋初值),所以他只能是这个内存空间的名字,而不能改成其他的,当然可以改变这个内存空间的值,例如:
/*
 * RefrenceTest.cpp
 *
 *  Created on: 2010-10-5
 *      Author: master
 *  该程序输出为:3
 *              5
 */
#include <stdio.h>

int main(int argc, char **argv) {
    int i = 3,j = 4;
    int &x = i;/* 成为i的别名  */
        x = j; /*不能否认x仍然引用i,并没有成为j的别名,只是修改了x和j共享的内存空间的值. */
        printf("&x=%d\n",x);
        i = 5;
        printf("&x=%d\n",x);
}


引用和指针
★ 相同点:
1. 都是地址的概念;
    指针指向一块内存,它的内容是所指内存的地址;引用是某块内存的别名。
★ 区别:
1. 指针是一个实体,而引用仅是个别名;
2. 引用使用时无需解引用(*),指针需要解引用;
3. 引用只能在定义时被初始化一次,之后不可变;指针可变;
   引用“从一而终” ^_^
4. 引用没有 const,指针有 const,const 的指针不可变;
5. 引用不能为空,指针可以为空;
6. “sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身(所指向的变量或对象的地址)的大小;
    typeid(T) == typeid(T&) 恒为真,sizeof(T) == sizeof(T&) 恒为真,但是当引用作为成员时,其占用空间与指针相同(没找到标准的规定)。
7. 指针和引用的自增(++)运算意义不一样;
★ 联系
1. 引用在语言内部用指针实现(如何实现?)。
2. 对一般应用而言,把引用理解为指针,不会犯严重语义错误。引用是操作受限了的指针(仅容许取内容操作)。

另外,《More Effective C++ 》中对引用与指针的区别的描述:
http://blog.csdn.net/general1982/archive/2008/12/12/3504787.aspx
对引用的详细介绍:
http://bbs.xiakexing.com/cgi-bin/topic.cgi?forum=22&topic=268
参考资料:http://www.yuanma.org/data/2006/1015/article_1662.htm

TAG: 引用 指针

 

评分:0

我来说两句

smile665

smile665

Stay hungry, stay foolish. 得意之时谨记,一半命运还掌握在上帝手里;失意之时须知,一半命运还掌握在自己手里。

日历

« 2024-03-26  
     12
3456789
10111213141516
17181920212223
24252627282930
31      

数据统计

  • 访问量: 952513
  • 日志数: 220
  • 建立时间: 2008-11-06
  • 更新时间: 2012-10-06

RSS订阅

Open Toolbar