在C/C++中,const与指针之间的不同的位置关系代表着不同的意义。
本文主要对这种关系进行一次梳理,给出两种容易理解和记忆的判别方法。
1. 一种方法是将const之后的内容看做一个整体;
2. 另一种通过从右向左读的方法来进行识记。
将const之后的内容看作一个整体
char * const a;
const和a之间没有
*
,说明a是不可写的,*a
是可写的。
也就是说a是一个常量指针,不可以将a指向其它变量,
但可以改变*a
,即通过指针a改变a所指变量的值。给常量a赋值后,a不能指向其它变量了,但可通过a来改变a所指变量的值。
同时,这也意味着,a在创建时必须同时对其进行初始化赋值。const char *a
同
char const *a
const和a之间有*
,说明*a
是不可写的,但a是可写的。
也就是说这是一个指向常量的指针,不能通过该指针改变它所指变量的值。
但可将该指针指向其它变量。指向常量的指针既可以指向常量,如const char b;也可以指向变量,如char b。
但不能通过该指针该指针改变所指对象的值,即不能给*a
再次赋值。
这里可以这样理解:当指向常量的指针指向一个变量时,编译器会将该变量升级
为常量。但是需要注意的是编译器不能将常量降级为变量,如果我们定义了一个
指向常量的指针,那么当我们把该指针指向一个变量时,编译器就会报错。
从右往左读
char * const a;
变量a -> const ->
*
-> char
变量a是 -> 常量 -> 指针 -> 指向char
常量指针意味着该指针只能指向一个地方,至于所指地方的数据是否会改变
则不关心。常量指针就像一个门牌号,指向一个房间,至于房间里住的是谁
则不关心,你可以把该房间租给A,告诉他门牌号让他住该房间,也可以租给
B,给B门牌号,让B住进来,但是你不能把该门牌号拆了,挂到另一个房间上。const char *a
变量a ->
*
-> char -> const
变量a是 -> 指针 -> 指向char -> char是常量
同char const *a
变量a ->*
-> const -> char
变量a是 -> 指针 -> 指向常量 -> char
a是指向常量的指针,不能通过*a
来改变常量的值,但可将a指向其它地方。
代码例子
#include<iostream>
using namespace std;
int main()
{
char a='a';
char b='b';
char c='c';
const char x='x';
const char y='y';
const char* p1; //正确:指向常量的指针可以指向其他对象,
//在创建时不必初始化
const char* p2 = &a; //正确:指向常量的指针可以指向一个‘变’量
const char* p3 = &x; //正确:指向常量的指针可以指向一个‘常’量
//*p2 = b; *p2 = 'b'; //错误:p2是指向常量的指针,
//不能通过*p2改变所指对象的值
p2 = &b; //正确:p2是一个指针变量,可以指向其他位置
p2 = &x;
//char * const p4; //错误:常量指针在创建时必须同时初始化
char * const p5 = &c; //正确:常量指针可以指向‘变’量
//char * const p6 = &y;//错误:p6是指向变量的常量指针,y是一个常量,
//不能将常量自动转为变量
const char * const p7 = &y; //正确
//p5 = &a; p6 = &a; //错误:常量指针不可以指向其他变量
*p5 = a; //正确:常量指针所指向的内容可以修改
}
总结
char * const a;
常量指针,可通过*a
改变所指变量的值,
不能将a指向其它地址。
创建时须同时初始化。const char * a;
/char const * a;
指向常量的指针,可指向其它地址,
不能通过*a
改变所指常量的值。
创建时不需要初始化。const char * const a;
指向常量的常量指针,不能将其指向其它地址,
不能通过*a
改变所指常量的值。
创建时须同时初始化。