关于const的具体定义

一、关于const的具体定义:

     const是一个C语言的关键字,它限定一个变量不允许被改变。

  

二、关于const的问题:

  问题:const变量 & 常量  

 为什么下面的例子在使用一个const变量来初始化数组,ANSI C的编译器会报告一个错误呢?    

  const int n = 5;  

 int a[n];  

 答案与分析:   

  1)、这个问题讨论的是“常量”与“只读变量”的区别。常量肯定是只读的,例如5, “abc”,等,肯定是只读的,因为常量是被编译器 放在内存中的只读区域,当然也就不能够去修改它。而“只读变量”则是在内存中开辟一个地方来存放它的值,只不过这个值由编译器限定不允许被修改。C语言关键字const就是用来限定一个变量不允许被改变的修饰符(Qualifier)。上述代码中变量n被修饰为只读变量,可惜再怎么修饰也不是常量。而ANSI C规定数组定义时长度必须是“常量”,“只读变量”也是不可以的。

 2)、注意:在ANSI C中,这种写法是错误的,因为数组的大小应该是个常量,而const int n,n只是一个变量(常量 != 不可变的变量,但在标准C++中,这样定义的是一个常量,这种写法是对的),实际上,根据编译过程及内存分配来看,这种用法本来就应该是合理     的,只是 ANSI C对数组的规定限制了它。  

 3)、那么,在ANSI C 语言中用什么来定义常量呢?答案是enum类型和#define宏,这两个都可以用来定义常量。

const变量 & 字符串常量

   char *p = "i'm hungry!";   p[0]= 'I';  

答案与分析:  

 上面的代码可能会造成内存的非法写操作。分析如下, “i'm hungry”实质上是字符串常量,而常量往往被编译器放 在只读的内存区,不可写。p初始指向这个只读的内存区,而p[0] = 'I'则企图去写这个地方,编译器当然不会答应。

const & 指针

  类型声明中const用来修饰一个常量,有如下两种写法,那么,请问,下面分别用const限定不可变的内容是什么?  

 1)、const在前面  

   const int nValue; //nValue是const  

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

const (char *) pContent;//pContent是const,*pContent可变   

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

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

2)、const在后面,与上面的声明对等  

 int const nValue; // nValue是const  

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

 (char *) const pContent;//pContent是const,*pContent可变  

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

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

、关于const的具体作用

    A。const最经常的用法
           1.为了防止传递的函数参数不被修改,在调用函数的形参中用const关键字.
               //Example ->

               int FindNum(const int array[], int num, int conut);//声明函数

               //code...

               int FindNum(const int array[], int num, int count)
               {
                          int i;
                          int flag = 1;

                          for (i = 0; (i < count) && flag; i++)
                          {
                                   if (array[i] == num)
                                   {
                                           flag = 0;
                                           break;
                                   }
                           }
                           return flag;
                }
                //code...
                
           上面这例子中,编译器会把array[]当作常量数据的数组看待。所以,假如你不小心给数组赋值,那么

,编译器就会报错了。因此,当你不需要也不想修改数组的数据时,最好用const把数组定义为常量数组。

           2.const可以用来创建数组常量、指针常量、指向常量的指针等:
             const char ch = 'a';
             const int a[5] = {1, 2, 3, 4, 5};  
             const int *p = a;              //a是一个数组的首地址.p是指向常量的指针
             int * const p = a;             //a是一个数组的首地址.p是指针常量;
             const int * const p = a;    //a是一个数组的首地址。p是指向常量的指针常量

             前两种情况很简单,现在着重分析一下后三种用法,因为这3种情况容易出错,偶就有时候怕用错了

刚脆不用const.

  ——const int *p = a;       

p是指向常量的指针,因此,不可以通过给指针赋值来改变数组中的数据,

例如:
            *p = 10;       /*错误*/
            *(p + 2) = 1;  /*错误*/
  假如指向常量指针可以改变值,那么,就等于也改变了数组的数  据了。假如你不理解,偶倒有一个办法让你理解,你就想你和一  个人绑在一起,有可能你移动了位置而他不跟着你移动吗!哈哈

             ——int * const p = a;      

看这表达式,const的位置和第一个不同吧!他们的用法和作用就完全不一样了。这时候p是指针常量,我们知道,指针是指向了一个数组的首地址,那么,它的位置就不可以改变了。但是你现在应该和第一个表达式比较了,现在的数组并不是常量数组,所以数组的数据是可以改变的,而指针这时候它是不可以移动的,指向数组第一个数据,所以它可以而且只可以改变数组第一个数据的值。这一点请别误解,指针常量只是它的地址不可以改变,并不是它指向的内容一定不可以改变,好啦。假如你又不理解,偶又有一个比较形象的例子来说明:
假如有一个固定的人拉着另外一个人的手,注意,固定的人相当于他是不可以由其他人来替换的。但是他可以拉其他人的手啊,并不一定规定他必须拉同一个人的手啊。现在你应该可以有个比较深的印象和理解吧:
下面举几个例子帮助理解:
         //  *p = 2;          /*可以*/
        //  *(p+1) = 10;     /*可以*/
        //  p++;             /*不可以*/

            ——const int * const p = a; //假如前面两种表达式的本质你理解了,这种表达式你来理解根本没有问题,const现在有两个,而且一个const的位置是第一种情  况的位置,第二个const是第二种情况的位置,所以这表达式的功能就是前两种情况的作用总合。这里不多说!

           //下面举几个例子帮助理解:
          //  *p = 2;             /*不可以*/ 
          //  *(p + 2) = 10;   /*不可以*/
          //  p++;                /*不可以*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值