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