C/C++中的const
一、C中的const
C语言中的const定义的是只读变量,既然是变量,那么就有地址空间。只是这个变量只读,不能更改,但也是分情况。
(1)const修饰全局变量,不能通过变量名更改其值,也不能通过地址改其值
被const修饰的全局变量,我们可以得到它的地址空间,但是我们不能通过地址修改它的值,否则报错。
#include<stdio.h>
const int overall=10;
void test1()
{
// overall=11;//通过变量名修改其值报错
printf("%d\n",&overall);
}
void test2()
{
int *p=&overall;
printf("%d\n",p);
// *p=11;//通过地址修改其值报错
printf("%d",overall);
}
int main()
{
test1();
test2();
}
(2)被const修饰的局部变量,可以通过它的地址修改它的值。但同样不能通过变量名修改它的值
#include<stdio.h>
void test1()
{
const int overall=10;
// overall=11; //不加注释报错
printf("%d\n",&overall);
printf("%d\n",overall);
int*p=&overall;
*p=11;
printf("%d\n",overall);
}
void test2()
{
}
int main()
{
test1();
}
结果如下:
二、C++中的const
C++中定义的量有没有地址空间,要看看它定义的量的类型了,如果是const定义的普通的量,一开始它是没有地址空间的。比较复杂,和c语言一样,不能通过变量名更改其值。大家接着看吧
(1)直接通过赋值给const声明的量定义,那么这个量是没有地址空间的。这个量就相当于宏定义之类的,没有地址空间,这个量与其值就相当于在一个表中记录着。没有地址。后期如果我们去访问这个量的地址,程序会被迫给这个量一个地址空间,通过地址修改其值,可以更改,但也是仅限于const修饰的局部变量,全局变量依然不能通过地址更改,但是更改之后再通过变量名访问会发现值保持原来的值没有变化,因为这个通过变量名先访问表中记录着的值,但是地址中的值已经改变。
#include<iostream>
using namespace std;
//const int overall = 10; //此时这个值就相当于一个常量没有地址空间,全局定义的const修饰的量也不能通过地址更改
void test1()
{
const int overall = 10; //把overall从全局换到局部才可以通过地址修改其值
//overall=11; //通过变量名修改其值报错。
cout<<&overall<<endl; //当我们访问它的地址空间。程序被迫为其开辟一块内存空间
int *p =(int *)&overall; //overall为全局时,此行报错,改为局部之后,正常运行。
*p=520;
cout<<"*p指向overall地址中的值:"<<*p<<endl;
cout<<"overall的值:"<<overall<<endl;
}
int main()
{
test1();
}
运行结果:
(2)通过变量给const修饰的量赋值,这个量一开始就会有地址空间,而不是把值存到一个表中;而直接初始化定义这个量没有地址空间,是把值存入一个表中,后期访问内存才会为其开辟空间。
#include<iostream>
using namespace std;
//const int overall = 10; //此时这个值就相当于一个常量没有地址空间,全局定义的const修饰的量也不能通过地址更改
void test2()
{
int b=10;
const int overall = b;
const int compare =5;
cout<<"通过变量初始化的:"<<endl;
cout<<"overall初始值:"<<overall<<endl;
cout<<&overall<<endl;
int *p =(int *)&overall;
*p=520;
cout<<"*p指向overall地址中的值:"<<*p<<endl;
cout<<"overall的值:"<<overall<<endl;
cout<<endl;
cout<<"直接赋值初始化的:"<<endl;
cout<<"compare初始值:"<<compare<<endl;
cout<<&compare<<endl;
int *q = (int *)&compare;
*q=50;
cout<<"*q指向compare地址中的值:"<<*q<<endl;
cout<<"compare的值:"<<compare<<endl;
}
int main()
{
test2();
}
结果如图:
结果说明,通过变量对const修饰的量进行定义,内存会为其开辟空间。
(3)当用const定义一些特殊量(结构体、对象),内存会直接为其开辟空间
#include<iostream>
using namespace std;
void test3()
{
class youth {
public:
int a;
int b;
};
youth a={10,5};
cout<<a.a<<" "<<a.b<<endl;
youth *r = (youth *)&a;
r->a=100;
r->b=50;
cout<<r->a<<" "<<r->b<<endl;
cout<<a.a<<" "<<a.b<<endl;
}
int main()
{
test3();
}
结果如图: