2.4 const关键字

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值