C语言和C++中const的区别

本文详细对比了C语言和C++中const关键字的使用差异,包括变量属性、数组下标使用、初始化要求及内存分配特点。揭示了C语言中const视为只读变量,而C++中更倾向于将其视作常量。

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

1、 c语言中的const

                #include<stdio.h>
               void main()
               {

                    const int  a = 10;

                    //int arr[a] = { 0 };  不能用a作为数组下标

                    //a = 20;  //不能进行直接修改

                    printf("修改前a=%d\n", a);

                    int *p = &a;

                    *p = 20;

                    printf("修改后a=%d\n",a);

                }

                       

        (1)可以看出,在c语言中,const 修饰的变量是常变量,它的性质还是属于变量,只不过是具有常性的变量,也就是说:它不能通过直接作为左值的方式来进行修改;

       (2)在编译过程中,与变量一样的方式处理;

       (3)它还是属于变量,因此不能作为数组的下标;

       (4)虽然不能直接直接修改a的值,但是可以通过获取a的地址来间接修改。

2、 c++中的const

#include<iostream>

using namespace std;

int main()

{

const int a = 10;

//const int b; 必须初始化

int arr[a] = { 0 };

//a = 20;

cout << "修改前a=" << a << endl;

int *p = (int*)&a;

*p = 20;

cout << "修改后a=" << a << endl;

return 0;

}


                            
可以看出,在c++中,const 修饰的变量是常量,它也就具有常量的性质。那么:

(1)它不能通过直接作为左值的方式来进行修改;

(2)它可以作为数组下标使用;

(3)它必须被初始化;

(4)在编译过程中,所有使用a的地方会被替代成10;(c++编译器对const常量的处理当碰到常量声明时,在符号表中放入常量;编译过程中若发现使用常量则直接以符号表中的值替换)

但是有时它也会退化为常变量,比如:

                                            int  c=10;

                                            const int a=c;//当被初始化为变量时

3.对于内陪的数据类型,如:int,float,double等。如果使用const修饰,C++编译器并不为之分配内存,而是把它放在编译器的符号表里。但是C编译器却不同,会为之分配内存。如:

const int bufsize=100;

char buffer[bufsize];

在C++编译器中编译上面两句没问题的。我们知道,我们定义的数组,编译器必须要知道其数组的大小,并且为之分配内存,也就是数组的大小是一个常量表示式,能够被在编译阶段确定下来,否则就会编译出错。在C++编译中,因为编译器并没有为bufsize为配内存,而只是把它保存在符号表中,当编译Char  buffer[bufsize];这句时会到符号表里查bufsize的值,然后再为之为配内存,所以是没问题的。

而在C编译器中,编译上面两句却编译不过,因为编译器会为bufsize为配内存,编译器并不会检查内存里的值,而只检查数据的类型,所以不会知道bufsize的值是多少,在编译阶段不能确定数组的大小,所以会出错。

注意:如何解释取地址?

编译过程中若发现对const使用了extern或者&操作符,则会对应的常量分配存储空间(为了兼容c)。c++编译器虽然可能为const常量分配空间(进行&运算时),但是不会使用其存储空间中的值。

结论:

C语言中const常(变)量:其是只读变量,有自己的储空间,能通过地址间接修改其的值。

C++中的const常量:其是放在符号表中,可能分配存储空间,也可能不分配存储空间 ,使用&符号时候才分配一个临时内存空间。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值