const
来源:互联网 发布:淘宝佣金是卖家支付吗 编辑:程序博客网 时间:2024/06/01 18:48
一、定义
const是一个C语言的关键字,它的作用是限定一个变量不允许被改变。使用const在一定程度上可以提高程序的安全性和可靠性。另外,在看别人代码的时候,清晰理解const所起的作用,对理解对方的程序也有一些帮助。另外const在其他编程语言中也有出现,如C++等。
常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值一般是不能被更新的。(当然,我们可以偷梁换柱进行更新:通过指针进行改变)
二、主要作用
1、可以定义const常量,具有不可改变性。
例如: const int num=100;
int const n=100;
num++或者对num进行赋值num=200等操作都是错误的。
2、便于进行类型检查,使编译器对处理内容有更多了解,消除了一些隐患。
例如: void fun(const int i) { .........} .编译器就会知道i是一个常量,不允许修改;
3、可以保护被修饰的东西,防止意外的修改,增强程序的健壮性。 还是上面的例子,如果在函数体内修改了i,编译器就会报错;
例如: void f(const int i)
{ i=10; } //错误
4、 可以节省空间,避免不必要的内存分配。 例如:
#define PI 3.14159 //常量宏
const double Pi=3.14159; //此时并未将Pi放入RAM中 ......
double i=Pi; //此时为Pi分配内存,以后不再分配!
double I=PI; //编译期间进行宏替换,分配内存
double j=Pi; //没有内存分配
double J=PI; //再进行宏替换,又一次分配内存!
const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是像#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而#define定义的常量在内存中有若干份拷贝。
5、提高了效率。
编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。
三、限定内容
例:有如下6句代码,请分析编译器编译的时候那一句是错的?
(1)typedef char * pstr;
(2)char string[4] = "abc";
(3)const char *p1 =" string"; //1式
(4)const pstr p2 =" string"; //2式
(5)p1++;
(6)p2++;
答案:问题出现在第(6)句 p2++
分析:const使用的基本形式: const type m;限定m不可变。替换基本形式中的m为1式中的*p1,替换后const char *p1;限定*p1不可变,当然p1是可变的。替换基本形式中的type为2式中的pstr,替换后const pstr m;限定m不可变,题中的pstr就是一种新类型,因此问题中p2不可变,p2++是错误的。
四、指针举例
1、数据类型对于const是透明的。
以下代码分别用const修饰的不可改变的内容是什么?
(1)const在前面
const int n; //n是const
const char *p; //*p 是const,不可变, p可变
const char* const pContent; //pContent和*pContent都是const,都不可变
(2)const在后面
int const n; //n是const
char const * p; //*p是const,不可变 p可变
char* const p; //p是const,*p可变
char const* const pContent; //pContent和*pContent都是const
因为数据类型对于const是透明的,所以无论const在数据类型前面还是在数据类型后面,修饰的变量结果都是一样的。
2、const出现在哪个变量的左边,则哪个变量不能做左值且const修饰的指针不能解引用
例(1): const int *cp1=&a
int const *cp2=&b
结果:合法 cp1=&a cp2=&b
错误 *cp1=100 *cp2=200
例(2):int *const cp3=&c
结果:合法 *cp3=300
错误 cp3=&c
3、 const int *const cp4=&d
错误:cp4=&d
*cp4=400
4、int const *p1,p2
相当于int const p2
int const *p1。(*p1)是一个整体,p1是可变的。无论是 *const p1,p2还是 const *p1,p2,里面的*都输属于p1 的
5、int const *const p1,p2
p2是const,是前一个const修饰的,*p1也被前一个const修饰,而p1被后一个const修饰。
6、int *const p1,p2
p1是const,(* const p1)是整体,所以const不修饰p2
补充:
在c中,对于const定义的指针,不赋初值编译不报错,
int* const px;这种定义是不允许的。(指针常量定义的时候对其进行初始化)
int const *px;这种定义是允许的。(常指针可以再定义的时候不初始化)
- const
- const
- const
- CONST
- const
- const
- const
- const
- const
- const
- Const
- const
- const
- const
- CONST
- const
- const
- const
- HDU6194 TODO
- 使用mysql的binlog恢复误操作(update|delete)的数据
- 深入分析Docker镜像原理
- 03-VTK基础概念(2)
- android 解析本地txt文本,arrays
- const
- Java基础之ConcurrentHashMapV8
- Java 序列化Serializable详解(附详细例子)
- 安卓开发,点击通知栏进入指定页面及判断App是否启动
- Subversion软件版本管理
- 织梦DEDECMS栏目列表分页链接优化
- Isometric Game 及译法漫谈
- [转]Twitter的分布式自增ID算法snowflake java
- java8-supplier源码