6.3.1 常量指针
我们在定义指针变量时,如果在星号前面加入了“const”关键字,就会将指针修饰为常量指针。例如:
const int *cpi;
或者
int const *cpi;
常量指针所表述的意思是,const 所修饰的不是指针变量,而是指针,就是那个无形的、被我们想象成一个带箭头的长线的东西。那这个常量指针到底有什么作用呢?
所谓常量指针,从名字上解析,就知道它是一个指向常量对象的指针。常量是不允许被修改的,因此常量指针的作用就是,只能通过指针来访问它所指向的对象,而不能通过指针来修改它所指向的对象。例如:
int a = 10; const int *cpi = &a; printf("Result: *cpi = %d\n", *cpi);
代码中,首先定义了一个 int 变量 a,并初始化为 10;然后定义了一个 int 类型指针变量 cpi,并初始化其值为变量 a 的内存地址,由于在指针变量的前面加上了 const 修饰符,因此,指针被修饰为常量指针了,而 cpi 就变成了一个指向常量的指针变量;第三条语句中,通过对变量 cpi 的解引用,即使用常量指针去访问变量 a 的数据,并通过 printf 函数打印到窗口上。
编译运行程序,运行结果如下:
Result: *cpi = 10
可见,使用常量指针访问对象的数据是没问题的。现在再使用常量指针去尝试修改对象数据:
*cpi = 20;
这儿对变量 cpi 进行解引用,并将 20 赋值给它。即使用指针去修改变量 a 的数据,此时,编译程序时就会出错:
error: assignment of read-only location '*cpi'
错误信息的意思是:不能对只读变量赋值。关于只读变量,稍后还会再来剖析一番。通过 const 关键字将指针修饰为一个指向常量对象的指针。因此,这儿将一个常量值 20 赋给指针所指向的对象是不允许的。
由于 const 修饰的是指针,而不是指针变量,因此,对于指针变量本身来说,它是不受 const 限制的,也就是指针变量的值仍是可以被访问或修改的。例如:
int a = 10, b = 20; const int *pci = &a; pci = &b; printf("Result: *pci = %d\n", *pci);
以上语句首先定义了两个 int 类型变量 a 和 b;然后通过 const 修饰,定义了常量指针变量 pci,并将变量 a 的内存地址初始化给 pci;接着,再把变量 b 的内存地址取出赋给变量 pci;最后,通过 printf 打印输出对变量 pci 解引用的结果。
编译运行程序,结果如下:
Result: *pci = 20
从结果可知,对于指针变量 pci 来说,它没有受到 const 的限制,仍然是一个变量,所以把变量 b 的地址赋值给它是没有问题的,而最后打印输出的也正是变量 b 的值。
最后,总结一下常量指针。const 修饰的是指针,而非指针变量,因此,对指针所指向的对象只可访问,不可修改,即不能通过指针去修改对象的数据;而指针变量本身是可访问、可修改的,如图 6.8 所示。
图 6.8 常量指针的访问权限
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论