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

指针与引用看上去完全不同(指针用操作符“*”和“->”,引用使用操作符“.”),但是它们似乎有相同的功能。指针与引用都是让你间接引用其他对象。你如何决定在什么时候使用指针,在什么时候使用引用呢?

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

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


代码如下:

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看上去象是一个向量指针。因此你会选择让操作符返回一个引用。

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

(0)

相关推荐

  • 从汇编看c++中引用与指针的使用分析

    首先是引用情形下的c++源码: 复制代码 代码如下: void add(int a, int b, int&c) {    c = a + b;} int main() {    int a = 1;    int b = 2;    int c = 0;    add(a, b, c); } 下面是main对应的汇编码: 复制代码 代码如下: ; 6    : int main() { push    ebp    mov    ebp, esp    sub    esp, 12      

  • C++ 中指针和引用有什么区别详解

    C++ 中指针和引用有什么区别详解 1.从内存上来讲  系统为指针分寸内存空间,而引用与绑定的对象共享内存空间,系统不为引用变量分配内容空间. 2指针初始化以后可以改变指向的对象,而引用定义的时候必须要初始化,且初始化以后不允许再重新绑定对象. 3.所以引用访问对象是直接访问.指针访问对象是间接访问. 4.如果pa是指针,那么*pa就是引用了. 但是两者在作为形参的时候非常相似,区别是指针拷贝副本,引用不拷贝.程序如下: #include<stdio.h> void pt(int * pta,

  • c++中引用和指针的区别和联系

    C++中的引用和指针 ★ 相同点: 1. 都是地址的概念:指针指向一块内存,它的内容是所指内存的地址:引用是某块内存的别名(java中的引用其实也是别名的意思). ★ 区别: 1. 指针是一个实体,而引用仅是个别名:2. 引用使用时无需解引用(*),指针需要解引用:3. 引用只能在定义时被初始化一次,之后不可变:指针可变: 引用"从一而终" 4. 引用没有 const,指针有 const,const 的指针不可变:5. 引用不能为空,指针可以为空:6. "sizeof 引用&

  • 深入理解c++指针的指针和指针的引用

    展示一下使用指针的指针和指针的引用修改传递给方法的指针,以便更好的使用它.(这里说的指针的指针不是一个二维数组) 为什么需要使用它们 当我们把一个指针做为参数传一个方法时,其实是把指针的复本传递给了方法,也可以说传递指针是指针的值传递. 如果我们在方法内部修改指针会出现问题,在方法里做修改只是修改的指针的copy而不是指针本身,原来的指针还保留着原来 的值.我们用下边的代码说明一下问题: int m_value = 1; void func(int *p) { p = &m_value; } i

  • 关于c++ 智能指针及 循环引用的问题

    c++智能指针介绍 由于 C++ 语言没有自动内存回收机制,程序员每次 new 出来的内存都要手动 delete,比如流程太复杂,最终导致没有 delete,异常导致程序过早退出,没有执行 delete 的情况并不罕见,并造成内存泄露.如此c++引入 智能指针 ,智能指针即是C++ RAII的一种应用,可用于动态资源管理,资源即对象的管理策略. 智能指针在 <memory>标头文件的 std 命名空间中定义. 它们对 RAII 或 获取资源即初始化 编程惯用法至关重要. RAII 的主要原则是

  • c++将引用或者是指针作为函数参数实现实参的运算

    C++增加引用类型, 主要是把它作为函数参数,以扩充函数传递数据的功能,较指针参数来得更加安全直观.将引用作为参数传递的时候,实参初始化形参的时候不分配内存空间,也不调用拷贝构造函数,因此更加能够提高运算的性能.所以我们应该尽可能地使用引用,而非指针,但是应该要注意,因为局部变量具有自己短暂的生命周期,因此不能够返回对一个局部变量的引用. 引用通常是在被定义的时候被初始化,但是当它作为参数的时候,则是在被调用的时候被初始化.这时候对引用所做的改变就是对被引用的变量所做的改变. 引用对变量的访问是

  • java及C++中传值传递、引用传递和指针方式的理解

    java的值传递理解: 代码1: public class Test { /** * @param args */ public static void main(String[] args) { StringBuffer buffer= new StringBuffer("colin"); SChange(buffer); System.out.println( buffer); } public static void SChange (StringBuffer str) { st

  • C/C++中指针和引用之相关问题深入研究

    一.基本知识指针和引用的声明方式:声明指针: char* pc;声明引用: char c = 'A'   char& rc = c; 它们的区别:①从现象上看,指针在运行时可以改变其所指向的值,而引用一旦和某个对象绑定后就不再改变.这句话可以理解为:指针可以被重新赋值以指向另一个不同的对象.但是引用则总是指向在初始化时被指定的对象,以后不能改变,但是指定的对象其内容可以改变. ②从内存分配上看,程序为指针变量分配内存区域,而不为引用分配内存区域,因为引用声明时必须初始化,从而指向一个已经存在的对

  • C++中指针和引用的区别分析

    从概念上讲.指针从本质上讲就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变. 而引用是一个别名,它在逻辑上不是独立的,它的存在具有依附性,所以引用必须在一开始就被初始化,而且其引用的对象在其整个生命周期中是不能被改变的(自始至终只能依附于同一个变量). 在C++中,指针和引用经常用于函数的参数传递,然而,指针传递参数和引用传递参数是有本质上的不同的: 指针传递参数本质上是值传递的方式,它所传递的是一个地址值.值传递过程中,被调

  • 简单谈谈C++ 中指针与引用

    指针和引用形式上很好区别,但是他们似乎有相同的功能,都能够直接引用对象,对其进行直接的操作.但是什么时候使用指针?什么时候使用引用呢?这两者很容易混淆,在此我详细介绍一下指针和引用,力争将最真实的一面展现给大家.如果我喷得不够好,希望嘴下留情.手下留命,还请指点一二:如果感觉还不错,请大家鼓掌. 指向不同类型的指针的区别在于指针类型可以知道编译器解释某个特定地址(指针指向的地址)中的内存内容及大小,而void*指针则只表示一个内存地址,编译器不能通过该指针所指向对象的类型和大小,因此想要通过vo

随机推荐