《2022年c语言const的用法 .pdf》由会员分享,可在线阅读,更多相关《2022年c语言const的用法 .pdf(9页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、C 语言中的const 一直是 C 语言初学者心中的痛,这是因为const 在不同位置有不同作用,在不同情景有不同角色。这让初学者摸不清头脑。今天,和大家一起研究一下const,让它的每个角色都“深入人心”!= 情景一:最简单的const 用法#include int 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 在搞鬼,因为
2、声明了const 的变量是不能修改的!如果将源代码修改为如下这样,就没有问题了!#include int main() int const a=5; printf(a=%dn,a); return 0; 总结: const 声明的变量必须要进行初始化赋值,如果错过这个机会,以后再想给const 的变量赋值,可就没门了!切记PS:int const 和 const int 是一回事,“颠倒写”都是可以的。以后遇到了别犯晕,呵呵。但是,还是要留个心眼,当const 和指针搀和到一起时,这个“颠倒写”的规律可未必成立。= 情景二:发明const 为了什么?在 const 诞生之前, 开发者一直使用#
3、define VAR 100 来定义一些有特殊用途的类常量,不过名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 9 页 - - - - - - - - - 这样定义是存在一些劣势的。因此 const 应运而生, 之后开发者可以使用const int VAR=100;来定义类常量了。至于为什么 #define 有其劣势,还要读者自己去google 下。 : )= 情景三: const 和指针的配合是噩梦!你能分辨得清这些声明么:const int *A; int const
4、 *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 *A rocrocketwupengchong const_test$ cat test1.c #includ
5、e int main() int num=12; const int *A=# printf(result=%dn,*A); return 0; 编译执行结果为:rocrocketwupengchong const_test$ cc test1.c rocrocketwupengchong const_test$ ./a.out result=12 接下来,我们动动手脚,在代码中加入了(*A)+; 这条语句:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 9 页
6、- - - - - - - - - rocrocketwupengchong const_test$ cat test1.c #include int main() int num=12; const int *A=# (*A)+; printf(result=%dn,*A); return 0; 编译这个c 文件:rocrocketwupengchong const_test$ !cc cc test1.c test1.c: In function main :test1.c:6: error: increment of read- only location *A可以看到,报错了,
7、报错的内容表示”*A ”是只读的,不能修改。我们再修改一下源代码为下面这样:rocrocketwupengchong const_test$ cat test1.c #include int main() int num=12; int tmp=100; const int *A=# A=&tmp; printf(result=%dn,*A); return 0; 编译执行结果为:rocrocketwupengchong const_test$ !cc cc test1.c rocrocketwupengchong const_test$ ./a.out result=100 好了,如
8、果你仔细看了这几个小得不能再小的程序,你自己都可以给出结论了!结论:如果声明了const int *A ,那么 A 值是可以修改的,而*A 是不可以修改的。更通俗的说, A 指针可以随便指向一个整型,但只要被A 盯上了的整型变量在使用*A 引用时就不能修改了。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 9 页 - - - - - - - - - rocrocketwupengchong const_test$ cat test1.c #include int main
9、() int num=12; int tmp=100; const int *A=# A=&tmp; tmp=3; printf(result=%dn,*A); return 0; 编译执行的结果为:rocrocketwupengchong const_test$ !cc cc test1.c rocrocketwupengchong const_test$ ./a.out result=3 结论 2:即使 A 指向了 tmp,我虽然不能修改*A ,但是我仍然是可以用tmp 来修改这个值的,完全不管 *A 的存在。呵呵= 情景五: int *const A rocrocketwupen
10、gchong const_test$ cat test1.c #include int main() int num=12; int *const A=# printf(result=%dn,*A); return 0; 编译执行结果为:rocrocketwupengchong const_test$ !cc cc test1.c rocrocketwupengchong const_test$ ./a.out result=12 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - -
11、第 4 页,共 9 页 - - - - - - - - - 我们稍微修改下源代码:rocrocketwupengchong const_test$ cat test1.c #include int main() int num=12; int tmp=100; int *const A=# A=&tmp; printf(result=%dn,*A); return 0; 编译时报错了:rocrocketwupengchong const_test$ !cc cc test1.c test1.c: In function main :test1.c:7: error: assignmen
12、t of read- only variable Arocrocketwupengchong const_test$ cat test1.c 可见 A 本身的值已经不能再变了。继续修改源代码如下:rocrocketwupengchong const_test$ cat test1.c #include int main() int num=12; int *const A=# (*A)=100; printf(result=%dn,*A); return 0; 编译执行结果为:rocrocketwupengchong const_test$ !cc cc test1.c rocrock
13、etwupengchong const_test$ ./a.out result=100 可以看出, (*A) 是可以改变的。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 9 页 - - - - - - - - - 结论又可以轻易推出了:int *const A; /const 修饰指针 A, A 不可变, A 指向的对象可变= 情景六: const int *const A; / 指针 A 和 A 指向的对象都不可变rocrocketwupengchong const
14、_test$ cat test1.c #include int main() int num=12; int const *const A=# (*A)=100; printf(result=%dn,*A); return 0; 编译会报错:rocrocketwupengchong const_test$ !cc cc test1.c test1.c: In function main :test1.c:6: error: assignment of read- only location *A改下源代码:rocrocketwupengchong const_test$ cat tes
15、t1.c #include int main() int num=12; int tmp=100; int const *const A=# A=&tmp; printf(result=%dn,*A); return 0; 编译仍然会报错:rocrocketwupengchong const_test$ !cc cc test1.c test1.c: In function main :test1.c:7: error: assignment of read- only variable A名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - -
16、 - - - - 名师精心整理 - - - - - - - 第 6 页,共 9 页 - - - - - - - - - 呵呵,结论很明显了,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,这就表明如果我调用了这
17、个函数,那么第一个实参被传到addnum 函数里之后,就不能再做修改了!呵呵就这么简单。给个例子吧,让大家能更一目了然:rocrocketwupengchong const_test$ cat test2.c #include int addto(const int num, int a, int b) if(num=1) return a+b; else return 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; 编译执行
18、结果为:rocrocketwupengchong const_test$ !cc cc test2.c rocrocketwupengchong const_test$ ./a.out res=34 如果我修改一下,编译就会出错:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 9 页 - - - - - - - - - rocrocketwupengchong const_test$ cat test2.c #include int addto(const int num
19、, int a, int b) if(num=1) num=3; return a+b; else return 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$ !cc cc test2.c test2.c: In function addto :test2.c:5: error: assignment of read- only location
20、num可见在函数里形参被声明为const 的变量也是不能修改的哦!呵呵const 其实不难,把本文的几个小例子看懂就OK 了!= 最后附上在北邮人论坛上看到ebirthatsix 对 const 的评论:除了传递要求为const 的参数以外,自己声明对象没有什么必须要加,但是对于一个逻辑上不应该被修改,应该为常量的对象,没有声明为const,就必须由程序员自己来维护,来记住这个变量不应该被修改,即使你不小心修改导致程序整体混乱了,编译器也不会报错另, const 和普通变量的声明存在于头文件时有区别,总之这些都是与你具体写程序的规划有关系, const 这个玩意只是方便程序设计和程序编写,能够使程序更加的清晰,如果说我就是不爱用,就是喜欢一路变量用到底,那也没什么不行。 。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 9 页 - - - - - - - - - OK,over 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 9 页 - - - - - - - - -