【C/C++】秋/春招技术岗面试基础——cosnt和define

本文详细解析了C和C++中const关键字的使用区别,包括const在局部和全局变量中的行为,以及与#define宏定义的区别。同时,深入探讨了指针const的概念,区分了底层const和顶层const的不同,并提供了实例说明。

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

C和C++中const的区别

C中的const
C语言中的const只是让变量变为只读属性,其本质还是变量,不是真正意义上的常量(只有enum枚举定义的才是常量).

注意:const变量不能被直接赋值,但是可以通过指针来修改const变量.

由于const局部变量会存在栈里,而const全局变量会存在只读存储内存上

所以我们可以通过指针来修改const局部变量,但是修改const全局变量,会使程序崩溃.
C++中的const
在C++中,const变量则是真正的常量了,定义时会将其放入符号表中.

所以编译途中遇到使用const变量时,则直接从符号表中取出常量.

只要当该const变量为全局(使用extern声明过),或者被使用&操作符时,才会被分配存储空间.

const和#define的区别

  • const常量: 由编译器处理,它会对const常量进行类型检查和作用域检查
  • define宏定义: 由预处理器处理,直接进行文本替换,不会进行各种检查
  • 作用域: 用const定义的局部变量只能在局部中使用,而define宏定义是全局的。

(预处理器是执行编译器之前运行的程序,用来删除注释,宏变量转换等)

//const和define 作用域不同
void f()
{
    #define a 3        //定义宏
    const int b = 4; //定义局部变量
}

int main()
{  
    f();   
    printf("a=%d",a);

    //printf("b=%d",b);
    return 0;
}
输出结果为 a=3;
这是因为执行预处理器时,会将遇见到的所有a变为3,
所以编译器看到的是printf("a=%d",3);
而取消//printf("b=%d",b);
 屏蔽后,程序则会报错,是因为b的作用域只在f()函数里有效.

指针const

指针const分为两种: 底层const, 顶层const

(普通变量的const(或引用)永远是顶层const,也就是说,const int 和int const本质都一样)

  • 底层const(位于*左侧)

常量指针:表示指向的对象是个常量,不能修改其内容,只能更改指针指向的地址。

其实很好理解,比如 const int *p, 修饰*p是个const常量.*p是指向对象的内容.所以表示指向对象的内容是常量
但是可以通过其它方式修改内容,例如:
int a=1,b=3;

const int *p=&a;     //底层const

//*p=2;              //错误,无法修改*p指向的a里面内容

a=2;                 //正确,通过其它方法来修改*p的内容
printf("%d\n",*p);

p=&b;                //正确,可以更改指针指向的地址
printf("%d\n",*p);
  • 顶层const(位于*右侧)
    指针常量,表示不能更改指针指向的地址,只能修改其内容(定义时必须被初始化)
其实很好理解,比如  int * const p, 修饰 p是个const常量.
而 p是指向对象的地址.所以表示指向对象的地址是个常量

和引用非常相似,例如:
int a=1;
int b=3;

//int *const p;    //错误,没有被初始化

int *const p=&a;   //顶层const

//p=&b;            //错误,不能更改指针指向的地址

*p=2;              //正确,修改a的值等于2

原文链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值