const 的使用

简介: const 是"constant"的缩写,意思是永恒不变的,它定义的是只读变量的关键字,或者说是定义常变量的关键字。

关于const的基本认识


const的基本概念


const 是"constant"的缩写,意思是永恒不变的,它定义的是只读变量的关键字,或者说是定义常变量的关键字。


特点:


说const定义的是变量,但又相当于是常量。说它定义的是常量,但它又有变量的特点,所以作常变量。


1.用const定义的变量的值是不能在修改的。它定义的是只读变量,所以必须在定义的时候就要给它初始化。


int main()
{
  int a = 20;
  a = 30;//局部变量是可以修改的
//  int const b=10;const写在int左边和右边都是可以的。都是修饰b
  const int b = 10;
  (错误)b = 15;//被const修饰的b无法再修改,初始化后就不能修改了
  return 0;
}


2.用const修饰的变量,无论是全局变量话说局部变量,生命周期都是程序运行的整个过程。全局变量的生命周期是整个过程而用const修饰过后的变量因为拥有了静态特性,它的生命周期也是程序运行的整个过程。但是注意用const修饰的局部变量只是有了静态特性,并没有说它变成了静态变量。

注意点:


1.我们知道,局部变量存储在栈中,静态变量存储在静态存储区中,而经过 const 修饰过的变量存储在内存中的“只读数据段”中。只读数据段中存放着常量和只读变量等不可修改的量


2.数组的长度不能是变量。虽然 const 定义的是只读变量,就相当于是定义一个常量。但是只读变量也是变量,所以 const 定义的变量仍然不能作为数组的长度。但是需要注意的是,在 C++ 中可以!C++ 扩展了 const 的含义,在 C++ 中用 const 定义的变量也可作为数组的长度。


const VS define


很多人在学习 const 的时候都会混淆它与 define 的区别。从功能上说它们确实很像,但它们又有明显的不同:


1


define是预编译指令,而const是普通变量的定义。define定义的宏是在预处理阶段展开的,而const定义的只读变量是在编译运行阶段使用的。


2.


const定义的是变量,而define定义的是常量。define定义的宏在编译后就不存在了,它不占用内存,因为它不是变量,系统只会给变量分配内存。但const定义的常变量本质上仍然是一个变量,具有变量的基本属性,有类型、占用存储单元。可以说,常变量是有名字的不变量,而常量是没有名字的。有名字就便于在程序中被引用,所以从使用的角度看,除了不能作为数组的长度,用const定义的常变量具有宏的优点,而且使用更方便。所以编程时在使用const和define都可以的情况下尽量使用常变量来取代宏。


3.


const定义的是变量,而宏定义的是常量,所以const定义的对象有数据类型,而宏定义的对象没有数据类型。所以编译器可以对前者进行类型安全检查,而对后者只是机械地进行字符替换,没有类型安全检查。这样就很容易出问题,即“边际问题”或者说是“括号问题”。


const 在 *指针的左边


const在*的左边对指针有什么影响呢?


int main()
{
  int a = 10;
   int* p = &a;
  *p = 20;
  printf("%d", a);
  return 0;
}


这段代码表示通过对指针p解引用改变了a的值。


如果将const 加在int *p=&a;的前面 const int *p=&a;



9e4593207a1a4216b04ebeaa2567d6c4.png


const 修饰的是 * p,使得 *p指向的内容(也就是a)不能修改了,所以 *p(a)不能再改变了。


指针指向的内容不能改变但指针是可以改变的,


int main()
{
  int a = 10;
  int b = 20;
  const int* p = &a;
  *p = 20;//这个操作是不可以的 
  p = &b;//这个操作是可以的
  return 0;
}


还有const在int的左边和右边是一样的都是修饰 *p的


int main()
{
  int a = 10;
  const int* p = &a  —————— int const *p=&a; 两种写法是一样的,都是修饰*p 都是在*的左边
  return 0;
}


const 在 *指针的右边


const在*右边修饰的是指针了,倒置指针无法修改,但是指针指向的内容是可以修改的。


int main()
{
  int a = 10;
  int b = 20;
   int* const p = &a;
  //cosnt在*的右边修饰的是指针变量p,所以指针变量p无法修改,但是指针p指向的内容可以修改
  p = &b;//这个操作是不行的
  *p = 20;//这个操作是可以的
  return 0;
}


总结:


const对指针的影响:


*const在 * 的左边,则指针指向的变量的值不可直接通过指针改变(可以通过其他途径改变);在 的右边,则指针的指向不可变。简记为"左定值,右定向"简记"左定值,右定向"

相关文章
|
Java 数据安全/隐私保护 C++
一款免配置的浏览器编程工具jupyter,可以同时编写 python,java,c,c++,体积小
一款免配置的浏览器编程工具jupyter,可以同时编写 python,java,c,c++,体积小
483 2
|
5月前
|
缓存 JavaScript 开发者
鸿蒙5开发宝藏案例分享---长列表性能优化解析
鸿蒙长列表性能优化全揭秘!通过五大实战技巧(LazyForEach懒加载、cachedCount缓存、Prefetcher动态预加载、@Reusable组件复用及布局优化),有效解决卡顿、白块和高内存问题。万条数据测试显示,首屏加载提速77%,滑动零丢帧,内存占用降低86%。针对不同数据量场景提供避坑指南,助你开发流畅的HarmonyOS应用!
|
7月前
|
存储 人工智能 数据处理
Apache Doris 2025 Roadmap:构建 GenAI 时代实时高效统一的数据底座
秉承“以场景驱动创新” 的核心理念,持续深耕三大核心场景的关键能力,并对大模型 GenAI 场景的融合应用进行重点投入,为智能时代构建实时、高效、统一的数据底座。
397 10
Apache Doris 2025 Roadmap:构建 GenAI 时代实时高效统一的数据底座
|
算法 搜索推荐 数据挖掘
二分查找法的应用场景
【10月更文挑战第9天】
877 58
|
缓存 负载均衡 安全
深入探索Nginx高性能Web服务器配置与优化
【5月更文挑战第7天】本文深入探讨了Nginx的配置与优化,重点介绍了基础配置参数如`worker_processes`、`worker_connections`和`keepalive_timeout`,以及优化策略,包括使用epoll事件驱动模型、开启gzip压缩、启用缓存、负载均衡和安全配置。此外,还提到了性能调优工具,如ab、nginx-stats和nmon,以助于提升Nginx的性能和稳定性。
|
安全 Java 关系型数据库
代码规范Java阿里巴巴
本文介绍了阿里巴巴的《Java开发手册》,这是一份业界公认的代码规范手册,涵盖编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约七个维度。手册通过强制、推荐、参考三大类规约,详细指导开发者编写高质量的Java代码。文中还提供了常见问题的正反例对比,如方法参数类型一致性、SimpleDateFormat线程安全等问题的解决方案。此外,还介绍了如何安装和使用阿里规范插件来提高编码效率。
1619 9
|
SQL 安全 API
在API 接口的设计中,如何保证数据的安全性和完整性?
在API接口设计中,确保数据安全与完整至关重要。关键措施包括:采用HTTPS协议防数据泄露;强认证机制(如OAuth2/JWT)确保用户授权;敏感数据加密(如AES);签名加时间戳防重放攻击;输入验证防SQL注入等攻击;恰当错误处理避免敏感信息泄露;限频防滥用及DDoS攻击;详尽日志记录助安全审计;数据完整性校验(如哈希比对);版本控制保兼容;严格避免响应中泄露敏感信息;定期安全审计与测试。这些措施共同保障API安全。
1686 0
|
传感器 人工智能 搜索推荐
人工智能(AI)与物联网(IoT)的融合是当今技术领域的一个重要趋势
人工智能(AI)与物联网(IoT)的融合是当今技术领域的一个重要趋势
Qt实用技巧:对QPushButton(等类似透明有黑色背景的QWidget实现透明/半透明的方法
Qt实用技巧:对QPushButton(等类似透明有黑色背景的QWidget实现透明/半透明的方法
Qt实用技巧:对QPushButton(等类似透明有黑色背景的QWidget实现透明/半透明的方法
|
算法 小程序 Java
图像中二维码的检测和定位
图像中二维码的检测和定位
1725 0
图像中二维码的检测和定位