Const关键字用法总结

const关键字

const 关键字在 C 和 C++ 编程语言中用于定义常量,即那些一旦初始化后其值就不能被修改的变量。

一、const的作用

1、定义变量为常量

const int N = 100;//定义一个常量N
int const N = 100;//同上,定义一个常量N,修饰符const用在类型说明符前后都可以

N = 50;//错误,常量的值不能被修改
const int n;//错误,常量在定义的时候必须初始化

2、修饰常数组

int const a[5] = {1,2,3,4,5};
const int a[5] = {1,2,3,4,5};

3、修饰函数常参数

void print(const char* message) {
    // message 不应该被函数修改
    printf("%s\n", message);
}
//表示传递的参数不可被改变

4、修饰函数返回值

const int getConstValue() {
    return 42;
}
//表示返回值不可被改变

5、修饰指针

如果关键字const出现在星号左边,表示被指物是常量;
如果出现在星号右边,表示指针自身是常量;
如果出现在星号两边,表示被指物和指针两者都是常量。

const int* ptr;
int const* ptr; 
int* const ptr; 
const int* const ptr; 

1.”const int” & “int const”

const放在数据类型(int)前面和数据类型(int)后面是一样的,等价。
即:const int *ptr = int const *ptr

2.简单理解“const int *ptr”, “int * const ptr”,“const int * const ptr”, 的本质含义

在英文里面,”*“ 被念做,pointer to,朗读的顺序是从右到左。所以 

const int *ptr = ptr pointer to const int(指向常量的指针) 

int const *ptr = ptr pointer to const int(指向常量的指针) 
指向常量的指针,是指指针本身并不是常量,而指针所指向的内容是一个常量。因此,指向常量的指针,指针本身可以被修改,但*ptr也就是指针所指向的内容不能被修改。 

int * const ptr = const ptr pointer to int(指向整型的指针常量)
指向整型的指针常量,是指指针本身是常量,而指针所指向的内容不是常量。因此,指向整型的指针常量,指针本身不能被修改,而指针所指向的内容可以被修改。 

const int * const ptr = const ptr pointer to const int(指向常量的指针常量) 
指向常量的指针常量,按照前面所说,是指指针本身是常量且指针所指向的内容也是常量。因此,指向常量的指针常量,指针本身和指针所指向的内容都不能被修改。 

3.例如:

(1)const int* ptr与int const* ptr

const int myConst = 10;
const int* ptr = &myConst;
*ptr = 20; // 错误:不能通过 ptr 修改 myConst 的值
ptr++; // 正确:可以改变 ptr 的指向

(2)int* const ptr

int myConst = 10;
int* const ptr2 = &myConst;
*ptr2 = 20; // 正确:可以通过 ptr2 修改 myConst 的值
ptr2++; // 错误:不能改变 ptr2 的指向

(3)const int* const ptr

const int myConst = 10;
const int* const ptr3 = &myConst;
*ptr3 = 20; // 错误:不能通过 ptr3 修改 myConst 的值
ptr3++; // 错误:不能改变 ptr3 的指向c

二、#define和const的区别

  1. 定义的区别

    • 宏用#define声明,const常量用const+数据类型声明
    • 宏最后没有分号,const常量声明需要用分号表示语句结束
    • 宏不需要用等号赋值,const常量需要用等号赋值
  2. 处理的阶段不同

    • 宏定义在预处理阶段进行文本替换
    • const常量在程序运行时使用
  3. 存储方式不同

    • 宏定义是直接替换,不会分配内存,存储于程序的代码段
    • const常量需要进行内存分配
  4. 是否进行类型检查

    • 宏定义是字符替换,不进行类型检查
    • const常量定义时需要声明数据类型,使用时会进行类型检测
  5. 宏定义可以声明函数

  6. 定义后能否取消

    • 宏定义可以通过#undef来使之前的宏定义失效,取消后可以重新定义
    • const常量定义后将在定义域内永久失效

关于#Define的总结

参考链接:简单理解指针常数与常数指针

  • 11
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值