引用和指针的比较

【转载】引用和指针的比较
2009-09-07 21:47
 
引用和指针的比较

引用是 C++中的概念,刚开始的时候我容易把引用和指针混淆一起。如下程序中,n 是 m 的一
个引用(reference),m 是被引用物(referent)。 
  int m; 
  int &n = m; 
n 相当于 m 的别名(绰号),对 n 的任何操作就是对 m 的操作。例如有人名叫李三,他的绰号是“傻蛋”。说“傻蛋”怎么怎么的,其实就是对李三说三道四。所以 n 既不是 m 的拷贝,也不是指向 m 的指针,其实 n 就是 m 它自己。 

这里重点说一下引用的一些个规则:(自己总结的请大家指教)
  (1)引用被创建的时候,必须被初始化(指针则可以在任何时候被初始化)。 
  (2)不能有 NULL 引用(指针则可以是 NULL),引用必须与存储单元相对应,一个引用对应一个存储单元。就好比你和你女朋友绑在一起,谁也离不开谁。 
  (3)一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象),这个更好说,当你和你的女朋友邦定在一起的时候,你就必须遵循你女朋友的约束嘿嘿。
   这里有个例子,比如说:
    int i = 5; 
    int j = 6; 
    int &k = i; 
    k = j;  // k 和 i 的值都变成了 6;
   这里K被初始化为i的引用,在语句“k = j;”并不能把K修改为j的引用(就像你和你女朋友结婚了,那么法律上只承认你女朋友是你的妻子,你和别的女人搞在了一起,对不起法律不承认)。如果你非要这样绑定,也可以,这样的话,把 k 的值改变成为 6。由于 k 是 i 的引用,所以 i 的值也变成了 6。这样一来你就害了两个人啊 。
上面的程序看起来象在玩文字游戏,没有体现出引用的价值。引用的主要功能是传递函数的参数和返回值。C++语言中,函数的参数和返回值的传递方式有三种:值传递、指针传递和引用传递。 
  以下是“值传递”的示例程序。由于 Func1 函数体内的 x 是外部变量 n 的一份拷贝,
改变 x 的值不会影响 n, 所以 n 的值仍然是 0。 
  void Func1(int x) 
{ 
  x = x + 10; 
} 
int n = 0; 
  Func1(n); 
  cout << “n = ” << n << endl;// n = 0 
   
以下是“指针传递”的示例程序。由于 Func2 函数体内的 x 是指向外部变量 n 的指
针,改变该指针的内容将导致 n 的值改变,所以 n 的值成为 10。 
  void Func2(int *x) 
{ 
  (* x) = (* x) + 10; 
} 
… 
int n = 0; 
  Func2(&n); 
  cout << “n = ” << n << endl;  // n = 10 
 
  以下是“引用传递”的示例程序。由于 Func3 函数体内的 x 是外部变量 n 的引用,x
和 n 是同一个东西,改变 x 等于改变 n,所以 n 的值成为 10。 
  void Func3(int &x) 
{ 
  x = x + 10; 
} 
… 
int n = 0; 
  Func3(n); 
  cout << “n = ” << n << endl;  // n = 10 
 
  对比上述三个示例程序,会发现
“引用传递”的性质象“指针传递”,而书写方式象
“值传递”。
实际上“引用”可以做的任何事情“指针”也都能够做,为什么还要“引用”
这东西? 
答案是“用适当的工具做恰如其分的工作”。 
  指针能够毫无约束地操作内存中的如何东西,尽管指针功能强大,但是非常危险。
就象一把刀,它可以用来砍树、裁纸、修指甲、理发等等,谁敢这样用? 
如果的确只需要借用一下某个对象的“别名”,那么就用“引用”,而不要用“指针”,
以免发生意外。比如说,
某人需要一份证明,本来在文件上盖上公章的印子就行了,如
果把取公章的钥匙交给他,那么他就获得了不该有的权利
。 

引用不是变量,系统并不为引用分配存储空间,它本身没有地址,其地址是原变量的地址

指针变量是变量,系统为其分配存储空间。

引用是变量的别名,可以通过别名直接访问某个变量,而指针变量的值是变量的地址,指针是通过地址间接访问某个变量。

引用必须初始化,而初始化之后不能再做其他变量的别名。

引用的主要用途是做函数的参数和函数的返回值,而引用作为函数的形参,通过引用改变主调函数中的实参,是C++引进引用的主要目的之一。

通过引用传递函数参数,主调函数只能向被调函数传递变量,不能向被调函数传递常量和表达式,因为常量和表达式的地址,编译器无法传递。

标准C中可以使用void的指针去指向任何指针类型,如:

int x;

int *ptr;

void *pt1r=&x;

而在C++中这是不合法的。如果必须这样做,则须强制进行类型转换,即:

ptr=(int *)ptr1;

引用的使用
在C中用指针传递参数地址,但是,指针的使用非常复杂,容易出错。C++采用了引用的概念,它是一种间接的指针。引用可为变量起别名,主要用于参数传递和做函数的返回类型。
1.引用的定义
引用定义的关键字是“type &”,含义是定义一个type类的引用,此引用可与type类对象或变量的地址相联系。如:
int I=5;
int &j=I;
含义是:创建一个整型引用,j是I的别名,它们公用一个内存地址。
说明:
(1) double & rr=1; 等价与 double temp; temp=double(1); double & rr=temp;
(2) int *a; int * & p=a; int b=8; p=&b; //正确,指针变量的引用
void & a=3; //不正确,没有变量或对象的类型是void
int & ri=NULL; //不正确,有空指针,无空引用
(3) int & ra=int; //不正确,不能用类型来初始化
int *p=new int; int & r=*p; //正确
(4) 引用不同于一般变量,下面类型声明是非法的:
int &b[3]; //不能建立引用数组
int & *p; //不能建立指向引用的指针
int &&r; //不能建立引用的引用
(5) 当使用&运算符取一个引用的地址时,其值为所引用变量的地址,
2.引用参数
引用的一个重要应用就是作为函数的参数。在使用引用做参数时不必使用*,并且又没有地址与变量本身的差别,从而简化了程序,
3. 引用和指针使用原则
1.在可以用引用的情况下,不要用指针;
2.引用不允许重新赋值.,当使用一个变量指向不同的对象时,必须用指针;
3.引用不允许为空,当存在对象为空时,必须使用指针。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值