C++中const原理和C语言中const原理区分以及符号表机制研究

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/guonengneng/article/details/88564613
            </div>
                                                <!--一个博主专栏付费入口-->
         
         <!--一个博主专栏付费入口结束-->
        <link href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-4a3473df85.css" rel="stylesheet">
                                    <link href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-4a3473df85.css" rel="stylesheet">
            <div class="htmledit_views" id="content_views">
                                        <h2><a name="t0"></a><strong>一:const的使用基础和好处</strong></h2>

#include<iostream>
using namespace std;
struct student
{
    char name[20];
    int age;
};
//指针所所指向的内存空间的值不能被修改。 
int operateteacher01(const student *t1)
{
    //t1->age=10;
    return 0;    

//指针变量变量本身的值不能别修改,也就是指针不能被修改 
int operateteacher(student *const t1)
{
    //t1->age=10;
    //t1=NULL;
    printf("age:%d",t1->age);
    return 0;
    
}

int main()
{
/*    const int a;
    int const b;//一样 
    const int *c;//const修饰的是指针所指向的内存空间的值,不能被修改 
    int * const d;//const修饰的指针变量所存储的地址,也就是指针不能被改变。d是一个常量指针,指向整型数据。
    const int * const e;//这个意思是指针变量存储的值,也就是地址,
    还有指针变量所指向的内存空间的值都不能被改变。 */
    cout<<"hello"<<endl;
    student t1;
    t1.age=18; 
    operateteacher(&t1);
    system("pause");
    return 0;
    
 } 
 //const好处
 //(1)指针做函数参数,可以有效的提高代码的可读性,减少bug;
 //(2)清楚的分清参数的输出和输入特性
 //注意 const在修改形参的时候,在利用形参不能修改指针欧指向的内存空间; 

 

 

二:C++中和C语言中const的本质区别以及符号表的机制研究

 

 

 

#include<iostream>
using namespace std;
int main()
{
    //在C语言中通过一个指向a的指针就可以改变a的值,
    //但是在C++中仍然不能改变a的值 
    const int a=10;
    int *p=NULL;
    p=(int *)&a;
    *p=20;
    printf("%d\n",a);
    printf("%d",*p);
    return 0; 
 } 
 //1:
//C语言中的const是一个冒牌货,假装不能更改,通过地址仍然是可以更改的 
//C++语言中,const是一个真正的常量;
//2:
//问题原因分析:
/*C++编译器对const常量的处理;
1:当碰见常量声明时,C++不会单独的给它分配内存中,而是将他分配在符号表中
符号表的存在形式是一个名字对,比如key中放a   valude中放10;


2:当你使用这个a的时候,他就从符号表中将这个10拿出来用;


3:当你对这个a变量取地址的时候也就是当需要进行p=(int *)&a操作时候,c++编译器
会为这个a单独的开辟一块内存空间,相当于一个指针p指向这块内存空间。你把这个空间无论改成多少
都将和符号表内的a和10没有半毛线关系,所以打印a的值的时候,就会把这个10打印出来,而不会吧这个
20打印出来


4:利用符号表可以将const修饰的变量变成真正意义上的常量
5:如果你刚才对这个内存空间赋值20,想要证明20的存在,只需打印 *p即可 
 
 
在符号表中放入常量      ->问题: 那又如何解释取地址;
编译过程中若发现使用常量则直接以符号表中的值替换;
编译过程中若发现对const使用了extern或者&操作符,则给对应的常量分配存储空间(兼容C)
?联想:int&a=1(err)&const int *a=10(ok)? */ 
 //总结:
 /*一:C语言中的const变量是只读变量有自己的存储空间;
 二:1:C++中的const是常量
     2:可能分配存储空间,也可能不分配存储空间; 在下面两行情况C++编译器是会给其分配内存空间的; 
        当const变量为全局,并且需要在其他文件中使用;
        当使用&操作符取const常量的地址; 

新学C++自己的总结,要是有什么不好的,请在下方评论,看到会及时回复,谢谢观看;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值