您的位置:首页 > 编程语言 > C语言/C++

指针与const

2013-12-30 12:52 239 查看
    指针,在C/C++中无疑是个老生常谈的问题,也是个非常复杂的问题,其复杂程度我们可以从《征服C指针》和《C和指针》这两本专门介绍指针的好书中了解。本文主要是对指针与const的用法、联系做个简单介绍,更多深入的内容还是需要参考上述两书。好了,下面转入正题:
    指针,与引用类型一般,都属于复合类型(基于其他类型定义的类型,此处的其他类型不仅仅指内建类型,也指类类型)。指针与引用也有某些相似点:1.都依托于其他类型的对象才具有实际意义(空指针与未明确指向或指向无效数据的指针不能进行操作,此处的实际意义指可以进行操作);2.对两者的某些操作,都可以直接反映到两者所指对象之上。当然,两者是有一点明显区别的,指针是实体,本身具有实际的地址,而引用则不是实体,本身没有实际的地址,所以,我们可以有指向指针的指针,但不能有指向引用的引用。

    我们定义引用时,可以定义const引用,如此我们可以通过const引用获取值而不改变所指对象,同理,我们也可以定义指向常量的指针(pointer to const),让我们得到同样的效果,获取值而不改变所指对象。指向常量的指针可以这样定义:

    const int value = 10;

    const int *pValue = &value;

如前面介绍引用与const的文章描述一般,同样,指向常量的指针不会在乎它指向的对象是不是常量,但常量在意指向它本身的指针是不是指向常量的指针。

    上面提到,由于指针是实体,所以我们可以有指向指针的指针。指向指针的指针,那它必然是一个变量吧,那我们是否就可以像定义其它const变量一般,以const定义指向指针的指针呢?当然可以,我们将其成为常量指针(const pointer),这意味着,它的指向将是不可变更的,而且必须初始化的。我们可以这样定义一个常量指针:

    int value = 10;

    int * const pValue = &10;

如此,pValue将是一个常量指针,它将直到其生命周期结束之前,都不会改变指向。

    有了上述两种与const相关的指针变量,或许,我们将能够定义更特殊的一种指针——指向常量的常量指针,顾名思义,它既不能修改其指向对象的值,也不能修改其指向。我们可以像这样定义:

    const int value = 10;

    const int * const pValue = &value;

如此,我们如果对其或对其指向的对象进行修改,编译器都会给我们报错。

    const与指针的关系,有时候或许看着并不会是太清晰,一些人对于const位置的辨析,经常会混淆。这里,我就介绍一种简单清晰的辨析方法,下面我就以一个例子来进行简单介绍:

    const int * const pValue = &value;

对于上面的表达式,它是一个指向常量的常量指针,对于它的阅读,我们可以这样:从变量名开始,从右至左,首先,我们看到的是一个const,所以我们可以知道,这个变量是一个常量;继续向左,我们可以看到'*'号,由此,我们就可以知道这个变量是一个指针,结合前面的结果,它就是一个常量指针;再继续向左,看到了类型,我们先将它放在一边,我们看到了另一个const,则表明它是指向常量的,结合前面,它就是一个指向常量的常量指针。好像缺少点什么,对吧?最重要的一点,我们应该加上它的类型,才是对它的完整描述,现在我们可以得到:它是一个int型的指向常量的常量指针!这个办法是不是还蛮简单的?

    如上面所述,本文仅仅是一些很简单的介绍,更多深入内容还请参考上文中提到的两本书。本文介绍到此结束,敬请期待下面的文章!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ const 指针