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;
现在,我们从*处画一条线,将定义分为左右两部分,由此可以看出

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