管理员
- 积分
- 7791
- 金钱
- 7791
- 注册时间
- 2015-10-15
- 在线时间
- 2858 小时
|
正点原子每日一题列表,请点击这里:正点原子每日一题
这篇文章对const关键字讲解非常详细。。大家一定要仔细阅读。
下面程序段,下面哪个语句是正确的?
- int tmp = 66;
- int *const age = &tmp;
- int newage = 23;
- 第一个语句:*age=newage;
- 第二个语句: age = &newage;
复制代码
答案请回复本帖,如果做错了,或者没有理解好的,请看下面的内容,讲解非常经典,也非常实用。
--------------------------------------------------------------------------------------------------------------------------------------------------
const 是 constant 的缩写,意思是“恒定不变的”!它是定义只读变量的关键字,或者说 const 是定义常变量的关键字。
说 const 定义的是变量,但又相当于常量;说它定义的是常量,但又有变量的属性,所以叫常变量。用 const 定义常变量的方法很简单,就在通常定义变量时前面加 const 即可,如:
const 和变量类型 int 可以互换位置,二者是等价的,即上条语句等价于:
那么用 const 修饰后和未修饰前有什么区别呢?它们不都等于 10 吗?
用 const 定义的变量的值是不允许改变的,即不允许给它重新赋值,即使是赋相同的值也不可以。所以说它定义的是只读变量。这也就意味着必须在定义的时候就给它赋初值。
如果定义的时候未初始化,我们知道,对于未初始化的局部变量,程序在执行的时候会自动把一个很小的负数存放进去。这样后面再给它赋初值的话就是“改变它的值”了,即发生语法错误。
用 const 修饰的变量,无论是全局变量还是局部变量,生存周期都是程序运行的整个过程。全局变量的生存周期为程序运行的整个过程这个是理所当然的。而使用 const 修饰过的局部变量就有了静态特性,它的生存周期也是程序运行的整个过程。我们知道全局变量是静态的,静态的生存周期就是程序运行的整个过程。但是用const修饰过的局部变量只是有了静态特性,并没有说它变成了静态变量。
我们知道,局部变量存储在栈中,静态变量存储在静态存储区中,而经过 const 修饰过的变量存储在内存中的“只读数据段”中。只读数据段中存放着常量和只读变量等不可修改的量。
前面说过,数组的长度不能是变量。虽然 const 定义的是只读变量,就相当于是定义一个常量。但是只读变量也是变量,所以 const 定义的变量仍然不能作为数组的长度。但是需要注意的是,在 C++ 中可以!C++ 扩展了 const 的含义,在 C++ 中用 const 定义的变量也可作为数组的长度。
什么是const?
常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的。(当然,我们可以偷梁换柱进行更新:)
为什么引入const?
const 推出的初始目的,正是为了取代预编译指令,消除它的缺点,同时继承它的优点。
const关键字使用非常的灵活,这一点和php差别很大,php中const用来在类中定义一个常量,而在c中,const因位置不同有不同的作用,因情景不同有不同的角色,使用起来也是非常的灵活。
(1):const用来修饰普通的变量(指针变量除外)的时候,const type name 和 type const name 这两种形式是完全等价的,都表示其是常量,不能进行修改。
- #include <stdio.h>
- int main(){
- const int num =23;
- printf("result=%d\n",num);
- num =31;
- printf("result=%d\n",num); //报错,num是常量,不能修改
- }
复制代码
(2):const用来修饰指针变量的时候,分为以下四种情况
1、const type *name :这种情况下,const修饰的指针变量name所指向的type类型对象,也就是说指向的这个对象是不能进行修改的,因为其是常量,而指针变量确实可以进行修改的
- #include <stdio.h>
- int main(){
- int tmp = 23;
- const int *num = &tmp;
- printf("result=%d\n",*num);
- (*num) = 24; //报错,因为指针num指向的int类型的对象是不能进行修改的
- printf("result=%d\n",*num);
- }
复制代码
2、 type const *name :这种情况下,const修饰的指针变量name所指向的type类型对象,意思完全同上,只是颠倒了以下顺序。
- #include <stdio.h>
- int main(){
- int tmp = 23;
- int const* num = &tmp;
- printf("result=%d\n",*num);
- (*num) = 24; //报错,因为指针num指向的int类型的对象是不能进行修改的
- printf("result=%d\n",*num);
- }
复制代码
3、type * const name :这种情况下,const修饰的指针变量name,也就是说这个指针变量的值是不能进行修改的,但是指针变量所指向的对象确实可以修改的
- #include <stdio.h>
- int main(){
- int tmp = 100;
- int *const num = &tmp;
- printf("result=%d\n",*num);
- int change = 23;
- num = &change; //报错,因为指针num是不能进行修改的
- printf("result=%d\n",*num);
- }
复制代码
4、const type * const name :这种情况下,const修饰的指针变量name以及指针变量name所指向的对象,也就是说这个指针变量以及这个指针变量所指向的对象都是不能进行修改的
(3):const在函数中的参数的作用:
- void get_value( const int num ){
- num=23; //报错
- }
复制代码
调用get_value()函数的时候,传递num参数到函数,因为定义了const,所以在函数中num是不能进行修改的
|
|