const定义常量详解

编程时,我们可能要用到一些不会改变的值(常数),比如π,这时候可以用const将其定义为常量,只需在类型前加上const关键字即可,比如:

const double PI = acos(-1.0);

这就声明了一个叫PI的常量。注意:const变量必须在声明时初始化。

const是constant的英文简写,表示“常数、常量”,用作限定符(qualifier)。

一、为什么要使用const?

聪明如你可能会问:既然是常数,我直接在代码中用这个常数本尊不就完了,比如直接用π的值3.1415926,干嘛要费事地把它定义为一个常量呢?

定义常量有以下几个好处:

1.提高代码的可读性:可以给常量起一个有意义的名字,比如PI或MAX_SIZE,这使得代码更易于理解。

2.增强代码的可维护性:如果代码中多处用到一个常数,当需要更改它的值时(比如要把π由3.14改为3.1415926)就需要修改代码中所有的常数。如果定义为常量,只需要在一个地方修改即可。

聪明如你可能又会问:那我只要定义为变量就可以了,我知道这是个常数,自然不会闲得蛋疼去改变它,有什么必要加个const呢?

不怕一万就怕万一,你今天不会改它,难保哪天天灵盖感受到神明的摩擦祭出昏之一招,使用const可以确保不会意外地修改这个值。

二、特别的指针型常量

涉及到指针的常量比较复杂,有两种用法:

1.指向常量的指针:指针本身不是常量,但这个指针指向的是一个常量。这意味着你不能通过这个指针来修改它所指向的数据。好比你练得一手六脉神剑,手指可以乱指一通,但你即便把它指向故宫,也无法将之推毁,因为这是个保护性建筑,不能被改变。

int x = 5; 
const int *ptr = &x; // ptr是一个指向常量的指针,不能通过*ptr来修改x的值。

注意:此时变量x定不定义为常量上述结论都是一样,都是不能用*ptr来修改x的值。区别在于,如果不定义为常量,可以重新对x赋值以改变其值;而如果定义为常量,则完全不能更改。见下面的代码:

#include<stdio.h>
int main(){
    int x = 9;
    const int *ptr = &x;
    *ptr = 5; //错误:不能过指针改变所指向的变量的值
    x = 10;  //正确:x不是常量,因此可改变

    const int y = 2;
    const int *ptr1 = &y;
    *ptr1 = 7; //错误:不能过指针改变所指向的变量的值
    y = 3; //错误:y是常量,不能改变
    printf("%d %d\n", x, y);
    printf("%d %d\n\n", *ptr, *ptr1);

    ptr = &y; //正确,ptr可指向别的变量
    ptr1 = &x; //正确,ptr可指向别的变量
    printf("%d %d\n", x, y);
    printf("%d %d\n", *ptr, *ptr1);
    return 0;
}

2.常量指针:指针本身是常量。这意味着你不能改变指针本身的值(即它指向的地址),但你可以通过这个指针来修改它所指向的数据(如果数据本身不是常量的话)。这时指针好比是指南针,只能指一个方向。至于所指处是故宫还是农家大院,就看那地界自己怎么布置的了。

(1)指向变量的常量指针

int y = 10; 
int *const ptr2 = &y; // ptr2是一个常量指针,不能改变ptr2本身的值,但可以通过*ptr2来修改y的值。
比如:
*ptr2 = 30; // 这是合法的,因为ptr2指向的值可以被修改

(2)指向常量的常量指针

指针本身是常量,且它指向的值也不能被修改。如:

const int z = 30;  
const int *const ptr3 = &z; // ptr3 是一个指向常量的常量指针

  • 16
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

金创想

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值