C的关键字——const的理解和用法

转载 2007年09月19日 09:10:00

关于C的关键字——const的理解和用法

    const在C中的用法很灵活(相信C++中也一样),个人感觉对之既爱又恨,有时候感觉const很好用,同时又经

常会因为它的优点而犯错,犯错的原因除了粗心之外,另一个更重要的,就是以前对const理解不到位。于是今天

自己写成一篇小总结。如果是初学者,建议好好看一下,相信帮助比较大;如果是高手,请不吝赐教!

    上面写了一段废话,就算是小序吧:)接下来就是正文;

    一、关于const的具体定义:

       ——个人感觉很难对它下一个标准的定义,因为的用法很灵活,似乎对它定义后总无法让人能够明白它的

意思,而且容易让人产生误解(也许是偶水平太菜了)。例如,把它有定义:一个能够让变量变成无法修改的常量

的关键字。那么,这样的话,就可能让人误解为只要有const在定义变量里面,那变量就无论怎样都无法修改。这

样的理解是很片面的(下面用法方面将对这问题做探讨)。因此,本人在此不敢对它下定义,其他参考书好象也没

有下定义。

    二、关于const的具体作用
        ——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

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

            ——const int * const p = a; //假如前面两种表达式的本质你理解了,这种表达式你来理解根本

                                         //没有问题,const现在有两个,而且一个const的位置是第一种情  

                                         //况的位置,第二个const是第二种情况的位置,所以这表达式的功  

                                         //能就是前两种情况的作用总合。这里不多说!

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

        B。const并不会阻止参数的修改

           之所以把这作为一点来谈,就是因为有一些朋友可能会以为在函数参数中用了const就一定不可以改变

参数,这实际上是错误的理解,因为,它并不阻止参数的修改,下面举个简单的例子来阐述一下;

           #include<stdio.h>
           #include<ctype.h>
          
           void ChangeStr(const char *String);
  
           int main(void)
           {
                    char str[] = "The C programme";

                    Change(str);
                    printf(str);
                    
                    system("Pause");
                    return 0;
            }

            void ChangeStr(const char *String)
            {
                    char *Source = (char *)String;
              
                    while (*Source)
                    {
                               *Source = toupper(*Source);
                               Source++;
                    }
             }

             //end

             上面的程序把字符串中的每个字符都转换成大写字母了。因为*String把地址给了*Source,而

*Source的值的改变编译器并不干涉,可能有的编译器会发出警告之类。上面的程序只是为了说明const并不会阻止

参数的修改,如果象上面程序那样,个人感觉没什么意义,只会让人容易混乱而已。

        关于CONST的用法和理解本人也就只能说这么多了,当然,很可能有更多高级或者少用的用法,由于水平

和经验有限,确实不能再说些什么。

  三、参考文献
      ——《C primer plus 5th》    

 

C的关键字——const的理解和用法

关于C的关键字——const的理解和用法     const在C中的用法很灵活(相信C++中也一样),个人感觉对之既爱又恨,有时候感觉const很好用,同时又经 常会因为它的优点而犯错,犯错的原因...
  • cgbabc
  • cgbabc
  • 2011年11月02日 16:56
  • 84

C++学习笔记:C的继承与超越——const关键字

C语言中也有const关键字,但是它却是一个不地道的常量关键字。 const int MAX = 100; int a[MAX];在C语言编译器下,定义数组的这条语句往往会报错。定义数组大小需要的是常...

c const关键字理解

const关键字 1. const关键字含义 在c语言中,const关键字修饰的变量表示是只读的,不可修改的,所以必须在定义的时候就对它进行初始化,例如: #include const ...

内联函数 —— C 中关键字 inline 用法解析

一、什么是内联函数        在C语言中,如果一些函数被频繁调用,不断地有函数入栈,即函数栈,会造成栈空间或栈内存的大量消耗,为了解决,特别的引入了inline修饰符,表示为内联函数。      ...

内联函数 —— C 中关键字 inline 用法解析

一、什么是内联函数        在C语言中,如果一些函数被频繁调用,不断地有函数入栈,即函数栈,会造成栈空间或栈内存的大量消耗。        为了解决这个问题,特别的引入了inline...

【C++】const关键字用法总结

C++关键字const用法,总结了网络和C++ Primer的一些重要知识点,可能还有一些遗漏欢迎补充。 CONST是C++中常用的类型修饰符,常类型是指使用类型修饰符const说明的类型,常类型的变...

C++中const关键字用法详解及实例和源码下载(一)

最近在学习C++基础部分,看了两天书,已经看过了一遍,半知半解,回过头来重新看第二遍,深入了解一下C++的基础知识。现在读到了const关键字的用法,书上面讲解的时候并没有给出完整的实例,只是理论的讲...

C++关键字const用法详解

C++关键字const用法详解看到const 关键字,很多程序员想到的可能是const 常量,这可有点象踩到陷井上还不知道自己危险了。读读以下文字会使你对c++中的const有一个全面的认识。cons...

const,static关键字用法归纳

众所周知const,和static关键字在c语言与cpp中都扮演重要角色,能熟练掌握它们,将对c语言和cpp 的学习起到很大的帮助作用。 今天我就来把自己掌握的这方面知识,和大家分享一下,可能自己归...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C的关键字——const的理解和用法
举报原因:
原因补充:

(最多只允许输入30个字)