您的位置:首页 > 编程语言 > C语言/C++

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

2014-04-09 10:47 204 查看
     在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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: