C++/C const问题

本文探讨了C++和C语言中const关键字的不同用法。C++中const对于内置类型被视为常量,编译器会进行常量替换;而对于非内置类型,则表示只读变量。文章通过实例对比了两种语言中const的特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C++中的const 有#define的一部分作用,如果是内置类型,那么它就有代替的关系
如可以这样声明:
const int a=3;
int arr[a];

而C是不可以这样的,但可以#define a 3;
但是它们其实是可以通过内存位置来改数据的;

下面就是例子:
const在C语言中表示只读的变量,而在C++中表示一个常量。

C语言中,const表示只读的变量,存储在内存中,可以通过指针改变该存储空间中的值。

看以下例子:

1 const int var = 10;
2 int *ptr = (int *)(&var);
3 *ptr = 20;
4 printf("var=%d *ptr=%d \n",var,*ptr);

输出结果是:var=20 *ptr=20 。这是因为指针ptr改变了内存中的值。当程序读取var数据时,得到的是被修改后的值。

C++语言中,const被看做常量,编译器使用常数直接替换掉被const修饰的标识符的引用,并不会通过访问内存去读取数据,这一点类似C语言中的宏#define。

看以下例子:

1 const int var = 10;
2 int *ptr = const_cast<int *>(&var);
3 *ptr = 20;
4 cout<<"var="<<var<<" *ptr="<<*ptr<<endl;

输出结果是:var=10 *ptr=20。这是因为编译器使用常量直接替换掉了对var的的引用,而不是从内存中读取var值。

此外,C++语言中,只是对于内置数据类型做常数替换,而对于像结构体这样的非内置数据类型则不会。因为结构体类型不是内置数据类型,编译器不知道如何直接替换,因此必须要访问内存去取数据,而访问内存去取数据必然会取到被指针q改变后的值,因此会造成与C++中const内置类型完全不一样的处理模式。

看以下例子:


复制代码
 1 struct test
 2 {
 3     int var;
 4     test()
 5     {
 6         var = 30;
 7     }
 8 };
 9
10 int main()
11 {
12     const test testobj;
13     int *ptr = (int *)(&testobj.var);
14     *ptr = 40;
15     cout<<"var="<<testobj.var<<" *ptr="<<*ptr<<endl;
16     return 0;
17 }

复制代码

输出结果是:

var=40 *ptr=40。这是因为对于非内置数据类型,编译器不知道如何直接替换,所以对于var取值仍是通过读取它的存储空间中的值来获得。

总结一下,就是:const在C语言中表示只读的变量,而在C++中对于内置类型表示一个常量,对于非内置类型表示只读的变量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值