Chinaunix首页 | 论坛 | 博客
  • 博客访问: 157026
  • 博文数量: 31
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 360
  • 用 户 组: 普通用户
  • 注册时间: 2017-02-28 08:37
个人简介

没有绝活,怎能风骚.....

文章分类

全部博文(31)

文章存档

2017年(31)

我的朋友

分类: C/C++

2017-04-19 23:47:58

    const修饰的数据类型是指常类型,常类型的变量或对象的值是不能被更新的。
    const关键字的作用主要有以下几点:
    ①可以定义const变量,具有不可变性。如:
        const int Max = 100;
        int Array[Max];
    ②便于进行类型检查,使编译器对处理内容有更多了解,消除了一些隐患。如:
        void fun(const int i)
        {......}
        编译器就会知道i是一个常量,不允许修改;
    ③可以避免意义模糊的数字出现,同样可以很方便地进行参数的调整和修改;
    ④可以保护被修饰的东西,防止意外的修改,增强程序的健壮性。还是上面的例子,如果在函数体内修改了i,编译器就会报错;如:
        void fun(const int i)
        {
            i = 10;//error!
        
}
    ⑤为函数重载提供了一个参考
        class A
        {
            void fun(int i){......}//一个函数
            void fun(int i) const {......}//一个函数的重载
        };
    ⑥可以节省空间,避免不必要的内存分配。如:
        #define PI 3.14159//常量宏
        const double pi = 3.1415926;//此时并未将pi放入ROM中 
        double i = pi;//此时为pi分配内存,以后不再分配
        double I = PI;//编译期间进行宏替换,分配内存
        double j = pi;//没有内存分配
        double J = PI;//再进行宏替换,又一次分配内存
        const定义变量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而#define定义的常量在内存中有若干个拷贝。
    ⑦提高了效率;编译器通常不为const常量分配内存空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。
    ⑧const修饰普通变量
        const int a = 3;
        a = 5;//不能改值
        组合方式:
        const int a;
        int const a;
        int a const;//错误
        总结:不管const放在数据类型的前还是后,这个变量都是只读变量。
    ⑨const修饰指针变量
        当const修饰指针时,由于const的位置不同,它的修饰对象会有所不同。
        如下面的代码,int *const p中const修饰p的值,所以理解为p的值不可以改变,即p只能指向固定的一个变量地址,但可以通过*p读写这个变量的值。
        int a = 0;
        int b = 10;
        int *const p = &a;//p指向了a的地址,p只能指向a 的地址
        //p = &b;//错误
        //p是一个常量指针,p只能指定固定的一个变量地址,但可以通过*p读写这个变量的值
        *p = 7;
        printf("a = %d\n",a);
        
        再如下代码,int const *p1或者const int *p1两种情况中const修饰*p1,所以理解为*p1的值不可以改变,即不可以给*p1赋值改变p1指向变量的值,但可以通过给p赋值不同的地址改变这个指针指向。
        int a = 0;
        int b = 9;
        const int *p1 = &a; 或int const *p1 = &a; //p1可以指向一个int类型的地址,但不可以用*p的方式修改这个内存的值
        //*p1 = 10;//错误
        printf("%d\n",*p);
        p1 = &b;
        printf("%d\n",*p);

        总结:1.指针变量(p)为只读,指针变量名与const之间没有任何修饰符。
                  2.指针指向的值(*p1)为只读,const修饰(int*)或者修饰(*)。
        除了以上三种组合方式,还有:
        const int const *p;
        int const *const p;
        const int * const p;
        const int const * const p;
        根据前面的总结1和2,可以轻易知道各种组合类型的意义。
阅读(1073) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~