C/C++中的const

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();	
}

结果如图:

在这里插入图片描述

仅供学习参考,欢迎批评指正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值