C++中的const的内存分配问题

     在c++我们知道一般是采用const来进行替代#define的。

   例如:

      

const int N=3;//注意采用的是赋值的形式并且末尾有分号
#define N 3

     在C中我们知道#define进行预定义的某个数是不(谢谢网友,打字问题哈哈)分配内存的,其文件在编译预处理过程中就会用定义好的数据去替代文中的符号。

    但是const却是不一样的,一般情况下编译器也是不为const创建空间的,只是将这个定义的数字保存在符号表中的。但是在下列几种情况下编译器会为const定义的常量分配内存的。

  1.使用了extern头

extern const int N=3;
因为使用了extern我们将可能在外部文件使用N,而const默认的是内部链接,所以我们必须要为之分配内存的。

2.取地址操作

#include<iostream>
using namespace std;
 const int M=3;
int main()
{
const	int *p=&M;//当编译器发现有对const定义的常量进行取地址操作时候会对M进行内存分配,
                  //注意这个地址是const int*类型的,地址中的内容不可以改变的
int *pp=(int*)(&M)//此处我们将const int*类型强制转化成int * 但是对于*pp的任何赋值操作还是会报错的,
                  //因为本质上的M是常量不可改变的,这也是const的优点
	cout<<*p<<endl;	

	return 0;
	
}

3.const定义的常量未知的时候,这是#define无法实现的。

#include<iostream>
using namespace std;
int main()
{
const int b=cin.get();//此处const定义的b是未知的所以要为它分配内存,但是一旦分配就不可以改变的。
                      //但是如果读者此处想在利用未知的const常量来定义数组还是会报错的。
                     //即int array[b]是不行的,因为编译器在从上往下走的时候是要确定数组的大小的
                    //但是采用new操作就不会报错的int *array=new int(b);

	cout<<b<<endl;
	return 0;
	
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值