您的位置:首页 > 其它

指针和引用的比较

2013-03-18 15:47 330 查看
总述

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

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

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

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

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

#include <iostream>

using namespace std;

int main(void)
{
int val = 1204, val2 = 2048;
int *pi = &val, *pi2 = &val2;

pi = pi2;

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

return 0;
}


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



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

#include <iostream>

using namespace std;

int main(void)
{
int val = 1204, val2 = 2048;
int *pi = &val, *pi2 = &val2;

pi = pi2;

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

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

int val3 = 3072, val4 = 4096;
int &ri = val3, &ri2 = val4;
ri = ri2;

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

return 0;

}


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



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

囧,等想到办法了在补上来。。。)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: