C++中有关const修饰指针和变量

const限定符以及const修饰指针生命

  1.const关键字并不是c++中特有的关键字,而是c90中新增的标准。const经常被我们用于常量的声明和指针的修饰。当变量被const限定符修饰时,该变量称为常量(如const int a=10),常量就是不能作左值的变量,const修饰的常量存储在数据段,并且只能读取,所以在生命const常量时必须进行初始化,否则编译器会报错( const  int N;//错误,没有初始化)

  2.在C语言中,我们更习惯于使用#define宏定义来为一些反复使用的常数定义标识(如#define PI 3.1415),这样做的好处就是当我们在程序中多处需要使用PI的值时,我们只需要使用宏定义就可以了,对于我们需要修改PI的值时,只需要修改PI后面的数字就可以,const的使用方法与宏定义宏观上很相似(const double PI=3.14),但本质上的区别是:const定义的常量拥有数据类型,占用内存空间,而#define定义的“常量”仅仅是文本的替换,没有数据类型,也不会在编译时分配内存空间。那么问题来了,既然宏定义编译不占内存,为什么我们还要是用const呢?原因就是:编译器可以对const进行安全检查,而对与宏定义中的替换则不会检查,由此可能会出现无法预计的错误,因此建议C++中需要定义常量时,尽量使用const修饰。

 3.当const修饰指针时,一共有两种修饰方法,当const修饰符在指针变量名字前时,该指针称为指针常量,所以该指针是一个常量,一个指针类型的常量,由于常量不能作左值,所以该指针不能指向其它变量,在定义该指针常量时需要进行初始化否则编译会报错。例如:

<span style="font-size:18px;">int a=0;
int b=1;
int * const p=&a;
p++;//错误,指针常量不能作左值
p=&b; //错误,指针常量不能作左值</span>
使用const限定符修饰指针变量声明时,还可以将const放在变量声明之前,这样声明的指针称为常量指针。常量指针本身不一定是常量,指针所指的变量也不一定是常量,但是在使用常量指针做间接引用时,却不能作左值使用。例如:
<span style="font-size:18px;">int a=0;
const  int * p;
p=&a;//正确,常量指针本身不是常量,可以作左值
a=1;//正确,a是不是常量
*p=1;//错误,p是常量指针,作间接引用时不能作左值</span>

我们可以把指针常量和常量指针结合起来,例如:

<span style="font-size:18px;">int a=0;
const int * const p =&a;</span>

此时的p不能作左值,间接引用时,*p也不能作左值。另外,例如我们下面的声明:

char *p="hello";

声明中的字符串"hello"存放在常数区,其值不能修改,执行下面的语句:

p[0]= 'H';

将引起程序崩溃。如果我们在声明指针p时,加入const限定符,变成如下形式:

const  char *p="hello";

使p成为常量指针,这时企图修改字符串"hello"的语句,如:

p[0]= 'H'; //错误,p是常量指针,作间接引用时不能作左值

该语句将成为编译错误。编译时发现错误,总比程序崩溃要好的多。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值