const关键字

10 篇文章 1 订阅

const关键字

1、const和变量
const int a = 3;

在编译阶段,编译器就知道 a 这个变量是read-only的,不能被修改。

一旦试图修改就会报错

在这里插入图片描述

const 处于类型前还是类型后没有影响

const int a =3;
int const a =3;
//这两个是一样的
2、const和函数参数

如果我们不希望传入函数得参数被修改,可以用const

#include <iostream>
using namespace std;
void funcA(const int a)
{
    a = 16;
}

int main()
{
    int a = 1;
    funcA(a);
    return 0;
}

在这里插入图片描述

我们知道函数传参其实是传过去一个拷贝,所以const更多的会用于引用,指针等,不希望原来的数据被改变

#include <iostream>
using namespace std;
void funcA(const int* ptr)
{
   (*ptr)++;
}
void funcB(const int& ref)
{
    ref++;
}
int main()
{
    int a = 1;
    int* ptr = &a;
    int&ref = a;
    funcA(ptr);
    funcB(ref);
    return 0;
}

在这里插入图片描述

3、const和数组

直接限制了数组的所有元素,不能修改

#include <iostream>
using namespace std;
const int things[]={1,2,3,4,5,6,7,8};
int main()
{
    things[1] = 0;
    return 0;
}

在这里插入图片描述

4、const和结构体

const修饰的结构体的数据成员也是read-only

#include <iostream>
using namespace std;

typedef struct _aStruct{
    int a;
    int b;
}aStruct;

const aStruct someStruct={.a=1, .b=2};

int main()
{
    someStruct.a=12;
    return 0;
}

在这里插入图片描述

5、const和指针

const修饰指针有两种方式,

第一种是修饰指针指向的变量

int a =1;
const int* ptrA = &a;
int const * ptrB = &a;
//ptrA和ptrB不能修改a的值,但是可以改变ptrA和ptrB的指向
#include <iostream>
using namespace std;

int main()
{
    int a =1;
    int b =2;
    const int* ptrA =&a;
    int const * ptrB =&a;
    
    *ptrA = 12;
    *ptrB = 12;
    
    ptrA = &b;
    ptrB = &b;
              
    return 0;
}

编译结果

在这里插入图片描述
在这里插入图片描述

第二种是修饰指针,限定指针的值(也就是指针指向的地址)不能改变

int a =1;
int* const ptrA = &a;
//ptrA永远只能指向a,不能指向别的地方,但是可以修改a的数据
#include <iostream>
using namespace std;

int main()
{
    int a =1;
    int b =2;

    int* const ptrA = &a;

    *ptrA = 12;

    ptrA = &b;

    return 0;
}

在这里插入图片描述在这里插入图片描述

最简单的区分方法就是,经过 * 这个符号做一条垂直线,const在垂直线左边都是修饰变量的值,const在右边都是修饰地址的值。

6、const和#define的区别

•#define 是宏替换,在预编译的时候确定

•const 前面有数据类型,会进行数据类型检查

•#define 执行的宏名,可以通过#undef来取消宏定义,但是const修饰的变量,保存在静态区,会一直存在,所以如果你有多个头文件声明同一个const 变量,肯定会出现重复定义。但是你在两个头文件中,#define 两个名字一样的宏名,并不会有问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值