C++常量指针和指针常量

C++ 常量指针和指针常量

常量指针(const pointer)和指针常量(pointer to const)是两个很容易弄混淆的概念,这两个中文翻译并不好,还是用英文表示比较好。

1. C++ 常量

常量,顾名思义就是恒定不变的量,是相对变量而言的,常量在程序运行过程中不会改变。C和C++中使用const关键字修饰常量,在声明和定义时,const放在类型名之前,需要注意的是常量在定义的时候必须初始化

常量就是const类型的对象,创建之后该对象的内容不能再改变,所以定义的时候必须初始化。 可以在编译的时候初始化,也可以在运行的时候初始化。

const int a = 3; //编译时初始化
a = 4; // 错误,常量初始化后不能再改变
const int b; // 错误,定义时必须初始化
const char c = 'A';
const int cnt = get_count(); //运行时初始化

2. 指向常量的指针(pointer to const)

指向常量的指针,是说该指针指向常量,不能通过指针改变指向对象的内容,而且必须在定义指针的类型前加上const限定,普通类型的指针不可以指向常量,如下。

const int a = 3;
const double pi = 3.1415926;
const int *iptr1 = &a; // 正确
const double *dptr1 = π //正确
int *iptr2 = &a; //错误,iptr2是个普通指针,不能指向常量
double *dptr2 = π //错误,dptr2是个普通指针,不能指向常量
const int b = 5;
const double length = 1.85;
iptr1 = &b; //正确,iptr1可以指向其他同类型的const对象
dptr1 = &length;  //正确

普通类型的指针不能指向常量,如第5和第6行,会报错invalid conversion from ‘const double*’ to ‘double*’,必须在指针类型前加上const告诉编译器,这个指针是指向const对象的,后续不会通过指针改变const对象的值。

pointer to const只是说明该指针指向了一个const对象,不能通过该指针改变所指向对象的值,并不意味着该指针不可以指向其他同类型的const对象,如上述第9和第10行代码。

指向常量的指针同样可以指向非const的对象,但是不能通过该指针改变指向对象的值,如下弟6行代码,编译时会报错error: assignment of read-only location ‘* ptr’,可以看出ptr指向的对象是只读的,不能为其赋值。

int main() {
    const int a = 3;
    int b = 5;
    const int *ptr = &a;
    ptr = &b;
    *ptr = 8; //error
    return 0;
}

由以上可以看出如果指针要指向const对象,必须用const限定类型的指针,普通指针不可以。而反过来,用const限定类型的指针,可以指向对应的const对象,也可以指向非const对象,但是因为有const在类型前限定,均不能通过该指针改变所指向对象的值,对指向的对象是只读的。

3. 常量指针(const pointer)

指针本身就是对象,有对应的内存实体,可以把指针作为常量,常量不能改变值。如果指针是常量,它的值不能改变,意味着它从始至终只能指向一个对象,不能再指向其他对象,如果所指向的对象是非const的,可以通过该指针改变指向对象的值。

const pointer,常量指针,我之前一直把它叫指针常量,因为int型指针是说指针指向int类型的对象,double指针是说指针指向double类型的对象,顾名思义,常量指针就成了指针指向常量了,就成了pointer to const了,很容易弄混淆。所以还是不翻译为中文的好,直接叫pointer to constconst pointer比较好。

const pointer,const是用来限定指针的,而不是用来限定指针所指向的类型的,const关键字放在指针变量名之前,而不是类型名之前,如下所示。

int a = 3, b = 4;
int *const ptr = &a;
int *const ptr2; //错误,未初始化
ptr = &b; //错误,常量不可以改变
*ptr = 5; //正确

第3行和第4行分别报错:error: uninitialized const ‘ptr2’error: assignment of read-only variable ‘ptr’,因为ptr2是常量,定义时需要初始化,未初始化报错,ptr是常量,创建之后其值不能再改变,即ptr只能指向变量a,不能再指向其他int变量。虽然ptr是个常量,但是可以通过ptr改变它所指向对象的值,如第5行所示。

4.const pointer to const

pointer to const, const pointer,那么把二者结合起来呢,const pointer to const又是什么呢?就是一个const pointer 指向了const对象,为了避免歧义,还是不翻译为中文的好。

const int a = 3;
int b = 4;
const int *const ptr1 = &a;
const int *const ptr2 = &b;
ptr1 = &b; // 错误
*ptr2 = 5; // 错误
int *const ptr3 = &b;
*ptr3 = 5; // 正确

如上代码中ptr1 和ptr2 都是指向const对象的const pointer,即指向常量对象的常量指针。ptr1和ptr2都是常量,所以必须初始化,而且不能改变它的值重新指向其他对象,所以第5行错误。因为ptr1和ptr2都是指向const对象,不能通过它们改变所指向对象的值,所以第6行错误。

转载于:https://www.cnblogs.com/zero-py/p/7862231.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值