打印
[应用相关]

这两个定义有什么区别呢?

[复制链接]
1141|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jxmzzr|  楼主 | 2014-4-22 10:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ST, NTC, TI, tc
const int *i;
int const *i;
这两个定义有什么区别呢?
沙发
mmuuss586| | 2014-4-22 10:23 | 只看该作者
来源于百度搜索

1)先从const int i说起。
使用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),所以*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;  //两个类型相同,可以这样赋值。

使用特权

评论回复
板凳
soso| | 2014-4-22 10:25 | 只看该作者
const int *i 是指向常量的指针,指针指向一个常量,无需初始化,指针本身可以改变,但是指针指向的值不能改变。
如:
const int x=10;
const int *p1=&x;
p1++;//ok
(*p1)++;//error
const int &i是指向常量的引用,使用时必须初始化,而且初始化后,引用值不可以改变,引用的常量也不能改变。
如:
const int &p2;//error
const int &p2=x;//ok
const int y=20;
p2=y;//error
p2++;//error

使用特权

评论回复
地板
拿起书本| | 2014-4-22 14:44 | 只看该作者
常量成员函数和非常量成员函数的区别
常量成员函数在函数内不可以对成员变量或者参数进行修改操作OK

使用特权

评论回复
5
diweo| | 2014-4-22 15:07 | 只看该作者
这两个好像是没区别的,因为const都在*之前。
如果改成 int * const p,那就有区别了。

使用特权

评论回复
6
huangfeng33| | 2014-4-22 16:19 | 只看该作者
int *const pi与前面的int const *pi会很容易给混淆的。注意:前面一句的const 是写在pi前和*号后的,而不是写在*pi前的。很显然,它是修饰限定pi的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

460

主题

2188

帖子

12

粉丝