const修饰的变量不能再作为左值,初始化完成后,值不能被修改。
C和C++中const的区别:
-
C语言里const定义的为常变量,编译器把const定义的当作一个变量来编译生成指令的;
-
C++里定义的为常量,若以一个变量初始化const常量,则退化为c语言里的const定义的常变量。如:
int b = 20; const int a = b; //此时,a为常变量
例子:
int main(){
const int a = 10;
int *p = (int*)&a;
*p = 20;
cout << a << *p << *(&a) <<endl; // 10 20 10
return 0;
}
const修饰的是离它最近的类型,三种情况:
const int *p = &a; //指针p的内存地址可以修改,值不能修改
int *const p = &a; //指针p的内存地址不能修改,值可以修改
const int *const p = &a; //指针p的内存地址和值均不能修改
const如果右边没有指针*的话,const不参与类型定义。
const和一级指针的类型转换:
int * <=> const int* //不能转换
const int* <=> int * //可以转换
int ** <=> int *const* //等同于 * <=> const* 不能转换
int *const* <=> int ** //等同于 const* <=> * 可以转换
const与多级指针结合的类型转换,两边必须都有const或者都没有const,否则不能转换。
习题:
选择错误选项
1、
A.
int a =10;
const int *p = &a; //const int * <=> int *,可以转换
int *q = p; //int * <=> const int *,不能转换,A错
B.
int a = 10;
int *const p = &a; //int * <=> int *
int *q = p; //int * <=> int *
C.
int a = 10;
int *const p = &a; //int * <=> int *
int *const q = p; //int * <=> int *
D.
int a = 10;
int *const p = &a; //int * <=> int *
const int *q=p; //const int * <=> int *
2、
A.
int a =10;
int *p = &a; //int * <=> int *
const int **q = &p; //const int ** <=> int **,const修饰二级指针,两边都必须有const,A错误
B.
int a = 10;
int *p = &a; //int* <=> int*
int *const*q = &p; //int *const* <=> int ** == const* <=> *
C.
int a = 10;
int *p = &a; //int * <=> int *
int **const q = &p; //int ** <=> int **
D.
int a = 10;
int *const p = &a; //int * <=>int *
int **q = &p; //int **<=>int *const* == * <=> const* ,不能转换,D错误
E.
int a = 10;
const int *p = &a; //const int * <=> int *
int *const* q= &p; //int *const* <=> const int **,与二级指针结合两边都必须有const
答案:1.A; 2.A、D、E