c和c++中的const

  1. c中的const是冒牌货
int main(){
    const int a = 10;
    int *p = NULL;
    p = (int *)&a;
    *p = 20;  //间接赋值
    printf("a:%d \n", a);
    printf("*p:%d \n", *p);
    return 0;
}

分别使用c编辑器和c++的编辑器,运行结果是不一样的
c编辑器运行结果
c++编辑器
问题原因分析:

因为C++编译器对const做了加强,当C++编译器扫描到const常量声明时,它不会像C语言一样为const单独分配内存。

在C++中,int const a = 10;之后,C++编译器会将a放到一个符号表里面,符号表的存在形式:
在这里插入图片描述

我们定义常量a=10,key就是a,value就是10,这个值就是锁死了,不能变的,当使用a的时候,就会从符号表里面把10拿出来。

当对a变量取地址的时候,C++编译器会为a单独的开辟一块内存空间,p = (int *)&a;然后这个内存空间赋给指针p,就是p指向这个内存空间。
在这里插入图片描述


通过 * p 去间接修改的值,是这个新开辟的内存空间的值,而不是符号表中a的值,我们让* p=20、30、100…修改的都是新开辟内存空间中的值。我们可以通过打印* p去验证这两个区域并不是一回事。

  1. const和#define的相同之处
    C++中的const修饰的,是一个真正的常量,而不是C中变量(只读)。在const修饰的常量编译期间,就已经确定下来了。
    int main(){
       	int a = 10;
    	int b = 20;
    	int array[a+b]; //linux内核里面是成立的;原因 编译linux内核的gcc编译器支持.
    					//c和c++编译器 不支持这种语法现象 
    
    	const int c = 10;
    	const int d = 20;
    	int array2[c+d]; 
        return 0;
    }
  1. const和#define的区别
    对比加深
    C++中的const常量类似于宏定义
    const int c = 5; ≈ #define c 5
    C++中的const常量与宏定义不同
    const常量是由编译器处理的,提供类型检查和作用域检查
    宏定义由预处理器处理,单纯的文本替换
void fun1()
{
    #define a 10
    const int b = 20;
}

void fun2()
{
    printf("a = %d\n", a);
  //  printf("b = %d\n", b);
}

int main()
{
    fun1();
    fun2();
    return 0;
}

a可以访问,b不可以访问

  1. const的常量
int main()
{
const int a;
int const b;

const int *c;
int * const d;
const int * const e ;

return 0;
}

含义:
//第一个第二个意思一样 代表一个常整形数
//第三个 c是一个指向常整形数的指针(所指向的内存数据不能被修改,但是本身可以修改)
//第四个 d 常指针(指针变量不能被修改,但是它所指向内存空间可以被修改)
//第五个 e一个指向常整形的常指针(指针和它所指向的内存空间,均不能被修改)
Const好处
//合理的利用const,
//1指针做函数参数,可以有效的提高代码可读性,减少bug;
//2清楚的分清参数的输入和输出特性

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值