const与指针、引用

155 阅读2分钟
const与指针类型
定义一个指针*p:
const
int
* p = NULL;
int
const
* p = NULL;
int
*
const
p = NULL;

上面两行定义完全等价,第三行则不同。
下面两行定义也完全等价:
const
int
*
const
p = NULL;
int
const
*
const
p = NULL;

举例说明:
int
x =
3
;
const
int
* p = &x;
//
p=&y; 正确
//
*p=4; 错误

const修饰的是*p,所以通过*p修改x的值是错误的。
int
x =
3
;
int
*
const
p = NULL;
//
p=&y; 错误

const修饰的是p,p只能指向一个地址,不能再改变。
const
int
x =
3
;
const
int
*
const
p = &x;
//
p=&y; *p=4; 都是错误的

上面这种情况,就不能再做任何修改。
const与引用类型
int
x =
3
;
const
int
& y = x;
//
x=10; 正确
//
y=20; 错误

y被const修饰,所以不能通过y去修改x的值。
更多示例:
[url=][/url]

const
int
x =
5
;x =
5
;
//
错误
int
x =
3
;
const
int
y = x;y =
5
;
//
错误
int
x =
3
;
const
int
* y = &x;*y =
5
;
//
错误
[url=]
[/url]


[url=]
[/url]

int
x =
3
, z =
4
;
int
*
const
y = &x;y = &z;
//
错误
const
int
x =
3
;
const
int
& y = x;y =
5
;
//
错误
[url=]
[/url]


const
int
x =
3
;
int
* y = &x;
//
错误
int
x =
3
;
const
int
* y = &x;
//
正确

上面这个示例,前者x是不可变的,而y是可变的,如果我们定义一个可变的指针指向一个不可变的变量,那么这就意味着存在风险,我们可以通过指针去修改x的值,这种情况编译器是不允许存在的,所以错误;对于后者,指针只有读权限,x则有读和写的权限,我们用一个权限小的对象接受一个权限大的对象这是允许的,而用一个权限大的对象接受一个权限小的对象则不允许。