张银峰的编程课堂

const指针

用const可以限定一个变量为只读,如:

const int ca = 9;
ca = 0;             // 错误:a不可写

也可以让关键字const靠近变量名,更加显示的表明这种语义。

int const ca = 9;

限定指向的对象不可写

同样的,我们也可以使用const修饰指针,保证被指向的对象不可更改。

int a = 3;
const int *pa = &a;
*pa = 4;    // 错误:pa指向的对象不可写

char site[] = "glimix.com";
const char *ps = site;
ps[0] = 'G';   // 错误:ps指向的字符串不可写

同样,关键字const靠近变量明可以表达同样的语义。

int const *pa = &a;
char const *ps = site;

这里,我们使用const修饰的是指针指向的变量,指针自身仍是可写的。

int b = 4;
pa = &b;        // 正确:pa 指向 b
ps = "hello";   // 正确:ps 指向字面量

限定指针自身不可写

如果希望指针自身不可写,那么就用const修饰指针自身!

int* const pa = &a;
char* const ps = site

这样,就能防止指针自身被修改。

pa = &b;        // 错误:
ps = "hello";   // pa、ps 不能指向其它变量

因为const现在限定的是指针变量自身,而非指向的值,所以指向的对象现在仍就可通过指针修改。

#include <stdio.h>

int main()
{
    int a = 3;
    int* const pa = &a;

    char site[] = "glimix.com";
    char* const ps = site;

    *pa = 4;
    *ps = 'G';

    printf("a: %d\n", *pa);
    printf("site: %s\n", ps);

    /*
    int b = 5;
    pa = &b;        // 错误:
    ps = "hello";   // pa、ps 不能指向其它变量
    */
}

限定对象与指针都不可写

当然,我们也可以将const同时应用于指针与指向的对象,由此限定两者都不可写。

const int* const pa = &a;
const char* const ps = site;

此时,下面的代码将是错误的,编译器提示:错误:左值指定 const 对象。

// 指向的对象不可写
*pa = 4;
*ps = 'G';

// 指针自身不可写
int b = 5;
pa = &b;
ps = "hello";

刚开始,你会觉得这有些可怕,不用担心,我们用一张图就可以解决这个烦恼,以下面代码为例。

const int * pa = &v;
int * const pb = &v;
const int * const pc = &v;

现在,我们从*处画一条线,将定义分为左右两部分,由此可以看出

glimix.com

  • const在*号左边,此时const靠近类型,表示指针指向的值不可更改。
  • const在*号右边,此时const靠近变量,表示指针变量自身不可更改。