const与指针
2015-09-06 23:24
471 查看
const类型的指针可以指向非const类型的对象,但const类型的对象必须由const类型的指针指定:
[cpp] view
plaincopy
// C++ 语言强制要求指向 const 对象的指针也必须具有 const 特性
const double d1 = 3.14;
const double *pd1 = &d1; // ok
//double *pd2 = &d1; // error: invalid conversion from 'const double*' to 'double*' [-fpermissive]
int ival = 10;
int *pi1 = &ival; // ok
const int *pi2 = &ival; // ok,const指针可以指向非const对象
// const类型的指针不能通过指针改变对象的值,只能通过其他方式修改
//*pi2 = 11; // error: assignment of read-only location '* pi2'
ival = 11;
cout << *pi2 << endl; // 11
对于void*类型的指针也是如此:
[cpp] view
plaincopy
const int i = 10;
const void *vp1 = &i; // ok
void *vp2 = &i; // error: invalid conversion from 'const void*' to 'void*' [-fpermissive]
const void *vp3; // ok
int j = 9;
vp3 = &j;
对比:const int *p1 与int *const p2:
[cpp] view
plaincopy
int i = 10;
const int *p1 = &i; // 1:指向const对象的指针
int *const p2 = &i; // 2:const指针
cout << *p1 << endl; // 10
cout << *p2 << endl; // 10
1) 前者const只是限定了p1指针所指向的是const类型的对象,而非指针本身是const类型的,在定义的时候不需要初始化,允许对p1进行重新赋值,让p1重新指向一个const类型的对象,但不能通过p1去修改所指的对象的值,因为编译“自以为”现在所指向的对象是const类型的。但因为编译器没法分辨所指的对象是否为const类型的,所以可以通过变量赋值或者间接地利用非const的指针改变对象的值。
2) p2是const指针,即一经初始化,就会与对象的地址绑定在一起,不能该变,必须在定义的时候进行初始化。类似引用。但可以通过该指针去改变所指对象的值。
[cpp] view
plaincopy
*p2 = 11;
cout << *p2 << endl; // ok,11
*p1 = 11; // error: assignment of read-only location '* p1'
cout << *p1 << endl;
在实际的程序中,指向 const 的指针常用作函数的形参。将形参定义为指向 const 的指针,以此确保传递给函数的实际对象在函数中不因为形参而被修改。
int *const p1 与 const int *const p2:
[cpp] view
plaincopy
int i = 1;
const int j = 2;
const int *p1 = &j;
// error: invalid conversion from 'const int*' to 'int*' [-fpermissive]
// 类型转换错误:p2的类型为const的指针指向int类型,但j是const int类型
//int *const p2 = &j;
int *const p2 = &i; // ok
const int *const p3 = &j; // ok:p3的类型为:const指针指向const int类型对象,j是const int类型的
[cpp] view
plaincopy
// C++ 语言强制要求指向 const 对象的指针也必须具有 const 特性
const double d1 = 3.14;
const double *pd1 = &d1; // ok
//double *pd2 = &d1; // error: invalid conversion from 'const double*' to 'double*' [-fpermissive]
int ival = 10;
int *pi1 = &ival; // ok
const int *pi2 = &ival; // ok,const指针可以指向非const对象
// const类型的指针不能通过指针改变对象的值,只能通过其他方式修改
//*pi2 = 11; // error: assignment of read-only location '* pi2'
ival = 11;
cout << *pi2 << endl; // 11
对于void*类型的指针也是如此:
[cpp] view
plaincopy
const int i = 10;
const void *vp1 = &i; // ok
void *vp2 = &i; // error: invalid conversion from 'const void*' to 'void*' [-fpermissive]
const void *vp3; // ok
int j = 9;
vp3 = &j;
对比:const int *p1 与int *const p2:
[cpp] view
plaincopy
int i = 10;
const int *p1 = &i; // 1:指向const对象的指针
int *const p2 = &i; // 2:const指针
cout << *p1 << endl; // 10
cout << *p2 << endl; // 10
1) 前者const只是限定了p1指针所指向的是const类型的对象,而非指针本身是const类型的,在定义的时候不需要初始化,允许对p1进行重新赋值,让p1重新指向一个const类型的对象,但不能通过p1去修改所指的对象的值,因为编译“自以为”现在所指向的对象是const类型的。但因为编译器没法分辨所指的对象是否为const类型的,所以可以通过变量赋值或者间接地利用非const的指针改变对象的值。
2) p2是const指针,即一经初始化,就会与对象的地址绑定在一起,不能该变,必须在定义的时候进行初始化。类似引用。但可以通过该指针去改变所指对象的值。
[cpp] view
plaincopy
*p2 = 11;
cout << *p2 << endl; // ok,11
*p1 = 11; // error: assignment of read-only location '* p1'
cout << *p1 << endl;
在实际的程序中,指向 const 的指针常用作函数的形参。将形参定义为指向 const 的指针,以此确保传递给函数的实际对象在函数中不因为形参而被修改。
int *const p1 与 const int *const p2:
[cpp] view
plaincopy
int i = 1;
const int j = 2;
const int *p1 = &j;
// error: invalid conversion from 'const int*' to 'int*' [-fpermissive]
// 类型转换错误:p2的类型为const的指针指向int类型,但j是const int类型
//int *const p2 = &j;
int *const p2 = &i; // ok
const int *const p3 = &j; // ok:p3的类型为:const指针指向const int类型对象,j是const int类型的
相关文章推荐
- Java中的HashCode
- Mantis使用__基础
- poj1004 解题报告
- 背景与前景课上练习
- 程序员面试题集锦
- 广播 BroadCastReceiver
- git push时免除输入账号密码
- IOS KVC
- 计算机网络各层协议【转载】
- OC实战: ARC 下使用 Block 实现链式语法
- Shell之-备份系统重要文件
- 扫描系统图片文件和视频文件
- 链接时库的顺序问题
- ArrayList类是一个特殊的数组
- 项目合同管理
- 图片自动播放(用UIScrollView和NSTimer)时定时器的开启和关闭
- IOS 国际化 XCODE6
- HDU 1255 覆盖的面积
- Linux命令备忘实例(6)——排序和基本统计命令
- 对于windows窗口的标题菜单栏的操作——删除/禁用 最小最大话和关闭