const关键字

12 篇文章 0 订阅
前言

const 是 constant 的缩写,意为“恒定不变的”!它是定义只读变量的关键字,或者说 const 是定义常变量的关键字。

const修饰变量

当const修饰一个变量时,如果说 const 定义的是变量,但是又相当于常量;如果说它定义的是常量,但它同时又有变量的属性,所以叫常变量。

用 const 定义常变量的方法很简单,在定义变量时前面加 const 即可,如:

const int a = 10;

const 和变量类型 int 可以互换位置,二者是等价的,即上条语句等价于:

int const a = 10;

那么用 const 修饰后和未修饰前有什么区别呢?它们不都等于 10 吗?

用 const 定义的变量的值是不允许改变的,即不允许给它重新赋值,即使是赋相同的值也不可以,所以说它定义的是只读变量,这也就意味着必须在定义的时候就给它赋初值。

对于未初始化的局部变量,如果定义的时候未初始化,程序在执行的时候会自动把一个很小的负数存放进去,这样后面再给它赋初值的话就是 “改变它的值” 了,会发生语法错误。

用 const 修饰的变量,无论是全局变量还是局部变量,生存周期都是程序运行的整个过程。
毋庸置疑,全局变量是静态的,静态的生存周期就是程序运行的整个过程,而使用 const 修饰过的局部变量有了静态特性以后,它的生存周期也是程序运行的整个过程。

注:用const修饰过的局部变量的生存周期虽然变长了,但它只是有了静态特性,并没有变成静态变量。

局部变量存储在栈中,静态变量存储在静态存储区中,而经过 const 修饰过的变量存储在内存中的“只读数据段”中。只读数据段中存放着常量和只读变量等不可修改的量。

虽然 const 修饰之后的变量是只读变量,相当于一个常量,但只读变量也是变量,所以 在C语言中,const 定义的变量仍然不能作为数组的长度。但在 C++ 中可以!C++ 11扩展了 const 的含义,在 C++ 中用 const 定义的变量也可作为数组的长度。

const修饰指针

1、常量指针(int * const p):
指针是一个对象,而引用不是,引用是所指对象的别名。

  • 指针的用法可以像其他对象类型一样,允许把指针本身定义为一个常量。
  • 常量指针必须初始化,一旦初始化完成,它的值(也就是它所放在指针中的地址)就不能改变,如果没有初始化,会报错
  • 它解引用的值可以随着它所指向地址中 值的变化 而变化。

2、指向常量的指针(int const *p和 const int *p)

  • 两者的作用是一样的,都是一个指向常量的指针。
  • 可以不用先初始化,即指针没有指向任何内容。
  • 指针指向的内容是一个常量(即地址),可以改变常量(地址)中的值来改变指针解引用的值。但是不能直接解引用指针来改变值,因为这里的指针是一个常量。
int main()
{
    int i = 10;
    const int * p = &i;
    *p = 20;//不能直接解引用指针来改变值
    i = 20;
    printf(" p = %d \n",*p);
    return 0;
}

  • 也可以将另外一个常量赋值给指针,来改变指针所指向内容的值。
int main()
{
    int i = 10;
    int j = 20;
    const int * p = &i;
    p = &j;
    j = 30;
    printf(" p = %d \n",*p);
    return 0;
}

3、指向常量对象的常量指针(const int * const p)

  • 指针的用法可以像其他对象类型一样,允许把指针本身定义为一个常量。
  • 必须初始化,一旦初始化完成,它的值(也就是它所放在指针中的地址)就不能改变,如果没有初始化,会报错
    不可以将另外一个常量赋值给指针,来改变指针所指向内容的值。
void main()
{
	const int i = 10;
    int j = 20;
    const int * const p = &i;
    p = &j;//不能将另外一个常量赋值给常量指针
    
    const int k = 20;
    const int * const p = &k;
    k = 30;//变量k是常量,不能赋值
    printf(" p = %d \n",*p);
}

下面是它们的比较:

类型int* const pconst int *pint const *pconst int * const p
指针的指向不变可变可变不变
指针指向地址的值可变可变可变不变
const VS define

在学习 const 的时候容易混淆 const 和define 。从功能上说它们确实很像,但它们又有明显的不同:

  • define是预编译指令,而const是普通变量的定义。define定义的宏是在预处理阶段展开的,而const定义的只读变量是在编译运行阶段使用的。
  • const定义的是变量,而define定义的是常量。define定义的宏在编译后就不存在了,它不占用内存,因为它不是变量,系统只会给变量分配内存。但const定义的常变量本质上仍然是一个变量,具有变量的基本属性,有类型、占用存储单元。可以说,常变量是有名字的不变量,而常量是没有名字的。有名字就便于在程序中被引用,所以从使用的角度看,除了不能作为数组的长度,用const定义的常变量具有宏的优点,而且使用更方便。所以编程时在使用const和define都可以的情况下,尽量使用常变量来取代宏。
  • const定义的是变量,而宏定义的是常量,所以const定义的对象有数据类型,而宏定义的对象没有数据类型。所以编译器可以对前者进行类型安全检查,而对后者只是机械地进行字符替换,没有类型安全检查。这样就很容易出问题,即“边界问题”或者说是“括号问题”。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值