const常量

const对象定义常量,一旦创建后其值不得改变,所以const对象必须初始化。

const int a = 512;     //初始化const对象
a = 1024;              //错误,试图为const对象赋值


在默认情况下,const对象被设定为仅在文件内有效。当多个文件中出现了同名的const变量,其实等同于在不同文件中分别定义了独立的变量。


1、const引用

const int ci = 1024;
const int &r1 = ci;   //正确,引用也为常量
r1 = 42;              //错误,r1是常量,也是对常量的引用,不可以改变其值
int &r2 = ci;         //错误,ci是常量,不可让非常量引用指向一个常量对象。否则就可以通过改变引用的值来改变引用对象的值。
int ai=42;
const int &r3 = ai;   //正确,允许将常量引用绑定到一个普通的int对象上





2、常量指针,指向常量的指针

这是一个指针(主语),该指针指向常量(定语),即该指针指向的对象不能修改。换句话说,这个指针本身存了一个地址,这个地址可以改变,但是这个地址所指向的变量是不能改变的。另外要注意,这里的意思是不能通过这个指针来修改指向的对象,因为这是一个常量指针。之所以叫常量指针,就是限制了通过这个指针来修改对象的值。但是我们可以通过其他途径修改被指对象的值。所以,这里被指对象不一定是常量。虽然常量指针指向的对象是一个常量,这个对象不可以更改,但是这个指针本身却是一个变量,所以我们可以让它指向别的常量。所以常量指针可以不被赋初始值,而且可以重新赋值。见如下例子。

const int a = 3;    //这是常量,值不能改变;
int *b = &a;        //错误,不能用非常量指针指向常量 ,同理引用
const int *p1 = &a; //指向常量的指针
*p1 = 42;           //错误,不能改变常量指针所指向的对象值
int c = 5;          //普通变量
const int *p2 = c;  //正确,常量指针所指对象可以不是常量
*p2 = 6;            //错误,不能改变常量指针所指向的对象值
c = 6;              //正确
p1=&c;              //正确,常量指针可以重新赋值



3、指针常量

这是一个常量(主语),这个常量是一个指针(定语),因此这个指针常量一旦创建,就不能被修改,所以创建的时候必须要赋初值。也就是说,这个指针本身所存的地址是一个常量,不能更改,但是这个地址所指向的变量,是可以改变的。把*放在const前面,const紧靠指针名,用以说明该指针是个常量。而常量指针,const放在了*前面,用以说明这个指针所指对象是个常量不能改变其值。

int a = 0, b=1;
int *const p1 = &a;   //p1将一直指向a,不能再指向其他变量
a =10;        
*p1 = 20;             //可以,我们改变的是p1指向的对象的值,p1仍然指向的是a


4、指向常量的指针常量

这个指针本身是一个常量,同时指向的对象也是一个常量,也就是说,这个指针,不管指向的对象,还是指针本身所存储的地址,都不可以改变。



以下是从别的博客上看来的例子,我觉得比较形象的说明了这几个变量的区别。

char *a = "abcde1234";
const char *b = "bcde";    //b是指向常量字符串的指针变量
char *const c = &a;        //c是指向字符指针变量的常量
const char *const d = &b;  //d是指向字符常量的指针常量


问题来了。

1)问:因为a是变量,a可以赋值为其它值,如"12345abc"。那么c指向a,当a变化了,c指向什么呢?

答:仍然指向"abcde1234"。虽然a可以指向别的字符串,可是c仍然指向"abcde1234",也就是a开始指向的对象。

2)问:a是变量,可以改变a的内容。那么当执行了“a[0] = 'x';”后,c会怎样呢?

答:c当然还指向a初始指向的字符。不过,这个字符已经变成了'x'。

//这里有个疑问没想通,就是问题2里,给a[0]赋值,a的地址没有改变,只是新的值覆盖了旧值。问题1里重新给a赋值,a的地址就改变了,为什么不是在原地址上的数值覆盖呢?

3)问:b是指向常量的指针变量,当b指向别的字符串,d怎么样?

答:d仍然指向b初始的字符串。

4)问:b可以变化,b指向的字符不能变化,也就是说b[0]不能被重新赋值,可是b[1]可以被重新赋值吗?

答:原则上b指向的字符是常量,并没有限制下一个字符,应该可以被赋值。可是因为你使用字符串进行了初始赋值,而且编译器是静态编译的,C/C++程序就把b当作字符串指针来处理了,因此,当对下一个字符进行赋值时,编译不能通过。




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值