const int *与int *const 的区别

参考自:http://blog.sina.com.cn/s/blog_6af956630100vpv2.html

有道选择题

给出以下定义,下列哪些操作是合法的?
const char *p1 = "hello";
char* const p2 = "world";
A、p1++                      B、p1[2]='w';                     C、p2[2]='l';                    D、p2++

p1指针可以被修改,但p1所指向的位置不能被修改,所以A正确。

vs2012提示B选项表达式必须是可修改的左值,所以B也错误。

p2指针是常量指针,所以D错误。

按说可以以p2[2]='l'的形式修改数据,C应该正确。但是不能忽略了一点,p2所指向的是常量字符串,

常量字符串存储在常量存储区,是不能被修改的,所以C也错误。

若换成

char ch1[]="hello";
char ch2[]="world";
const char *p1 =ch1;
char* const p2 =ch2;

这样的形式,则C也正确。


1const int

使用const修饰的i我们称之为符号常量。即i不能在其他地方被重新赋值了。
const int i与int const i是等价的,即const与int的位置无所谓。
2)const int *p
int i1=30;
int i2=40;
const int *p=&i1;
p=&i2;  //此处,p可以在任何时候重新赋值一个新的内存地址。
i2=80;  //这里能用*p=80来代替吗?答案是不能
printf("%d",*p);  //输出80
分析:p的值是可以被修改的,即它可以重新指向另一个地址。但是不能通过*p来修改i2的值。
首先,const修饰的是整个*p,所以*p是常量,是不能被赋值的。虽然p所指的i2是变量而不是常量;其次,p前并没有用const修饰,所以p是指针变量。能被赋值重新指向另一个内存地址。
3)int * const p
int i1=30;
int i2=40;
int * const p=&i1;
//p=&i2;  错误的。p不能再指向另一个新地址了。
i1=80;  //这里能用*p=80来代替,即可以通过*p修改i1的值。
printf("%d",*p);
分析:
此时p的值不能被赋值修改了,只能永远指向初始化时候的内存地址。相反,可用*p修改i1的值了。
所以:综上所述,
指针p因为有了const的修饰,所以为指针常量,即,指针p不能修改了。
整个*p前面没有const修饰,则*p为变量而不是常量,所以,可改变*p的值。
如果const修饰在*p前则不能改的是*p,而不是指p;
如果const是直接写在p前,则p不能改。
4)补充
const int i1=40;
int *p;
p=&i1;  //提示错误,无法从const int转为int。
----------------------------------------
const int i1=40;
const int *p;
p=&i1;  //两个类型相同,可以这样赋值。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值