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

  • Post author:
  • Post category:其他



一:const的使用基础和好处

#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++自己的总结,要是有什么不好的,请在下方评论,看到会及时回复,谢谢观看;



版权声明:本文为guonengneng原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。