指针和引用的比较

总述

使用引用(reference)和指针(pointer)都可间接访问另一个值,
但它们之间存在两个重要区别:

(1)引用总是指向某个确定对象(事实上,引用就是该对象的别名、外号),定义引用时没有进行初始化会出现编译错误;

(2)赋值行为上存在差异:
  给引用赋值修改的是该引用所关联癿对象的值,而不是使该引用与另一个对象关联。引用一经初始化,就始终指向同一个特定对象(这就是为什么引用必须在定义时初始化的原因)。
  给指针赋值修改的是指针对象本身,也就是使该指针指向另一对象,指针在不同时刻可指向不同的对象(叧要保证类型匹配)。

 

简单的举两个程序段作为例子。

第一个程序段将一个指针赋给另一指针:

 1 #include <iostream>

 2 

 3 using namespace std;

 4 

 5 int main(void)

 6 {

 7     int val = 1204, val2 = 2048;

 8     int *pi = &val, *pi2 = &val2;

 9 

10     pi = pi2;

11 

12     cout << " *pi= " << *pi  << "\n"<<endl;

13     cout << " pi= " << pi << "\n"<<endl;

14     cout << " *pi2= " << *pi2 << "\n" <<endl;

15     cout << " pi2= " << pi2 << "\n" <<endl;

16 

17     return 0;

18 }

赋值结束后,pi 所指向的 val 对象值保持不变,赋值操作修改了 pi 指针的值,使其指向另一个不同的对象。
编译运行后,输出结果如下(本人使用的是cygwin):
指针和引用的比较

 

第二个程序段,使用两个引用赋值(为了作比较,上一段代码保留在其中):

 1 #include <iostream>

 2 

 3 using namespace std;

 4 

 5 int main(void)

 6 {

 7     int val = 1204, val2 = 2048;

 8     int *pi = &val, *pi2 = &val2;

 9 

10     pi = pi2;

11 

12     cout << " *pi= " << *pi  << "\n"<<endl;

13     cout << " pi= " << pi << "\n"<<endl;

14     cout << " *pi2= " << *pi2 << "\n" <<endl;

15     cout << " pi2= " << pi2 << "\n" <<endl;

16 

17     cout << "compare the pointer and reference \n" << endl;

18 

19     int val3 = 3072, val4 = 4096;

20     int &ri = val3, &ri2 = val4;

21     ri = ri2;

22 

23     cout << " ri= " << ri  << "\n"<<endl;

24     cout << " &ri= " << &ri  << "\n"<<endl;

25     cout << " ri2= " << ri2 << "\n" <<endl;

26     cout << " &ri2= " << &ri2 << "\n" <<endl;

27 

28     return 0;

29 

30 }

这个赋值操作修改了 ri 引用的值 val3 对象,而并非引用本身。赋值后,这两个引用还是分别指向原来关联的对象,此时这两个对象的值相等。编译运行后,输出结果如下:
指针和引用的比较

 

(PS:关于“赋值后,这两个引用还是分别指向原来关联的对象”这一点,暂时还没想到怎么通过输出终端显示出来。。。

   囧,等想到办法了在补上来。。。)

你可能感兴趣的:(指针)