const的一些用法和理解

2023-10-27

首先先说一下const常量的用处,我们知道宏定义#define是没有数据类型的,编译器在编译的时候,不会对宏常量进行类型检查,只进行简单的字符串替换,字符串替换时极易产生意想不到的错误,所以这个时候,我们用需要用到某种声明了数据类型的常量,即const常量
在声明语句中,只要将const类型修饰符放在类型名之前,即可将类型名后的标识符声明为具有该类型的const常量。由于编译器将其放在只读存储区,不允许在程序中改变其值,因此const常量只能在定义时赋初值,例如:const
double PI =3.1415926;(《C语言程序设计(第3版)》)

如果在编程中确实有某个值保持不变,就应该明确使用const,这样可以获得编译器的帮助。

1.const修饰变量

我们首先看下面一道题目:
下面哪两个是等同的:

int b;
const int *a = &b;      //1
const * int a = &b;      //2
const int* const a = &b;   //3
int const* const a = &b;     //4

答案是3、4,为什么呢?我们依次来看:
第一个:a是指针,指向int,这个int是静态的,这个const修饰的是int
第二个:语法错误,是不存在这种写法的
第三个:a是静态指针(第二个const修饰),指向int,这个int是静态的(第一个const修饰)
第四个:a是静态指针(第二个const修饰),指向一个静态的变量(第一个const修饰,这个变量是int的)
所以3、4是相等的。
const修饰变量时:
(1)只有一个const,如果const位于*左侧,表示指针所值数据是常量,不能通过解引用修改该数据;指针本身是变量,可以指向其他的内存地址。
(2)只有一个const,如果const位于*右侧,表示指针本事是常量,不能指向其他内存地址;指针所值的数据可以通过解引用修改。
(3)两个const,*左右各一个,表示指针和指针所指数据都不能修改。

2.const修饰函数参数

传递过来的参数在函数内也是不可以改变的,例如:

void fun(const int a){
    a = 1;   //编译出错
}

3.const修饰函数返回值

3.1 指针传递

如果返回值为const数据类型,未const的指针,返回值也必须一样。因为指针指向的数据是不能修改的,通过这段代码来看一看:

#include<stdio.h>

const int *fun(){
    int b=2;
    int *a=&b;

    return a;
}

int main()
{
    const int *a=fun();
    //int *a=fun();      //编译错误
    printf("%d\n",*a);

    return 0;
}

3.2 按值传递

如果函数返回值采用“值传递的方式”,由于在此过程中会产生一个副本,所以加const是没有任何意义的,因此,对于值传递来说,加const没有太多意义。
例如:
不要写类似const int fun()的函数,这样写,还不如不加const。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

const的一些用法和理解 的相关文章

  • CRC校验流程

    通常我们在涉及到传输指令或者命令行的时候 为了保证数据传输的正确性和准确性 会涉及到校验码的问题 而我们通常会采用CRC校验 CRC是比较常用的对命令行和指令行的校验方法 一般会放在指令的后面 用以核对数据的正确性 其实如果是比较简单的指令
  • #if...#endif的用法总结参考

    if endif的用法总结 if endif是C 种的条件编译预处理命令 有两种格式 1 ifdef 标示符 程序段1 else 程序段2 endif 表示 如果标示符已经被 define命令定义过 则编译程序段1 否则编译程序段2 2 i
  • 【C语言】 getchar()与EOF的疑难杂症

    C语言程序设计 大师写的书本 需要字斟句酌 在接触到getchar 和EOF 文件结束符 感觉到疑惑 特此记录下来 一 getchar 总结如下 1 getchar是以行为单位进行存取的 当调用getchar函数读取输入时 只有当输入字符为
  • 各种基类型的最值

    C头文件limits h和float h分别提供了浮点型和整型的一些数值限制详细信息 常量符号 含义 CHAR BIT char类型位数 CHAR MAX char类型最大值 CHAR MIN char类型最小值 SCHAR MAX 有符号
  • C语言渔夫打鱼晒网问题

    如果一个渔夫从 2011 年 1 月 1 日开始每三天打一次渔 两天晒一次网 编程实现当输入 2011 1 月 1 日以后的任意一天 输出该渔夫是在打渔还是在晒网 include
  • 【模拟】Redraiment的遭遇

    描述 Redraiment的老家住在工业区 日耗电量非常大 是政府的眼中钉肉中刺 但又没办法 这里头住的可都是纳税大户呀 今年7月 又传来了不幸的消息 政府要在7 8月对该区进行拉闸限电 但迫于压力 限电制度规则不会太抠门 政府决定从7月1
  • C语言学习-开发工具VS2022的选择与使用

    1 选择VS2022的理由 下载安装即可使用 无需复杂的环境配置等操作 适合初学者 2 使用过程中的遇到的问题 2 1在使用scanf函数时发生如下错误 2 2解决办法有两个 lt 1 gt 方法一 在源代码第一行添加 define CRT
  • Linux下 C语言实现消息队列

    消息队列 Unix的通信机制之一 可以理解为是一个存放消息 数据 容器 将消息写入消息队列 然后再从消息队列中取消息 一般来说是先进先出的顺序 可以解决两个进程的读写速度不同 处理数据速度不同 系统耦合等问题 而且消息队列里的消息哪怕进程崩
  • giaogiao教你用c语言在屏幕上打印各种图案

    今天我们用c语言来实现在屏幕上打印用 组成的图案 首先呢 我们从简单的开始 输出自定义行数的矩形 我定义了三个变量 用for循环做了一个嵌套 用n来限制i j 从而控制输出图案的大小 搞定 你看我屌么 哈哈哈哈 这只是开始 我试试来输出自定
  • 用一个数组实现两个栈(共享栈)

    共享栈 一个数组实现两个栈 第一个栈是开头 第二个栈是结尾 用c语言实现 很简单 两个指针一个数组就够了 上代码 define CRT SECURE NO WARNINGS 1 include
  • C++实现行列式的相关操作

    目录 一 前言 二 行列式运算操作集 1 概览 2 行列式的定义 3 行列式的输出与输入 4 行列式行与行 列与列的相加 5 行列式的行交换与列交换 6 行列式的行提取公因数与列提取公因数 7 行列式系数清零恢复 8 判断一个行列式是否是三
  • C语言问题:0xC0000005: 写入位置 0xFFFFFFCC 时发生访问冲突。

    最近系统地开始学习C语言 在使用VS2019中用scanf s为一串字符串赋值时 发生了错误 错误如下 0x7837EF8C ucrtbased dll 处 位于 Project2 exe 中 引发的异常 0xC0000005 写入位置 0
  • C语言中关键字const、static、volatile的用法分析

    1 const 作为一个程序员 我们看到关键字const时 首先想到的应该是 只读 因为 它要求其所修饰的对象为常量 不可对其修改和二次赋值操作 不能作为左值出现 看几个例子 const int a 同上面的代码行是等价的 都表示一个常整形
  • 打印数字三角及蛇形矩阵(C语言)

    题目描述 从键盘输入N 输出如下图所示的N行的数字三角 例如 N 5 那么输出如下 输入格式 输入一个整数N 1 lt N lt 45 输出格式 输出如题所示的数字三角形 为了输出美观 每个数字栈5个字符位 右对齐 即 5d 解题的思路 1
  • 求字符串长度的三种方法(C语言)

    如何求字符串的长度 首先要明白字符串存储的原理 字符串存储时 是以 0 结尾 这个就可以作为判断字符串结尾的一个条件 接下来 只要有字符串的首元素地址 就可以解决求字符串长度的问题啦 第一种 普通版 int my strlen char s
  • C语言排序算法实现

    C语言实现各种排序算法 冒泡排序 选择排序 插入排序 希尔排序 插入方式 非交换方式 快速排序 归并排序 分治思想 基数排序 桶排序 基数排序的基本思想 典型的空间换时间方式 冒泡排序 include
  • 数据结构双链表之(三)按值插入&&寻找&&求长度

    文章目录 1 思路 1 1 按值插入 1 2 寻找 1 3 求长度 2 代码 2 1 DList h 2 2 DList cpp 2 3 main cpp 3 结果 3 1 按值插入 3 2 寻找 3 3 求长度 1 思路 1 1 按值插入
  • 9-3用结构体定义学生,用函数输出学生成绩

    include
  • 6-3 求3*3整数矩阵对角线元素之和

    include
  • 8-2比较三个字符串大小(指针)

    include

随机推荐

  • 目标检测入门概念知识

    一个常见的目标检测网络 其本身往往可以分为一下三大块 Backbone network 即主干网络 目标检测网络的主体结构 是目标检测网络最为核心的部分 大多数时候 backbone选择的好坏 对检测性能影响是十分巨大的 代表网络有 VGG
  • ORB_SLAM2特征匹配

    ORB SLAM2特征匹配 SearchByProjection 使用于运动模型跟踪 函数原型 函数简介 知识难点 由两帧绝对位姿推出两帧相对位姿 前进与后退对搜索范围的影响 描述子的比较 方向一致性检测 运用于局部地图跟踪 函数原型 函数
  • 注解处理器APT在java中的实现

    概念理解 APT 英文全名 Annotation Processor Tool 即 注解处理器 它是 javac 的一个工具 这是Sun为了帮助注解的处理过程而提供的工具 apt被设计为操作Java源文件 而不是编译后的类 作用阶段示意图如
  • 正则表达式使用文档

    通过网站 https regex101 com 可以测试正则表达式的匹配结果及匹配过程 本文章抛开各个编程语言实现差异 仅做正则本身的介绍 会尽量将正则这玩意说明白 使得你看完这边文章后对正则基本可以运用自如 温馨提示 这篇文章会比较长 大
  • Nginx php 错误日志排查

    遇到错误 通常解决流程如下 比如一个php存储服务器的文件上传问题 px ef grep php fpm 查看fpm 是否启动 查看 fpm 运行用户以及权限 发现运行用户为 nobody 组 nobody 文件写入权限为 root cho
  • logPath_IS_UNDEFINED

    logPath IS UNDEFINED 解决Springboot项目启动的时候日志文件找不到路径新建文件夹的问题 网上也有很多案例 大部分都是路径没正确引入 或者引入springCloud依赖 在bootstrap yml配置 今天自己摸
  • 移动web开发基础

    目录 移动web开发 浏览器现状 PC 端常见浏览器 移动端常用浏览器 手机屏幕现状 常用移动端屏幕尺寸 移动端调用方式 总结 视口 1 布局视口 layout viewport 2 视觉视口 visual viewport 3 理想视口
  • C51语句概念

    C51语句概念 单分支语句 表达语句 if 表达式 分支一 else 分支二 表达语句 if 表达式 语句 include
  • mybatis怎么实现 FULL JOIN?

    问题 今天写查询的时候 遇到了一个难题 两个查询出来的表 可能左边的表里有这个类型的数据 右表里面没有 但是我也要把它查出来 右表有的 左表没有的也要显示出来 经过我的一番探索 找了 FULL JOIN 全连接 sql中很简单 有关键字 但
  • 靶场练习之Lampiao

    一 环境搭建 lampiao靶场下载地址 Lampi o 1 VulnHub 使用vm打开 配置kali和靶场在同一个网络 建议都为net连接 二 信息收集 1 nmap扫描 使用nmap扫描整个网段 找到靶机的ip地址 nmap sS P
  • 释伴:Linux 上的 Shebang 符号(#!)

    使用类Unix系统的同学可能都对 这个符号并不陌生 但是你真的了解它吗 这个符号的名称 叫做 Shebang 或者 Sha bang 长期以来 Shebang都没有正式的中文名称 Linux中国翻译组的GOLinux将其翻译为 释伴 即 解
  • LinearLayout.LayoutParams动态设置子控件属性

    LayoutParams相当于一个Layout的信息包 它封装了Layout的位置 高 宽等信息 假设在屏幕上一块区域是由一个Layout占领的 如果将一个View添加到一个Layout中 最好告诉Layout用户期望的布局方式 也就是将一
  • JAVA常量、变量和基本数据类型

    常量 常量 是指在Java程序中固定不变的数据 常量的分类 类别 含义 举例 整数常量 所有的整数 1 0 1 100 1000 浮点数常量 所有的小数 0 1 1 5 6 8 1 2 字符常量 单引号引起来 只能写一个字符 必须有内容 A
  • 西门子PLC用TIA博途SCL语言写的一个产生随机实数的指令块(学习1)

    这是西门子的一个功能FC 我们可以用它来学习SCL语言 也可以用来分析和学习怎样做一个比较合理且完整的功能FC 1 在设计该功能时 先确定好 它的具体功能 比如 此例的功能是获取一个随机实数 该随机实数是可以定义在自己想要的数值范围内的 还
  • Redis的数据类型

    Redis的数据类型 redis支持五种数据类型 string 字符串 hash 哈希 list 列表 set 集合 及zset sorted set 有序集合 String 字符串 是key value 方式 可以包含任何数据 包括图片或
  • Echart提示框组件tooltip的formatter属性中params的值

    Echart提示框组件tooltip的formatter属性中params的值 其中params的值就是seriesData的值 function test var seriesData 数据封装 var ret tooltip forma
  • springboot 配置templates并放行swagger页面

    import org springframework context annotation Configuration import org springframework web servlet config annotation Res
  • R语言入门——笔记(三)创建数据集

    第一部分 数据结构 1 创建向量 c c recursive FALSE use names TRUE 根据元素坐标访问 2 创建矩阵 matrix matrix data NA nrow 1 ncol 1 byrow FALSE dimn
  • 使用GCC编译STM32工程

    一 STM32在linux环境编译 STM32等arm芯片的工程编译环境比较多 类似于keil IAR等成熟的MDK集成环境被大部分开发者所使用的 但是如果要在linux在开发 或者使用的芯片不是stm32芯片 需要自己搭建编译环境 本文将
  • const的一些用法和理解

    首先先说一下const常量的用处 我们知道宏定义 define是没有数据类型的 编译器在编译的时候 不会对宏常量进行类型检查 只进行简单的字符串替换 字符串替换时极易产生意想不到的错误 所以这个时候 我们用需要用到某种声明了数据类型的常量