C++里面的引用和指针


形参和实参结合规则:形参为引用时,形参(引用)接收实参(对象)的地址。

或表述为:形参为引用时,凡遇到形参(引用)的地方,全部用实参(对象)来代替。 

传递引用给函数与传递指针的效果相同。但是可读性比指针传递好(传值方式的调用与可读性,性能却强于传值方式),参数结合符合初始化标准,可使用引用传递从函数返回多个值(指针和引用都可以)。

代码例子:

[cpp]
  1. #include <iostream>   
  2. using namespace std;  
  3.   
  4. void swap(int &a1, int &b1);  
  5. void swap1(int a1, int b1);  
  6. void swap2(int *a1, int *b1);  
  7.   
  8. int main()  
  9. {  
  10.     int a, b;  
  11.   
  12.     a = 1, b = 2;  
  13.     cout << "initial:\n"  << "a=" << a <<" b=" << b << endl;  
  14.   
  15.     swap(a, b);// 传递的是实际值   
  16.     cout << "swap(a, b):\n"  << "a=" << a <<" b=" << b << endl;  
  17.   
  18.     a = 1, b = 2;  
  19.   
  20.     swap1(a, b);  
  21.     cout << "swap1(a, b):\n" << "a=" << a <<" b=" << b << endl;  
  22.   
  23.     a = 1, b = 2;  
  24.   
  25.     swap2(&a, &b);// 传递的是地址值   
  26.     cout << "swap2(&a, &b):\n" << "a=" << a <<" b=" << b << endl;  
  27. }  
  28.   
  29. void swap(int &a1, int &b1)  
  30. {  
  31.     int c;  
  32.     c = a1;  
  33.     a1 = b1;  
  34.     b1 = c;  
  35. }  
  36.   
  37. void swap1(int a1, int b1)  
  38. {  
  39.     int c;  
  40.     c = a1;  
  41.     a1 = b1;  
  42.     b1 = c;  
  43. }  
  44.   
  45. void swap2(int *a1, int *b1)  
  46. {  
  47.     int c;  
  48.     c = *a1;  
  49.     *a1 = *b1;  
  50.     *b1 = c;  
  51. }  
[html]
  1. [root@www.bkjia.com test]# g++ main.cpp -o main  
  2. [root@www.bkjia.com test]# ./main   
  3. initial:  
  4. a=1 b=2  
  5. swap(a, b):  
  6. a=2 b=1  
  7. swap1(a, b):  
  8. a=1 b=2  
  9. swap2(&a, &b):  
  10. a=2 b=1  
  11. [root@www.bkjia.com test]#   

引用和指针的关系:   

指针是个变量,可再赋值;  而引用建立时必须进行初始化并且决不会再关联其它不同的变量。

指针操纵两个实体(指针值、指向的值);引用只能操纵一个实体。

引用在内部用指针实现 ,被看成是指针常量,不能操作自身的地址值,只能访问所指向的实体。

在语言层面,引用的用法和对象一样;在二进制层面,引用一般都是通过指针来实现的,只不过编译器帮我们完成了转换.

实际上“引用”可以做的任何事情“指针”也都能够做,为什么还要“引用”?

答案是“用适当的工具做恰如其分的工作”。

指针能够毫无约束地操作内存中的东西,尽管指针功能强大,但是非常危险。

引用是指针出于安全考虑的替代品。

在以下情况下你应该使用指针:

一是你考虑到存在不指向任何对象的可能(在这种情况下,你能够设置指针为空)

二是你需要能够在不同的时刻指向不同的对象(在这种情况下,你能改变指针的指向)。

如果总是指向一个对象并且一旦指向一个对象后就不会改变指向,那么你应该使用引用。

相关内容