C++中有关const修饰指针和变量
2015-03-25 22:24
323 查看
const限定符以及const修饰指针生命
1.const关键字并不是c++中特有的关键字,而是c90中新增的标准。const经常被我们用于常量的声明和指针的修饰。当变量被const限定符修饰时,该变量称为常量(如const int a=10),常量就是不能作左值的变量,const修饰的常量存储在数据段,并且只能读取,所以在生命const常量时必须进行初始化,否则编译器会报错(如constint N;//错误,没有初始化)。
2.在C语言中,我们更习惯于使用#define宏定义来为一些反复使用的常数定义标识(如#define PI 3.1415),这样做的好处就是当我们在程序中多处需要使用PI的值时,我们只需要使用宏定义就可以了,对于我们需要修改PI的值时,只需要修改PI后面的数字就可以,const的使用方法与宏定义宏观上很相似(const
double PI=3.14),但本质上的区别是:const定义的常量拥有数据类型,占用内存空间,而#define定义的“常量”仅仅是文本的替换,没有数据类型,也不会在编译时分配内存空间。那么问题来了,既然宏定义编译不占内存,为什么我们还要是用const呢?原因就是:编译器可以对const进行安全检查,而对与宏定义中的替换则不会检查,由此可能会出现无法预计的错误,因此建议C++中需要定义常量时,尽量使用const修饰。
3.当const修饰指针时,一共有两种修饰方法,当const修饰符在指针变量名字前时,该指针称为指针常量,所以该指针是一个常量,一个指针类型的常量,由于常量不能作左值,所以该指针不能指向其它变量,在定义该指针常量时需要进行初始化否则编译会报错。例如:
<span style="font-size:18px;">int a=0; int b=1; int * const p=&a; p++;//错误,指针常量不能作左值 p=&b; //错误,指针常量不能作左值</span>使用const限定符修饰指针变量声明时,还可以将const放在变量声明之前,这样声明的指针称为常量指针。常量指针本身不一定是常量,指针所指的变量也不一定是常量,但是在使用常量指针做间接引用时,却不能作左值使用。例如:
<span style="font-size:18px;">int a=0; const int * p; p=&a;//正确,常量指针本身不是常量,可以作左值 a=1;//正确,a是不是常量 *p=1;//错误,p是常量指针,作间接引用时不能作左值</span>
我们可以把指针常量和常量指针结合起来,例如:
<span style="font-size:18px;">int a=0; const int * const p =&a;</span>
此时的p不能作左值,间接引用时,*p也不能作左值。另外,例如我们下面的声明:
char *p="hello";
声明中的字符串"hello"存放在常数区,其值不能修改,执行下面的语句:
p[0]= 'H';
将引起程序崩溃。如果我们在声明指针p时,加入const限定符,变成如下形式:
const char *p="hello";
使p成为常量指针,这时企图修改字符串"hello"的语句,如:
p[0]= 'H'; //错误,p是常量指针,作间接引用时不能作左值
该语句将成为编译错误。编译时发现错误,总比程序崩溃要好的多。
相关文章推荐
- [C++] C++中const修饰指针,变量, 函数参数和函数返回值的用法总结
- C/C++中关于地址、指针和引用变量的学习笔记(六) : const和void
- java的修饰引用变量的final和C++的const区别真的很大
- 【c/c++笔试题一】const变量通过指针修改问题
- [C/C++] const 详解(修饰变量、输入参数、返回值、成员函数)
- 【C++】const、volatile不能修饰没有this指针的成员函数
- C++中Const 修饰指针就近原则
- c++中 const修饰指针的理解与记忆法
- C++ 学习笔记(2)变量和基本类型(复合类型:引用、指针)、const、constexpr、typedef(using)、auto、decltype
- [c/c++]const修饰指针
- C++中static、const、static const修饰变量作用详解
- C++中const修饰基本数据类型、指针、引用、对象
- C++中const修饰指针探讨
- c++ const修饰指针
- 我的C++学习日记——关于const数值变量,指针和引用的理解
- 理解性记忆const修饰普通变量和指针的新思路
- 常考的开发笔试题 c++里有关指针的内容中,const的位置对指针含义的影响?
- C++ Primer Plus学习笔记之const修饰指针
- c/c++ 自己对const修饰指针的理解
- 关于const 修饰变量、引用、指针的说明