c++ 指针与引用的区别介绍及使用说明

 更新时间:2013年01月31日 16:56:14   作者:  
指针与引用看上去完全不同(指针用操作符*和->,引用使用操作符.),但是它们似乎有相同的功能,感兴趣的朋友可以了解下啊,或许本文对你有所帮助,好了,话不多说,切入正题
指针与引用看上去完全不同(指针用操作符“*”和“->”,引用使用操作符“.”),但是它们似乎有相同的功能。指针与引用都是让你间接引用其他对象。你如何决定在什么时候使用指针,在什么时候使用引用呢?

首先,要认识到在任何情况下都不能使用指向空值的引用。一个引用必须总是指向某些对象。因此如果你使用一个变量并让它指向一个对象,但是该变量在某些时候也可能不指向任何对象,这时你应该把变量声明为指针,因为这样你可以赋空值给该变量。相反,如果变量肯定指向一个对象,例如你的设计不允许变量为空,这时你就可以把变量声明为引用。

“但是,请等一下”,你怀疑地问,“这样的代码会产生什么样的后果?”
复制代码 代码如下:

char *pc = 0; // 设置指针为空值
char& rc = *pc; // 让引用指向空值

这是非常有害的,毫无疑问。结果将是不确定的(编译器能产生一些输出,导致任何事情都有可能发生)。应该躲开写出这样代码的人,除非他们同意改正错误。如果你担心这样的代码会出现在你的软件里,那么你最好完全避免使用引用,要不然就去让更优秀的程序员去做。我们以后将忽略一个引用指向空值的可能性。
因为引用肯定会指向一个对象,在C++里,引用应被初始化。
复制代码 代码如下:

string& rs; // 错误,引用必须被初始化
string s("xyzzy");
string& rs = s; // 正确,rs指向s

指针没有这样的限制。
复制代码 代码如下:

string *ps; // 未初始化的指针
// 合法但危险

不存在指向空值的引用这个事实意味着使用引用的代码效率比使用指针的要高。因为在使用引用之前不需要测试它的合法性。
复制代码 代码如下:

void printDouble(const double& rd)
{
cout << rd; // 不需要测试 rd,它肯定指向一个double值
}

相反,指针则应该总是被测试,防止其为空:
复制代码 代码如下:

void printDouble(const double *pd)
{
if (pd) // 检查是否为NULL
{
cout << *pd;
}
}

指针与引用的另一个重要的不同是指针可以被重新赋值以指向另一个不同的对象。但是引用则总是指向在初始化时被指定的对象,以后不能改变。
复制代码 代码如下:

string s1("Nancy");
string s2("Clancy");
string& rs = s1; // rs引用s1
string *ps = &s1; // ps指向s1
rs = s2; // rs仍旧引用s1, 但是s1的值现在是"Clancy"
ps = &s2; // ps现在指向s2;
// s1 没有改变

总的来说,在以下情况下你应该使用指针,一是你考虑到存在不指向任何对象的可能(在这种情况下,你能够设置指针为空),二是你需要能够在不同的时刻指向不同的对象(在这种情况下,你能改变指针的指向)。如果总是指向一个对象并且一旦指向一个对象后就不会改变指向,那么你应该使用引用。

还有一种情况,就是当你重载某个操作符时,你应该使用引用。最普通的例子是操作符[]。这个操作符典型的用法是返回一个目标对象,其能被赋值。
复制代码 代码如下:

vector<int> v(10); // 建立整形向量(vector) ,大小为10;
v[5] = 10; // 这个被赋值的目标对象就是操作符[]返回的值

如果操作符[]返回一个指针,那么后一个语句就得这样写:
复制代码 代码如下:

*v[5] = 10;

但是这样会使得v看上去象是一个向量指针。因此你会选择让操作符返回一个引用。

当你知道你必须指向一个对象并且不想改变其指向时, 或者在重载操作符并为防止不必要的语义误解时,你不应该使用指针。而在除此之外的其他情况下,则应使用指针。

相关文章

  • 一篇文章带你了解C++中的异常

    一篇文章带你了解C++中的异常

    这篇文章主要为大家详细介绍了C++中的异常,使用数据库,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • C++中的最小生成树算法超详细教程

    C++中的最小生成树算法超详细教程

    这篇文章主要介绍了C++中的最小生成树算法超详细教程,最小生成树的最著名的算法有两个, 一个是Prim算法, 另一个当然就是Kruskal算法, 接下来, 我将尽我所能的介绍这两个算法, 也算是对自己学习的一个回顾吧,需要的朋友可以参考下
    2023-08-08
  • 解析C++ 浮点数的格式化输出

    解析C++ 浮点数的格式化输出

    本篇文章是对C++中浮点数的格式化输出进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C语言简明讲解类型转换的使用与作用

    C语言简明讲解类型转换的使用与作用

    类型转换(type cast),是高级语言的一个基本语法。它被实现为一个特殊的运算符,以小括号内加上类型名来表示,接下来让我们一起来详细了解
    2022-04-04
  • c++实现十进制转换成16进制示例

    c++实现十进制转换成16进制示例

    这篇文章主要介绍了c++实现十进制转换成16进制示例,需要的朋友可以参考下
    2014-05-05
  • C语言获取数组长度的几种方法

    C语言获取数组长度的几种方法

    这篇文章主要介绍了C语言获取数组长度的几种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • C++ std::condition_variable 条件变量用法解析

    C++ std::condition_variable 条件变量用法解析

    condition_variable(条件变量)是 C++11 中提供的一种多线程同步机制,它允许一个或多个线程等待另一个线程发出通知,以便能够有效地进行线程同步,这篇文章主要介绍了C++ std::condition_variable 条件变量用法,需要的朋友可以参考下
    2023-09-09
  • C++设计模式之享元模式

    C++设计模式之享元模式

    这篇文章主要介绍了C++设计模式之享元模式,本文讲解了什么是享元模式、享元模式代码实例、享元模式的优点等内容,需要的朋友可以参考下
    2014-10-10
  • C语言中getchar的用法以及实例解析

    C语言中getchar的用法以及实例解析

    getchar()是stdio.h中的库函数,它的作用是从stdin流中读入一个字符,下面这篇文章主要给大家介绍了关于C语言中getchar的用法以及实例的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-03-03
  • C语言之结构体定义 typedef struct 用法详解和用法小结

    C语言之结构体定义 typedef struct 用法详解和用法小结

    这篇文章主要介绍了C语言的结构体定义typedef struct用法详解和用法小结,typedef是类型定义,typedef struct 是为了使用这个结构体方便,感兴趣的同学可以参考阅读
    2023-03-03

最新评论