const

来源:互联网 发布:淘宝佣金是卖家支付吗 编辑:程序博客网 时间:2024/06/01 18:48

一、定义

    const是一个C语言的关键字,它的作用是限定一个变量不允许被改变。使用const在一定程度上可以提高程序的安全性和可靠性。另外,在看别人代码的时候,清晰理解const所起的作用,对理解对方的程序也有一些帮助。另外const在其他编程语言中也有出现,如C++等。

    常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值一般是不能被更新的。(当然,我们可以偷梁换柱进行更新:通过指针进行改变)

二、主要作用 

1、可以定义const常量,具有不可改变性。

      例如: const int num=100;

               int const n=100; 

               num++或者对num进行赋值num=200等操作都是错误的。

2、便于进行类型检查,使编译器对处理内容有更多了解,消除了一些隐患。

      例如: void fun(const int i) { .........} .编译器就会知道i是一个常量,不允许修改;

3、可以保护被修饰的东西,防止意外的修改,增强程序的健壮性。 还是上面的例子,如果在函数体内修改了i,编译器就会报错;

      例如: void f(const int i)

              { i=10; } //错误

4、 可以节省空间,避免不必要的内存分配。 例如:

       #define PI 3.14159 //常量宏

       const double Pi=3.14159; //此时并未将Pi放入RAM中 ......

       double i=Pi; //此时为Pi分配内存,以后不再分配!

       double I=PI; //编译期间进行宏替换,分配内存

       double j=Pi; //没有内存分配

       double J=PI; //再进行宏替换,又一次分配内存!

       const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是像#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而#define定义的常量在内存中有若干份拷贝。

5、提高了效率。

     编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。

三、限定内容

例:有如下6句代码,请分析编译器编译的时候那一句是错的?

      (1)typedef char * pstr;

      (2)char string[4] = "abc";

      (3)const char *p1 =" string"; //1式

      (4)const pstr p2 =" string"; //2式

      (5)p1++;

      (6)p2++;

 答案:问题出现在第(6)句 p2++

 分析:const使用的基本形式: const type m;限定m不可变。替换基本形式中的m为1式中的*p1,替换后const char *p1;限定*p1不可变,当然p1是可变的。替换基本形式中的type为2式中的pstr,替换后const pstr m;限定m不可变,题中的pstr就是一种新类型,因此问题中p2不可变,p2++是错误的。

四、指针举例

   1、数据类型对于const是透明的。

        以下代码分别用const修饰的不可改变的内容是什么?

    (1)const在前面

         const int n; //n是const

         const char *p; //*p 是const,不可变, p可变

         const char* const pContent; //pContent和*pContent都是const,都不可变

    (2)const在后面

         int const n; //n是const

         char const * p; //*p是const,不可变 p可变

         char* const p; //p是const,*p可变

         char const* const pContent; //pContent和*pContent都是const

       因为数据类型对于const是透明的,所以无论const在数据类型前面还是在数据类型后面,修饰的变量结果都是一样的。

   2、const出现在哪个变量的左边,则哪个变量不能做左值且const修饰的指针不能解引用

       例(1): const int *cp1=&a          

                    int const *cp2=&b

          结果:合法   cp1=&a     cp2=&b

                    错误    *cp1=100    *cp2=200

        例(2):int   *const cp3=&c

          结果:合法  *cp3=300

                     错误   cp3=&c

   3、 const int *const  cp4=&d

     错误:cp4=&d

                *cp4=400

    4、int  const *p1,p2

       相当于int  const  p2

                  int  const  *p1。(*p1)是一个整体,p1是可变的。无论是  *const p1,p2还是 const *p1,p2,里面的*都输属于p1 的    

   5、int const *const p1,p2

         p2是const,是前一个const修饰的,*p1也被前一个const修饰,而p1被后一个const修饰。

   6、int *const p1,p2

        p1是const,(* const p1)是整体,所以const不修饰p2  

补充:

     在c中,对于const定义的指针,不赋初值编译不报错,

     int* const px;这种定义是不允许的。(指针常量定义的时候对其进行初始化)

     int const *px;这种定义是允许的。(常指针可以再定义的时候不初始化)

   

       

      

        




原创粉丝点击