C语言中const的用法

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档



提示:以下是本篇文章正文内容,下面案例可供参考

一、const是什么?

const是C语言中保留的一个关键字,用来定义常量,如果一个变量被const修饰,那么它的值就不能被改变。使用符号常量写出的代码更容易维护;一些指针常常是边读边移动,而不是边写边移动;许多编程规范对于函数参数会强制要求只读不写,在这些情况下,都需要借助const实现。

二、const的使用

1.基本使用

  • 举例:

const是constant的缩写,意思是“恒定不变的”,它是定义只读变量的关键字。用const定义只读变量的方法很简单,就在定义变量时前面加const即可,例如:用一个变量来表示班级的最大人数,或者表示缓冲区的大小。为了满足这一要求,可以使用const关键字对变量加以限定:

const int MaxNum = 100;  //班级的最大人数
  • 基本格式:

我们经常将 const 变量称为常量(Constant)。创建常量的格式通常为:

const type name = value;

const 和 type 都是用来修饰变量的,它们的位置可以互换,也就是将 type 放在 const 前面:

type const name = value;

但我们通常采用第一种方式,不采用第二种方式。

  • 实例应用

由于常量一旦被创建后其值就不能再改变,所以常量必须在定义的同时赋值(初始化),后面的任何赋值行为都将引发错误。一如既往,初始化常量可以使用任意形式的表达式,如下所示:

#include <stdio.h>
int getNum(){
    return 100;
}
int main(){
    int n = 90;
    const int MaxNum1 = getNum();  //运行时初始化
    const int MaxNum2 = n;  //运行时初始化
    const int MaxNum3 = 80;  //编译时初始化
    printf("%d, %d, %d\n", MaxNum1, MaxNum2, MaxNum3);
    return 0;
}
结果为:1009080
  • 错误例子

用const修饰的值就不能被修改了,否则会发生错误

const int MaxNum = 100;  //班级的最大人数
MaxNum = 90;  //错误,试图向 const 变量写入数据

2.const和指针

  • 常量指针

常量指针是指针指向的内容是常量,可以有两种书写方式:

const int *m;
int const *m;

注:
a.常量指针说的是不能通过这个指针改变变量的值,但是还是可以通过其他的引用来改变变量的值的。

int a=10;
const int* m=&a;
a=11;

b.常量指针指向的值不能改变,但是这并不是意味着指针本身不能改变,常量指针可以指向其他的地址。

int m=1;
int n=2;
const int* a=&m;
a=&n;
  • 指针常量
    指针常量是指指针本身是个常量,不能在指向其他的地址,书写方式如下:
int *const n;

注:指针常量指向的地址不能改变,但是地址中保存的数值是可以改变的,可以通过其他指向改地址的指针来修改。

int a=5;
int *p=&a;
int* const n=&a;
*p=8;
  • 指向常量的常指针

当然,指针本身和它指向的数据都有可能是只读的,下面的两种写法能够做到这一点:

const int * const p4;
int const * const p5;

const 和指针结合的写法多少有点让初学者摸不着头脑,大家可以这样来记忆:const 离变量名近就是用来修饰指针变量的,离变量名远就是用来修饰指针指向的数据,如果近的和远的都有,那么就同时修饰指针变量以及它指向的数据。

3.const和#define的区别

1)const定义的常量时,带类型, define不带类型。
2)const是在编译、运行的时候起作用:而define是在编译的预处理阶段起作用。
3)define只是简单的替换,没有类型检查。简单的字符串替换会导致边界效应。
4)const常量可以进行调试的, define是不能进行调试的,主要是预编译阶段就已经替换掉了,调试的时候就没它了。
5)const不能重定义,不可以定义两个一样的,而define通过undef取消某个符号的定义,再重新定义。

#include <stdio.h>
#define A 1
#define B (A+3)   //
#define C A/B*3 //  
//const不能重定义,不可以定义两个一样的,而define通过undef取消某个符号的定义,再重新定义 
const double PI=3.14;
//const double PI=3.145;
#define PI2 3.14
#undef PI2 //  取消PI2 的定义
#define PI2 3.145
int main() {
    //
    //分析过程
    //#define 就是一个简单的替换!!!
    //C 其实是  A/A+3*3 = 1/1 + 3 * 3 = 1 + 9 = 10
    //C 其实是  A/(A+3)*3 = 1/(1+3) * 3 = 1/4 *3 = ?
    double d1 = 1.0/4 *3 ; // 0.25 * 3  = 0.75
    printf("\nc=%.2f", C);// 问 c = ? 
    printf("\nd1=%.2f", d1);
    return 0;
}
结果为:c=0.00
       d1=0.75

6)define可以配合#ifdef、ifndef,#enndif来使用,可以让代码更加灵活,比如我们可以通过#define 来启动或者关闭调试信息。

#include <stdio.h>
#define DEBUG
int main() {
#ifdef DEBUG //如果定义过 DEBUF
        printf("ok, 调试信息");
#endif
#ifndef DEBUG //如果没有定义过 DEBUF
        printf("hello, 另外的信息");
#endif
//      printf("%d",n);
        return 0;
}
结果为:ok, 调试信息
  • 30
    点赞
  • 206
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值