c语言 const的用法

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C语言中的const一直是C语言初学者心中的痛,这是因为const在不同位置有不同作用,在不同情景有不同角色。这让初学者摸不清头脑。今天,和大家一起研究一下const,让它的每个角色都“深入人心”!

====================================================================== ========================

情景一:最简单的const用法

#include

int main()

{

int const a;

a=5;

printf("a=%d\n",a);

return 0;

}如果编译这个c文件,就会报错:

1071.c: In function ‘main’:

1071.c:5: error: assignment of read-only variable ‘a’

显而易见,这是const在搞鬼,因为声明了const的变量是不能修改的!

如果将源代码修改为如下这样,就没有问题了!

#include

int main()

{

int const a=5;

printf("a=%d\n",a);

return 0;

}总结:const声明的变量必须要进行初始化赋值,如果错过这个机会,以后再想给const的变量赋值,可就没门了!切记~

PS:int const和const int是一回事,“颠倒写”都是可以的。以后遇到了别犯晕,呵呵。但是,还是要留个心眼,当const和指针搀和到一起时,这个“颠倒写”的规律可未必成立。

====================================================================== ========================

情景二:发明const为了什么?

在const诞生之前,开发者一直使用#define V AR 100来定义一些有特殊用途的类常量,不过

这样定义是存在一些劣势的。因此const应运而生,之后开发者可以使用const int V AR=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 *A

[rocrocket@wupengchong const_test]$ cat test1.c

#include

int main()

{

int num=12;

const int *A=#

printf("result=%d\n",*A);

return 0;

}编译执行结果为:

[rocrocket@wupengchong const_test]$ cc test1.c

[rocrocket@wupengchong const_test]$ ./a.out

result=12

接下来,我们动动手脚,在代码中加入了(*A)++;这条语句:

[rocrocket@wupengchong const_test]$ cat test1.c

#include

int main()

{

int num=12;

const int *A=#

(*A)++;

printf("result=%d\n",*A);

return 0;

}编译这个c文件:

[rocrocket@wupengchong const_test]$ !cc

cc test1.c

test1.c: In function ‘main’:

test1.c:6: error: increment of read-only location ‘*A’

可以看到,报错了,报错的内容表示”*A”是只读的,不能修改。

我们再修改一下源代码为下面这样:

[rocrocket@wupengchong const_test]$ cat test1.c

#include

int main()

{

int num=12;

int tmp=100;

const int *A=#

A=&tmp;

printf("result=%d\n",*A);

return 0;

}编译执行结果为:

[rocrocket@wupengchong const_test]$ !cc

cc test1.c

[rocrocket@wupengchong const_test]$ ./a.out

result=100

好了,如果你仔细看了这几个小得不能再小的程序,你自己都可以给出结论了!

结论:如果声明了const int *A,那么A值是可以修改的,而*A是不可以修改的。更通俗的说,A指针可以随便指向一个整型,但只要被A盯上了的整型变量在使用*A引用时就不能修改了。

相关文档
最新文档