美文网首页iOS进阶之路
IOS:const的使用

IOS:const的使用

作者: 康小曹 | 来源:发表于2019-01-18 11:13 被阅读61次

    首先摆出代码:

    int main() {
        @autoreleasepool {
            int a = 10;
            const int *p = &a;
            int const *p2 = &a;
            int * const p3 = &a;
            
            int b = 20;
            *p = 12;
            p = &b;
            
            *p2 = 12;
            p2 = &b;
            
            *p3 = 12;
            p3 = &b;
    
            printf("%d",*p);
            printf("%d",*p2);
            printf("%d",*p3);
        }
    }
    

    问:最后输出结果是?
    答案:


    const

    解释:
    const的用法:修饰的部分不可变,为常量,但是不会改变变量的作用域和生命周期。
    情况1:

    const int *p = &a
    

    此时const修饰的是p,也就是p所指向的内存地址的值!!,所以当尝试使用p改变被const修饰的常量时,编译器报错,只读的变量不可以被再次赋值;
    情况2:

    int const *p = &a;
    

    此时const修饰的仍然是*p,同情况1;
    情况3:

    int *const p = &a;
    

    此时const修饰的是变量p,也就是局部变量p不能被改变,所以当尝试使用*p改变p所指向的内存地址a的值时,是可行的。但是当尝试重新给p赋值,让其指向b的内存地址时,编译器报错。
    情况4:

    int const c = 10;
    const int c = 10;
    

    这中情况同情况一和情况二一样,都是修饰变量c,也就不存在指针那么复杂的情况。

    const和宏
    const编译时确定,如果出错,编译器会报错;
    宏是预编译,只做拷贝操作,不会报错;
    const不能定义函数;
    宏可以定义函数

    相关文章

      网友评论

        本文标题:IOS:const的使用

        本文链接:https://www.haomeiwen.com/subject/alogdqtx.html