//1、局部变量const int a = 10 ; int * p = &a //分配临时内存 指针不可修改
const int a = 10 ; 这句话表示const int a是存放在符号表中的常量,a是键,10是值。
平时是不分配空间的。int * p = &a,这句话的时候,系统会临时在栈区分配一个临时空间temp,temp空间的值是10.之后将临时空间的地址赋值给指针p。之后通过*p修改的是临时地址里面的值,函数结束后该临时空间会释放。这种情况利用指针是不能修改a的值的。
//2、当加入extern 修饰const,也会分配内存 全局区 指针不能修改
extern会将const修饰的变量提升为全局变量,但是不能修改因为该变量是在全局区的ro.data区 全局变量没有用extern const修饰,而是单纯的const修饰,那么全局变量位置还是处于ro.data,只是作用域变小,当前文件内。
//3、用变量初始化const,也会另外单独分配内存,如下 可以用指针修改值
int b = 10;
const int a = b; //a和b的地址不一样各自独立分配空间 a地址在栈区
//4、const修饰一个普通变量的别名,别名的空间就是变量的空间。可以用指针修改
//此时f是c的别名 二者地址空间一样
intc = 5;
const int &f = c; //f接收变量的赋值,f是c的别名,f的地址就是c的地址
cout<< &c << endl; //地址和下面地址一样
cout<< &f << endl;
cout<< f << endl; //结果5
int*p= (int*)&f;
*p= 55;
cout<< f << endl; //结果55
cout<< c << endl; //结果55
//5、const修饰一个字面值的别名时,分配临时空间,此时别名就是临时空间的别名,可以用指针修改值
const int &ref =10; //相当于int temp = 10; const int& ref = temp;
int * p = (int*)&ref;
*p = 10000;
cout << ref << endl;//结果是10000,可以修改
//const int &a = 10;相当于系统首先开辟一个临时空间int temp = 10;
//之后constint& ref = temp;相当于ref是这个临时空间的别名(临时空间在栈区)。
//而const这个时候修饰的实际temp地址的别名,temp的地址在栈区。
//通过指针是可以修改该块地址空间的值的,该块空间的值变了,也就是ref别名的值变了
//那么此时const int &ref = 10;中的ref存放位置就不是符号表中,所以用指针可以修改
//其值
//只要const修饰分配内存,可以通过间接方式进行修改(根据情况,如果在栈区或者
//堆区可以修改,如果在常量区不可以修改)
//6、函数返回值中,如果时用const别名接收一个变量,那么相当于上面第四种情况,
//此时f是a的别名 二者地址空间一样
void showValue(constint & f) // const int &f =a f是a的别名,可以通过指针修改,
{ //但是加上const表示不要修改!(提醒功能)
//f = 1000;
int *p = (int*)&f;
*p = 100;
cout << f << endl;
cout << &f<< endl; //地址同下面相同
}
void test02()
{
int a = 10;
showValue(a);
cout << &a << endl; //地址和上面相同
}
//7、对于自定义数据类型 ,也会分配内存 可以用指针修改值
structPerson
{stringname;
intage;};
const Person p; //p分配了空间,可以用指针修改