const总结

本文探讨了C和C++中const关键字的行为差异,指出在C中const不能定义数组大小,而在C++中const可以用立即数初始化成为常量。文章还详细解释了const修饰的一级和二级指针,以及const与引用的交互,强调了const在不同情况下的作用和限制,并提供了代码示例来说明const指针和引用的用法。

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

const

const在c中的行为是常变量
不能定义数组的大小,因为其是一个变量
在c++中,(const int a = 4;)使用立即数初始化,那么就是一个常量,在编译阶段,会将所有的a使用10代替(const int a = 10),使用变量初始化(const int a = b)就是一个常变量,因为b的值只有在运行阶段才能知道,其行为和在c中一致,
都可以通过 int* p = (int*)&a 修改a地址的值(需要转int*, 是因为常量不能把地址暴漏给普通指针),但是对于常量来说,在编译阶段就已经被常量替换了,因此打印出来也是不变的。

int main()
{
    const int a = 10;

    
    int* p = (int*)&a;
    const int b = a;
    *p = 30;
    printf("%d %d %d",a, *p, b);

	return 0;
}

const与一二级指针:const修饰的是与其最近的类型
一级指针

int const * p;//修饰的int,是底层const
const int * p;//同上,推荐这种写法

int * const p;//修饰的int*,顶层const,!!!!p其本质还是int*,只是p不能做为左值,可以做右值赋值给int*
const int * const p;//第一个const是底层const,第二个是顶层const

二级指针

const int **q;//修饰的int ,即**q不能做左值
int * const *q;//修饰的int *,即*q不能做左值,抛去const,q是一个int**类型,加上const,即*q是一个const类型
int ** const q;//修饰的int**,即q不能做左值
int * p = nullptr;
const int** q = &p;//错误的,const int ** <= int ** 不行
//直观上感觉可以,但是不行,原因是,此时*q和p指向的同一块内存
const int b = 4;
*q = &b;//

const int* const* q = &p;//正确的

*如第四,五行,b是const int,地址交给q是可以的,因为q是一个const int !但是如果第二行的赋值成功,q指向的地址同时也被一个int所指向,那么此时就是把一个常量的地址暴漏给了普通指针

第五行正确的,因为第二行错误的原因是 q可以被一个&b赋值,如果加上const修饰int,那么此时*q,不能再被赋值

引用

  • 引用和指针的区别
  • 在汇编层面一样,
  • 引用必须初始化,且初始化之后无法修改引用的对象
  • 引用没有多级

使用引用,引用一个数组

int array[5] ={}; 
int (&p)[] = array;

const和引用

判断const和引用的问题,把引用转换为指针就可以了

int a = 10;
int *p = &a;
const int*&q = p;//--->const int **q = &p;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值