温习C/C++笔记(2)——指针和引用的区别

首先看一段代码以及运行结果,我将结合该段代码讲解指针和引用的两点区别:

//
//  main.cpp
//  testC++02
//
//  Created by fei dou on 12-7-29.
//  Copyright (c) 2012年 vrlab. All rights reserved.
//

#include <iostream>
#include <string>
using namespace std; 

int main (int argc, const char * argv[])
{

    string str1 = "I am a simple string object";
    string str2 = "I am a simple string object too";
    string *sPtr = &str1;
    string &sRef = str1;
    cout << "原始内容:" << endl;
    cout << *sPtr << endl;
    cout << str1 << endl;
    //进行指针赋值之后的结果
    cout << "进行指针赋值之后的结果:" << endl;
    sPtr = &str2;
    cout << *sPtr << endl;
    cout << str1 << endl;
    //进行引用赋值之后的结果
    cout << "进行引用赋值之后的结果:" << endl; 
    sRef = str2;
    cout << sRef << endl;
    cout << str1 << endl;
    return 0;
}


其运行结果如下:



本段程序很简单,不过当你读了代码和输出结果之后可能觉得第三组结果有点怪异,

相信很多人会觉得第三组第二行的输出结果应该是"I am a simple string object",而不是

“I am a simple string object too”。

但是,结果为什么不是我们想象的那样啊?哪里出了问题?(当然了,如果你已经知道原因,就没有必要阅读下面的文字了微笑

问题的原因就在于C++ 中指针和引用的微妙差别,而这的差别主要有两点:


1.引用总是指向某一个对象,定义引用时不进行初始化是错误的。而且其关联对象是不可以改变的,始终与定义初始化的时候一致。

2.赋值行为的差异,给引用赋值的结果是修改该引用所关联的对象的值,而不是将引用与另外一个对象关联。


这里,第二条有点让人迷惑,搞不清楚最后到底是修改了什么。好的,现在结合上面的代码来解释:

sRef = str2;
    cout << sRef << endl;
    cout << str1 << endl;
这里,首先sRef = str2;语句是一个对引用的赋值,sRef是字符串str1的引用。执行赋值操作以后我们发现

cout << str1 << endl;的输出结果变成了str2的内容,而不再是str1本来的内容,这是因为对于引用的赋值

操作修改了str1对象的值,而不是让sRef和str2关联。

最终的结果就是sRef仍然是和str1关联,同时str1的内容被修改为str2。

这就是上面第二天的区别,或许现在你已经有点头绪了,也希望这篇短文章能给你

带来一些帮助。


今天就先写到这里了,如果大家觉得本文有什么不妥之处,欢迎批评指正,望与大家一起进步!


posted @ 2012-07-29 14:03  dancingrain  阅读(221)  评论(0编辑  收藏  举报