c++笔记 c/c++中的const

c中的const

常量的引进是在 c++早期版本中,当时标准 C 规范正在制定。那时,尽管 C 委员 会决定在 C 中引入 const,但是,他们 c 中的 const 理解为”一个不能改变的普通变量”,也就是认为 const 应该是一个只读变量,既然是变量那么就会给 const 分配 内存,并且在 c 中 const 是一个只读变量,c 语言中 const 修饰的只读变量是 外部连接的。 如果这么写:

const int arrSize = 10;
int arr[arrSize];

看似是一件合理的编码,但是这将得出一个错误。 因为 arrSize 占用某块内存,所 以 C 编译器不知道它在编译时的值是多少?

c语言中 的const修饰全局变量为外部链接的,可以在其他源文件中使用

不能通过变量名进行赋值,但是如果知道地址,可以通过地址间接修改其变量的值(局部只读变量,内存在栈区,可读可写),全局变量不可以通过地址修改,因为内存在文字常量区开辟,只读不可写。

总结:

1、const修饰全局变量num 变量名只读 内存空间在文 字常量区(只读)、不能通过num的地址 修改空间内容

2、const修饰局部变量data 变量名只读 内存空间栈区 (可读可写),可以通过data地址 间接的修改空间内容

c++中的const

在 c++中,一个 const 不必创建内存空间,而在 c 中,一个 const 总是需要一块内 存空间。在c++中,是否为 const 常量分配内存空间依赖于如何使用。一般说来, 如果一个 const 仅仅用来把一个名字用一个值代替(就像使用#define 一样),那么 该存储局空间就不必创建。 如果存储空间没有分配内存的话,在进行完数据类型 检查后,为了代码更加有效,值也许会折叠到代码中。 不过,取一个 const 地址, 或者把它定义为 extern,则会为该 const 创建内存空间。 在 c++中,出现在所有函 数之外的 const 作用于整个文件(也就是说它在该文件外不可见),默认为内部连 接,c++中其他的标识符一般默认为外部连接。

总结:c++总结

1、const int data = 10;//data先放入符号表

2、如果对data取地址 系统才会给data开辟空间

3、const int a = b;//b是变量名 系统直接给a开辟空间 而 不放入符号表

4、cosnt 修饰自定义数据 系统为自定义数据开辟空间

 C/C++中 const 异同总结

c 语言全局 const 会被存储到只读数据段。c++中全局 const 当声明 extern 或者对 变量取地址时,编译器会分配存储地址,变量存储在只读数据段。两个都受到了只读数据段的保护,不可修改。

const int constA = 10;
int main(){
int* p = (int*)&constA;
*p = 200;
}

以上代码在 c/c++中编译通过,在运行期,修改 constA 的值时,发生写入错误。 原因是修改只读数据段的数据。 c 语言中局部 const 存储在堆栈区,只是不能通过 变量直接修改 const 只读变量的值,但是可以跳过编译器的检查,通过指针间接修改const 值。

const int constA = 10;
int* p = (int*)&constA;
*p = 300;
printf("constA:%d\n",constA);
printf("*p:%d\n", *p);

运行结果: c 语言中,通过指针间接赋值修改了 constA 的值。 c++中对于局部的 const 变量要 区别对待:

1 对于基础数据类型,也就是 const int a = 10 这种,编译器会把它放到符号表中, 不分配内存,当对其取地址时,会分配内存。

const int const A = 10;
int* p = (int*)&constA;
*p = 300;
cout << "constA:" << constA << endl;
cout << "*p:" << *p << endl

运行结果:

constA 在符号表中,当我们对 constA 取地址,这个时候为 constA 分配了新的空 间,*p 操作的是分配的空间,而 constA 是从符号表获得的值。

2 对于基础数据类型,如果用一个变量初始化 const 变量,如果 const int a = b,那 么也是会给 a 分配内存。

int b = 10;
const int constA = b;
int* p = (int*)&constA;
*p = 300;
cout << "constA:" << constA << endl;
cout << "*p:" << *p << endl;

运行结果:

 

constA 分配了内存,所以我们可以修改 constA 内存中的值。

3 对于自定数据类型,比如类对象,那么也会分配内存

const Person person; //未初始化 age
//person.age = 50; //不可修改
Person* pPerson = (Person*)&person;
//指针间接修改
pPerson->age = 100;
cout << "pPerson->age:" << pPerson->age << endl;
pPerson->age = 200;
cout << "pPerson->age:" << pPerson->age << endl

       为 person 分配了内存,所以我们可以通过指针的间接赋值修改 person 对象。 c 中 const 默认为外部连接,c++中 const 默认为内部连接.当 c 语言两个文件中都有 const int a 的时候,编译器会报重定义的错误。而在 c++中,则不会,因为 c++中 的 const 默认是内部连接的。如果想让 c++中的 const 具有外部连接,必须显示声 明为: extern const int a = 10; const 由 c++采用,并加进标准 c 中,尽管他们很不一样。在 c 中,编译器对待 const 如同对待变量一样,只不过带有一个特殊的标记,意思是”你不能改变我”。 在 c++中定义 const 时,编译器为它创建空间,所以如果在两个不同文件定义多个 同名的 const,链接器将发生链接错误。简而言之,const 在 c++中用的更好

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值