情景分析“C语言的const关键字”.doc_第1页
情景分析“C语言的const关键字”.doc_第2页
情景分析“C语言的const关键字”.doc_第3页
情景分析“C语言的const关键字”.doc_第4页
情景分析“C语言的const关键字”.doc_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

情景分析“C语言的const关键字”C语言中的const一直是C语言初学者心中的痛,这是因为const在不同位置有不同作用,在不同情景有不同角色。这让初学者摸不清头脑。今天,和大家一起研究一下const,让它的每个角色都“深入人心”!=情景一:最简单的const用法#includeint main()int const a;a=5;printf(a=%dn,a);return 0;如果编译这个c文件,就会报错:1071.c: In function main:1071.c:5: error: assignment of read-only variable a显而易见,这是const在搞鬼,因为声明了const的变量是不能修改的!如果将源代码修改为如下这样,就没有问题了!#includeint main()int const a=5;printf(a=%dn,a);return 0;总结:const声明的变量必须要进行初始化赋值,如果错过这个机会,以后再想给const的变量赋值,可就没门了!切记PS:int const和const int是一回事,“颠倒写”都是可以的。以后遇到了别犯晕,呵呵。但是,还是要留个心眼,当const和指针搀和到一起时,这个“颠倒写”的规律可未必成立。=情景二:发明const为了什么?在const诞生之前,开发者一直使用#define VAR 100来定义一些有特殊用途的类常量,不过这样定义是存在一些劣势的。因此const应运而生,之后开发者可以使用const int VAR=100;来定义类常量了。至于为什么#define有其劣势,还要读者自己去google下。:)=情景三:const和指针的配合是噩梦!你能分辨得清这些声明么:const int *A;int const *A;int *const A;const int *const A;如果有点犯晕的话,那就先给出它们的讲解,然后继续看后面的情景分析吧。const int *A; /修饰指向的对象,A可变,A指向的对象不可变int const *A; /修饰指向的对象,A可变,A指向的对象不可变int *const A; /修饰指针A, A不可变,A指向的对象可变const int *const A; /指针A和A指向的对象都不可变=情景四:const int *Arocrocketwupengchong const_test$ cat test1.c#includeint main()int num=12;const int *A=#printf(result=%dn,*A);return 0;编译执行结果为:rocrocketwupengchong const_test$ cc test1.crocrocketwupengchong const_test$ ./a.outresult=12接下来,我们动动手脚,在代码中加入了(*A)+;这条语句:rocrocketwupengchong const_test$ cat test1.c#includeint main()int num=12;const int *A=#(*A)+;printf(result=%dn,*A);return 0;编译这个c文件:rocrocketwupengchong const_test$ !cccc test1.ctest1.c: In function main:test1.c:6: error: increment of read-only location *A可以看到,报错了,报错的内容表示”*A”是只读的,不能修改。我们再修改一下源代码为下面这样:rocrocketwupengchong const_test$ cat test1.c#includeint main()int num=12;int tmp=100;const int *A=#A=&tmp;printf(result=%dn,*A);return 0;编译执行结果为:rocrocketwupengchong const_test$ !cccc test1.crocrocketwupengchong const_test$ ./a.outresult=100好了,如果你仔细看了这几个小得不能再小的程序,你自己都可以给出结论了!结论:如果声明了const int *A,那么A值是可以修改的,而*A是不可以修改的。更通俗的说,A指针可以随便指向一个整型,但只要被A盯上了的整型变量在使用*A引用时就不能修改了。rocrocketwupengchong const_test$ cat test1.c#includeint main()int num=12;int tmp=100;const int *A=#A=&tmp;tmp=3;printf(result=%dn,*A);return 0;编译执行的结果为:rocrocketwupengchong const_test$ !cccc test1.crocrocketwupengchong const_test$ ./a.outresult=3结论2:即使A指向了tmp,我虽然不能修改*A,但是我仍然是可以用tmp来修改这个值的,完全不管*A的存在。呵呵=情景五:int *const Arocrocketwupengchong const_test$ cat test1.c#includeint main()int num=12;int *const A=#printf(result=%dn,*A);return 0;编译执行结果为:rocrocketwupengchong const_test$ !cccc test1.crocrocketwupengchong const_test$ ./a.outresult=12我们稍微修改下源代码:rocrocketwupengchong const_test$ cat test1.c#includeint main()int num=12;int tmp=100;int *const A=#A=&tmp;printf(result=%dn,*A);return 0;编译时报错了:rocrocketwupengchong const_test$ !cccc test1.ctest1.c: In function main:test1.c:7: error: assignment of read-only variable Arocrocketwupengchong const_test$ cat test1.c可见A本身的值已经不能再变了。继续修改源代码如下:rocrocketwupengchong const_test$ cat test1.c#includeint main()int num=12;int *const A=#(*A)=100;printf(result=%dn,*A);return 0;编译执行结果为:rocrocketwupengchong const_test$ !cccc test1.crocrocketwupengchong const_test$ ./a.outresult=100可以看出,(*A)是可以改变的。结论又可以轻易推出了:int *const A; /const修饰指针A, A不可变,A指向的对象可变=情景六:const int *const A; /指针A和A指向的对象都不可变rocrocketwupengchong const_test$ cat test1.c#includeint main()int num=12;int const *const A=#(*A)=100;printf(result=%dn,*A);return 0;编译会报错:rocrocketwupengchong const_test$ !cccc test1.ctest1.c: In function main:test1.c:6: error: assignment of read-only location *A改下源代码:rocrocketwupengchong const_test$ cat test1.c#includeint main()int num=12;int tmp=100;int const *const A=#A=&tmp;printf(result=%dn,*A);return 0;编译仍然会报错:rocrocketwupengchong const_test$ !cccc test1.ctest1.c: In function main:test1.c:7: error: assignment of read-only variable A呵呵,结论很明显了,const int *const A; /指针A和A指向的对象都不可变当然const int *const A;和int const *const A=#是等价的!情景七:如果const用在函数形参里呢?是不是又要复杂很多?答案是NO!一点也不复杂。来看看这个函数投:int addnum(const int num, int a, int b);这个函数声明中的第一个形参是const int num,这就表明如果我调用了这个函数,那么第一个实参被传到addnum函数里之后,就不能再做修改了!呵呵 就这么简单。给个例子吧,让大家能更一目了然:rocrocketwupengchong const_test$ cat test2.c#includeint addto(const int num, int a, int b)if(num=1)return a+b;elsereturn 0; int main()int num=100;int a=12,b=22;int res;num=1;res=addto(num,a,b);printf(res=%dn,res);return 0;编译执行结果为:rocrocketwupengchong const_test$ !cccc test2.crocrocketwupengchong const_test$ ./a.outres=34如果我修改一下,编译就会出错:rocrocketwupengchong const_test$ cat test2.c#includeint addto(const int num, int a, int b)if(num=1)num=3;return a+b;elsereturn 0; int main()int num=100;int a=12,b=22;int res;num=1;res=addto(num,a,b);printf(res=%dn,res);return 0;编译报错为:rocrocketwupengchong const_test$ !cccc test2.ctest2.c: In function addto:test2.c:5: error: assignment of read-only location num可见在函数里形参被声明为const的变量也是不能修改的哦!呵呵const其实不难,把本文的几个小例子看懂就OK了!=最后附上在北邮人论坛上看到ebirthats

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论