还未设置个性签名
成为VIP会员 享9项特权: 开通会员

完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>

3天内不再提示

C语言里的铁布衫——const

Q4MP_gh_c472c21 来源:未知 作者:胡薇 2018-06-11 16:26 次阅读

相传在C的世界里出现了一件极品装备(铁布衫)const、它的出现,让天下的所有刺客和黑客都闻风丧胆,在它的保护下,所有的变量都可以保存的完好无损const是constant的缩写,表示海枯石烂、恒定不变、一旦相伴、永不变心。只要一个变量前面用const来修饰,就意味着该变量的数据可以被访问,不能被修改。其实我们还可以叫它readonly.

虽然理解起const来相对比较容易理解,但是const不仅仅可以用来修辞基本类型,它还可以经常用来修辞一些构造类型和指针及其参合体,如数组、指针、指针数组、结构体数组、结构体指针数组一旦和这些复杂的类型结合起来还是有一定的迷惑性的.

例如:

(1) const int a = 10;

(2) int const a = 10;

(3) const int a[10] = {1,2,3, 4, 5, 6, 7, 8, 9, 10};

(4) const int *p;

(5) int * const p;

(6) const struct devices dev[5];

(7) struct devices const * dev[5];

看到上面的例子,我相信很多人都会倒吸一口冷气。话不多说直接看辨识技巧

将类型去掉;

看const修饰谁,谁就拥有铁布衫,谁的值就不能被修改,是readonly(1)去掉类型 int 变成“const a = 10”,a 拥有了铁布衫,a的值是不变的(2)去掉类型 int 变成“const a = 10”,a 拥有了铁布衫,a的值是不变的,这两个的效果一样(3)去掉类型 int 变成“const a[10]”, a[10]拥有了铁布衫,a数组里面的值是不变的(4)去掉类型 int 变成“const *p”,*p拥有铁布衫,p所指的空间里面的值是不变的(5) 去掉类型 int * 变成 “const p”,指针变量p拥有了铁布衫,指针变量p的值不变,也就是说p不能再指向其他地址了,但是p所指向的空间的值可变(6)去掉类型struct devices变成“const dev[5]”,dev[5]拥有了铁布衫,dev[5]数组的值不变(7)这是一个devices结构体类型的指针数组,它拥有5个devices结构体类型的指针,每个指针指向一个devices结构体,const修饰*dev[5],去掉类型struct devices变成“const *dev[5]”,指针数组*dev[5]拥有了铁布衫,指针数组dev中每个元素指向的空间里的值不变。

作用总结:

首先、const关键字修饰变量名的时候,把这个变量变为是一个只读变量,这里的只读不是全局数据区的or段。它所修饰的变量原来是在哪个区域,const修饰之后它还在那个区域。比如修饰一个局部变量const int num = 5;那么这个局部变量还是存在栈空间上。它本身对应的内存空间还是可以变的。但是不可以通过num去修改它。如果定义一个指针指向num的地址。则可以改变num的值。其次、const可以修饰形参(保护形参不被修改),在这一点上,站在实现者的角度,const可以防止函数对实参修改带来的问题。站在调用者的角度来说,它对于实参只能访问,不能修改。所以、合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。简而言之,这样可以减少bug的出现。

  • C语言
    +关注

    关注

    166

    文章

    6150

    浏览量

    112223
  • CONST
    +关注

    关注

    0

    文章

    16

    浏览量

    7090
收藏 人收藏

    评论

    相关推荐

    嵌入式C语言知识点总结

    怎么才能做好嵌入式开发?学好C语言吧!今天就来推荐一篇大佬写的嵌入式C语言知识点总结。
    发表于 09-27 09:53 95次 阅读

    了解一下最新诞生的编程语言

    在 HN 的热榜中,一篇题为《编程语言工具进展缓慢》的文章吸引了不少网友的注意,其写道,「当一个新工....
    发表于 09-27 09:50 54次 阅读

    Linux上C语言程序编译过程详解

    大家肯定都知道计算机程序设计语言通常分为机器语言、汇编语言和高级语言三类。高级语言需要通过翻译成机器....
    发表于 09-27 09:46 157次 阅读

    玩转SQLite8:运算符与表达式

    本篇介绍了SQLite的基础运算符与表达式,并通过命令行的方式执行sql语句进行测试验证,在实际开发....
    的头像 码农爱学习 发表于 09-27 08:56 184次 阅读
    玩转SQLite8:运算符与表达式

    C语言指针知识科普

    指针是C语言最重要也是最难理解的部分,它在我们平时的工作中无处不在。
    发表于 09-26 10:26 59次 阅读

    C语言中指针的命令行参数

    指针是C语言最重要也是最难理解的部分,它在我们平时的工作中无处不在。
    的头像 C语言编程学习基地 发表于 09-26 10:18 126次 阅读

    一些小众的C语言知识点

    一些小众的C语言知识点,可能会比较有趣或者怪异,分享给大家看一下。
    发表于 09-26 10:16 62次 阅读

    关于C语言中常用的代码

    1 有t组数据/要测试t次 一个循环搞定 第一种,for循环   #include stdio.hi....
    发表于 09-26 10:02 69次 阅读

    玩转SQLite7:基本语法与数据类型

    前面几篇文章已经快速了解了SQLite的基本用法以及简单的Pyhton与C语言的API函数的使用。本....
    的头像 码农爱学习 发表于 09-26 09:07 315次 阅读
    玩转SQLite7:基本语法与数据类型

    玩转SQLite6:使用C语言来读写数据库

    本篇简单介绍了如何使用SQLite的C语言API中最基础的几个函数,实现对数据库的读写,后续再介绍其....
    的头像 码农爱学习 发表于 09-25 08:52 308次 阅读
    玩转SQLite6:使用C语言来读写数据库

    HT1380时钟芯片C语言源代码

    HT1380时钟芯片C语言源代码,方便移植到任何单片机上
    发表于 09-23 15:42 10次 阅读

    C语言入门经典(第4版)习题答案和例程的源码

    C语言入门经典(第4版) 习题答案和例程的源码,要参考书上的题目进行练习
    发表于 09-23 15:39 11次 阅读

    玩转SQLite1:SQLite简介与安装

    SQLite,是一个C语言库,诞生于2000年,它实现了一个小型、 快速、 自包含、 高可靠性的SQ....
    的头像 码农爱学习 发表于 09-23 08:58 198次 阅读
    玩转SQLite1:SQLite简介与安装

    关于C语言的那些小知识

    将分文件加-c参数提前编译成.o文件 并利用cc的多文件编译 将.o文件与主文件共同编译--->会因....
    的头像 C语言编程学习基地 发表于 09-22 16:37 157次 阅读

    STM32单片机中的C语言基础知识

    C语言是单片机开发中的必备基础知识,本文列举了部分STM32学习中比较常见的一些C语言基础知识。
    发表于 09-21 17:21 411次 阅读

    通过C语言代码制作“扫雷游戏se”

    想必屏幕前的你,肯定玩过windows系统自带的那个游戏,扫雷。
    发表于 09-21 17:13 112次 阅读

    何为断言?断言该怎么使用呢

    何为断言 断言一般是用于检测在某个程序位置程序必须满足某些条件的宏。一般用的多的可以分两种种情况: 前置条件:在某个程...
    发表于 09-21 14:59 2101次 阅读

    使用C语言实现高内聚低耦合

    编程时,我们讲究的是高内聚低耦合,在协同开发、代码移植、维护等环节都起到很重要的作用。
    发表于 09-21 11:33 167次 阅读

    使用C语言代码实现平衡二叉树

    这篇博客主要总结平衡二叉树,所以,二叉排序树知识不会提及,但是会用到。
    的头像 我快闭嘴 发表于 09-21 11:00 71次 阅读

    如果编程语言是部车你会选哪辆?

    Erlang是一个车队,它们齐心合力把你送到你想去的地方。你需要经验来掌控这么多车下的每个轮子,但一....
    的头像 倩倩 发表于 09-21 09:26 120次 阅读

    C++字符编码转换的基本方法

    这篇文章介绍了如何在最常见的编码方式(Unicode, UTF-8, ANSI)之间进行转换,结合代....
    发表于 09-20 09:50 121次 阅读

    学习C语言的绊脚石

    C语言在嵌入式学习中是必备的知识,审核大部分操作都要围绕C语言进行,而其中有三块“难啃的硬骨头”几乎....
    发表于 09-20 09:36 202次 阅读

    【安全算法之DES】DES算法的C语言源码实现

    【安全算法之DES】DES算法(支持ECB/CBC模式)的C语言源码实现
    的头像 嵌入式物联网开发 发表于 09-20 08:58 354次 阅读
    【安全算法之DES】DES算法的C语言源码实现

    C语言库memcpy和memmove的区别分析

    memcpy和memmove都是 C 语言的库函数,相比于 strcpy和 strncpy只能针对于....
    发表于 09-19 12:19 56次 阅读

    关于C++模板总结

    大家好,今天给大家分享一篇关于 C++ 模板总结概述。
    发表于 09-19 11:55 103次 阅读

    如何利用栈去实现一种简单计算器

    通过栈,将式子 3+2(9+8)/3(3/5) 转换为后缀表达式
    的头像 工程师邓生 发表于 09-19 10:32 78次 阅读

    单片机开发,怎么提高C语言编程代码的效率?

    请教下朋友们,单片机开发,怎么提高C语言编程代码的效率? ...
    发表于 09-18 16:29 5462次 阅读

    【安全算法之base64】base64加解密的C语言源码实现

    ​ 最近,有项目中需要用到base64的加解密,所以用C语言实现了一遍,测试效果还不错,代码量和RA....
    的头像 嵌入式物联网开发 发表于 09-18 09:31 527次 阅读
    【安全算法之base64】base64加解密的C语言源码实现

    windows下C语言使用curl库访问HTTP下载文件

    cURL是一个利用URL语法在命令行下工作的文件传输工具,1997年首次发行。它支持文件上传和下载,....
    的头像 DS小龙哥-嵌入式技术 发表于 09-17 15:57 214次 阅读
    windows下C语言使用curl库访问HTTP下载文件

    Linux开发_ Linux命令复习与文件目录复习

    介绍Linux下基本指令、系统环境搭建、复习C语言的文件编程。
    的头像 DS小龙哥-嵌入式技术 发表于 09-17 15:44 140次 阅读
    Linux开发_ Linux命令复习与文件目录复习

    Linux开发_文件目录操作介绍、创建BMP图片

    介绍C语言文件编程,创建BMP图片,BMP图片结构介绍,介绍目录接口编程,Makefile知识点。
    的头像 DS小龙哥-嵌入式技术 发表于 09-17 15:44 154次 阅读
    Linux开发_文件目录操作介绍、创建BMP图片

    【安全算法之SHA512】SHA512摘要运算C语言源码实现

    【安全算法之SHA512】SHA512摘要运算的C语言源码实现
    的头像 嵌入式物联网开发 发表于 09-16 19:20 637次 阅读
    【安全算法之SHA512】SHA512摘要运算C语言源码实现

    C语言与C++的区别

    在很大程度上,C++是C的超集,这意味着一个有效的C程序也是一个有效的C++程序。
    发表于 09-16 10:20 138次 阅读

    郭天祥十天学会C51单片机视频教程下载地址,国内公认最好

    郭天祥十天学会C51单片机视频教程 目前国内公认的最好的视频教程,通俗易懂,容易上手,非常适合初学者,被大量的培训机构采用...
    发表于 09-16 09:47 8124次 阅读

    【安全算法之SHA384】SHA384摘要运算C语言源码实现

    【安全算法之SHA384】SHA384摘要运算的C语言源码实现
    的头像 嵌入式物联网开发 发表于 09-16 08:46 450次 阅读

    Holtek微控制器应用范例-使用Enhanced Holtek C语言

    Holtek 微控制器应用范例–使用Enhanced Holtek C 语言.
    发表于 09-15 16:30 26次 阅读

    使用C语言实现面向对象开发

    想必很多人在第一次面对 OOPC(Object-Oriented-Programming-with-....
    发表于 09-15 10:37 164次 阅读

    使用C语言的学生成绩管理系统设计

    首先,列出所需要的头文件以及声明所需要的函数,细心的同学会发现,就算是数字,也用了字符串,方便输入以....
    发表于 09-15 10:30 147次 阅读

    关于C语言的10道面试题

    各位,今天给大家搜集了10道比较好的面试题,涉及了指针、运算、结构体、函数、内存,应该来说比较全面了....
    发表于 09-15 10:28 196次 阅读

    C++避坑指南

    C++是一门古老的语言,但仍然在不间断更新中,不断引用新特性。但与此同时 C++又甩不掉巨大的历史包....
    发表于 09-15 09:04 150次 阅读

    【安全算法之SHA256】SHA256摘要运算C语言源码实现

    摘要运算的算法等级至少是大于等于SHA256的安全级别,足以证明SHA256的重要性。今天给大家带来....
    的头像 嵌入式物联网开发 发表于 09-15 02:50 720次 阅读
    【安全算法之SHA256】SHA256摘要运算C语言源码实现

    Swift的使用体验与生态发展之路

    Swift 是一门多范式的编译型语言,是 Apple 生态中的重要开发工具 。官网介绍 Swift ....
    的头像 工程师邓生 发表于 09-14 18:01 142次 阅读

    请教大佬一个C语言顺序表的问题

    在顺序表插入数据中,有psl->a[psl->size] = x;这条运算,请问此处a[psl->size]是什么操作,是a变成数组了么? 谢谢...
    发表于 09-14 11:22 681次 阅读

    SHA1摘要运算的C语言源码实现

    【安全算法之SHA1】SHA1摘要运算的C语言源码实现
    的头像 嵌入式物联网开发 发表于 09-13 18:20 650次 阅读
    SHA1摘要运算的C语言源码实现

    不同操作系统下的编译器安装方式

    如前面介绍的那样,C++属于一种静态的编译型语言,所以,开发环境配置过程中就需要用到对应的编译器。
    发表于 09-13 15:54 75次 阅读

    C语言的发展史和特点 编译器Dev-C++安装和使用

    作为一名刚刚踏进大学生活的新生,看到了一些关于C语言的理论、概念、和一些专业术语,应该都会脑瓜子疼吧....
    发表于 09-13 11:34 117次 阅读

    【Linux+C语言】你真的了解system接口的调用吗?

    【Linux + C语言】话说,你真的了解system接口的调用吗?
    的头像 嵌入式物联网开发 发表于 09-12 16:33 720次 阅读
    【Linux+C语言】你真的了解system接口的调用吗?

    【安全算法之MD5】MD5摘要运算的C语言源码实现

    【安全算法之MD5】MD5摘要运算的C语言源码实现
    的头像 嵌入式物联网开发 发表于 09-12 16:32 850次 阅读
    【安全算法之MD5】MD5摘要运算的C语言源码实现

    C语言打印程序行号、日期方便调试程序

    平时开发C语言程序时,经常需要调试代码,C语言有一些宏,可以打印出当前的行号、文件名称、日期、时间,....
    的头像 DS小龙哥-嵌入式技术 发表于 09-09 11:43 808次 阅读
    C语言打印程序行号、日期方便调试程序

    C语言-文件编程

    这篇文章介绍C语言的文件编程函数,案例代码是在Linux环境下运行测试的分别介绍了C语言标准库的文件....
    的头像 DS小龙哥-嵌入式技术 发表于 09-09 11:33 586次 阅读

    C语言-枚举、共用体

    前面章节学习了结构体,结构体里可以按顺序存放相同或者不同的数据类型,每个成员都有它对应的存储空间。 ....
    的头像 DS小龙哥-嵌入式技术 发表于 09-09 11:31 184次 阅读

    C语言-链表(单向链表、双向链表)

    在前面章节已经学习了数组的使用,数组的空间是连续空间,数组的大小恒定的,在很多动态数据存储的应用场景....
    的头像 DS小龙哥-嵌入式技术 发表于 09-09 11:30 303次 阅读

    C语言中的数组详解

    数组:只能存放一种数据类型,比如int类型的数组、float类型的数组,里面存放的数据称为“元素”。
    发表于 09-09 10:54 89次 阅读

    函数指针的使用简述

    函数指针在Linux内核和C语言开发中用的非常多,而且在设计操作系统的时候也会用到,因此这里将详细讲....
    的头像 嵌入式应用开发 发表于 09-09 08:56 647次 阅读
    函数指针的使用简述

    RT-Thread Smart快速上手入门指南

    说明说明 下载rt-smart智能包装 可以在下面的链接下载rt-smart的软件包,文件名称为rt-smart-20201125.zip 它把几个解压,假设...
    发表于 09-08 15:40 2175次 阅读

    RT-Thread编程风格手册指南

      这是一份 RT-Thread 开发人员的开发指引。RT-Thread 做为一份开源软件,它需要由不同的人采用合作的方式完成,这份文档...
    发表于 09-02 15:30 1492次 阅读

    如何有效地排查内存泄露的疑难问题

    1 写在前面 最近博主在实际的项目开发中,又遇到了有关【内存泄露】的问题。作为C语言开发程序员,可能从接触C语言的那会起,...
    发表于 09-01 14:47 1879次 阅读

    如何对标准sscanf语法与数据进行解析呢

    概述 在C语言应用开发过程中,常常需要对字符串数据进行解析,这些字符串可能是从文件、键盘或者其他设备读入。比如与 AT 设...
    发表于 08-30 14:36 627次 阅读

    嵌入式初级工程师全套学习资料包(第三阶段)

    本期资料分享为linux开发全套学习资料包,整理了嵌入式学习必备资料和工具包,大家可以配合下方的三个学习阶段路线进行学习,希望...
    发表于 08-30 10:53 11753次 阅读
    嵌入式初级工程师全套学习资料包(第三阶段)

    使用DS5连接设置好的armv8模拟器出错怎么办呢

    大家好,使用DS5,我在对自己的一个C语言工程编译之后,试图连接到设置好的arm v8模拟器,出现了如下的问题: 在网上查的的...
    发表于 08-23 14:54 2414次 阅读