//C++中 const 的表现
struct Teacher {
char name[64];
int age;
};
//结构体变量是对象的时候用.,结构体变量是指针的时候用->;
int operatorTeacher01(const Teacher *Pt){
//Pt->age = 10;//不通过---指向的内存空间里的东西不能被修改
return 0;
}
int operatorTeacher02(Teacher *const Pt) {
Pt->age = 10;//pt指向的内存空间里的东西可以修改
//本身不能修改
//Pt = NULL;//本身不能修改
return 0;
}
int operatorTeacher03(const Teacher *const Pt) {
//Pt->age = 10;//pt指向的内存空间里的东西可以修改
//本身不能修改
//Pt = NULL;//本身不能修改
//都不能被修改,只能被调用(使用);
cout << "age:" << Pt->age << endl;
return 0;
}
int main()
{
const int a=0;
int const b=0; //第一种 第二种写法都是一样的
const int *c;
//const修饰的是指针所指向的内存空间--所指向内存空间里的东西不能被修改;
int *const c = 0;
//const修饰的是指针变量本身--原定指向哪个内存空间就是哪个,不能被更改;
const int * const e=0;
//本身和指向的内存空间都不能修改--指向内存空间里的东西不能被更改,原定指向哪个内存空间也不能被更改;
Teacher t1;
t1.age = 33;
operatorTeacher03(&t1);
return 0;
}
//const 的好处,指针作为函数参数时,增加代码的可读性,减少bug;
//清楚的区分指针是 输入 还是 输出 的特性;
------01_笔记*/
//1.发现问题:C 中的 const 可以被间接赋值:
/*
------ 有代码如下:
#include<stdio.h>
int main()
{
const int a=10;
int *p;
p=(int *)&a;
*p=20;
printf("a:%d \n",a);
return 0;
}
输出为: a: 20;
说明C语言中的const是一个冒牌货,可以通过指针间接赋值来修改const的值
而在:C++ 编译器中则不会发现这样的情况:
输出还是: a:10;
//所以,在C++语言中,const是一个真正的常量
//2.上述问题的原因:
C++编译器中有符号表这个机制
C++编译器对const做了加强;符号表存放const变量
当使用这个const值时,C++编译器会调出这个值;
当取这个const变量的地址时,C++编译器会为这个变量再开辟一个地址,而且所指向的地址不再是原变量的首地址,而是这个开辟的新地址。
#include<stdio.h>
int main()
{
const int a=10;
int *p;
p=(int *)&a;
*p=20;
printf("a:%d \n",a);
printf("*p:%d \n",*p);
return 0;
}
结论:
C语言中:
const是只读变量,有自己的存储空间;
C++语言中:
const变量可能被分配空间,也可能不分配空间;
当取地址符号&操作时,分配存储空间;
当const变量作为全局变量时,并且在其他文件中使用时,才分配内存空间;
//3.给const变量分配内存的时机,是在编译时分配内存,还是在执行时?
答:在编译时,扫描到这个变量,就给他分配了内存。
int main()
{
int a;
const int b=0;
int c;
printf("&a:%d ,&b:%d ,&c:%d",&a,&b,&c); //依次将a,b,c压栈进入内存,b处于a、c之间
*p=20;
return 0;
}
//4. const的用法:
// const 是C++ 中用来替换#define的一个手段;
//与#define的相同之处:
int main()
{
int a=10;
int b=20;
int Arry[a+b];
//这种在C++编译器中是不通过的---在linux内核中是成立的--linux的gcc编译器是支持的--win的C和C++都不支持
}
int main()
{
const int a=10;
const int b=20;
int Arry[a+b];
//这种是可以通过编译的
return 0;
}
*/
//const 与 #define 的不同之处:
//#define 在编译预处理阶段处理
//const 常量是由编译器处理的,提供类型检查和作用域检查;
/*
void fun1()
{
#define a 10
const int b = 20;
//#undef a //卸载宏定义:# undef
}
void fun2()
{
printf("a = %d\n", a);
printf("b = %d\n", b);// const定义的b是由作用域的
}
int main()
{
fun1();
fun2();
return 0;
}