C语言-const关键字

news2025/5/24 3:53:58

1.const 关键字

       const 是 constant 的缩写,const 在实际编程中用得比较多,意思是“恒定不变的”,它是定义只读变量的关键字,或者说 const 是定义常变量的关键字。 (可读,不可写)

       const 可以修饰变量,数组,指针等: 说 onst 定义的是变量,但又相当于常量;说它定义的是常量,但又有变量的属性,所以叫常变量。用 const 定义常变量的方法很简单,就在通常定义变量时前面加 const 即可,如:
                       const int a=10;
const 和变量类型 int 可以互换位置,二者是等价的,即上条语句等价于

                        int const a = 10:
那么用 const 修饰后和未修饰前有什么区别呢? 用 const 定义的变量的值是不允许改变的,即不允许给它重新赋值,即使是赋相同的值也不可以。所以说它定义的是只读变量。这也就意味着必须在定义的时候就给它赋初值。无论是全局常变量还是局部常变量都必须初始化赋值

         const在c语言中,最主要就是不修改值的函数,指针形参前加const 

int main()
{
	int a = 10;
	int b = 20;
	const int ca = 10;//不能改
	int *p = &a;
	p = &b;
	//p = &ca;//error  假如合法  ,*p = 100;->ca=100
	const int *p2 = &ca;//ok
	//*p2 = 20;//error
	//int *const p3 = &ca;//error
	const int *p4 = &a;
	int *const p5 = &a;
	//p = p2;//error
	return 0;
}

 

 

const 修饰变量和数组:

//const 规则1
int main()
{
	int a = 10;//可读,可写
	printf("%d\n",a);//读
	a = 100;//写
	const int ca = 10;//常变量,只读
	printf("%d\n",ca);//读
	a = ca;//ca读
	//ca = 100;//error
	int const cb = 10;//完全等同ca
	//cb = 20;//error

	return 0;
}
//const 规则2
int main()
{
	int a = 10;
	int b = 20;
	int *p = &a;
	p = &b;//p,写
	*p = 100;//*p,写
	const int *cp1 = &a;
	//*cp1 = 100;//error
	cp1 = &b;//ok
	
	int const *cp2 = &a;//等同cp1(规则1)
	//*cp2 = 100;//error
	cp2 = &b;//ok

	int *const cp3 = &a;
	*cp3 = 100;//ok
	//cp3 = &b;//error
	
	const int *const cp4 = &a;//不使用
	//*cp4 = 100//error
	//cp4 = &b;//error
	
	 //a + b;

	return 0;
}

const修饰的数据类型是指常类型,常类型的变量或对象的值是不能被更新的。
const 推出的初始目的,正是为了取代预编译指令,消除它的缺点,同时继承它的优点。

2.const与指针配合使用的作用

const修饰指针变量的时候:
1、const如果在 * 的左边,修饰的是指针指向的内容,保证指针指向的内容不能通过指针来改变。但是指针变量本身的内容是可变的。
2、const如果放在 * 的右边,修饰的是指针变量本身,保证了指针变量的内容不能修改,但是指针指向的内容,可以通过指针改变。
   限制指针变量 ;限制指针变量指向的数据; 既要限制指针变量又限制指针变量指向的数据(双重限定)

1)限制指针变量本身
   如: int * const p;
    限制指针变量本身的意思是,指针变量本身的值不能被修改,但指向可以改变。所以被 const 修饰的指针变量指针只能在定义时初始化,不能定义之后再赋值,代码如下:

 

 2) 限制指针变量指向的数据

   如: const int *ip;
           int const *ip;
       上面两种写法都可以,一般使用第二种,限制指针变量指向的数据的意思就是指针可以指向不同的变量(指针本身的值可以修改),但是不能用指针修改指针指向的数据的值,代码如下:

 

 3)限制指针变量和指针变量指向的数据的值

     如: const int * const ip;
上面这种写法使指针变量和指针变量指向数据的值都不能修改, 代码如下:

 

3.const 与 define 的区别

从功能上说它们确实很像,但它们又有明显的不同:
1.#define 是预编译指令,而 const 是普通变量的定义,#define 定义的宏是在预处理阶段展开的,而 const 定义的只读变量是在编译运行阶段使用的。
2.const定义的是变量,而 define定义的是常量。define定义的宏在编译后就不存在了,它不占用内存,因为它不是变量系统只会给变量分配内存。但 const 定义的常变量本质上仍然是一个变量,具有变量的基本属性,有类型、占用存储单元。可以说,常变量是有名字的不变量,而常量是没有名字的。有名字就便于在程序中被引用,所以从使用的角度看,除了不能作为数组的长度,用 const 定义的常变量具有宏的优点,而且使用更方便,所以编程时在使用 const和 define都可以的情况下尽量使用常变量来取代宏。
3.const定义的是变量,而宏定义的是常量,所以const 定义的对象有数据类型,而宏定义的对象没有数据类型。所以编译器可以对前者进行类型安全检查,而对后者只是机械地进行字符替换,没有类型安全检查。这样就很容易出问题,即"边际问题”或者说是“括号问题"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/608462.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

光明区马田大围城市更新旧改项目--华润集团

【华润光明马田大围旧改一期项目基础信息】 项目开发商:华润集团 占 地 面 积:约110151㎡ 建 筑 面 积:待专规图 物 业 类 型:华润一期范围内的待拆迁物业 项 目 进 度:直接确权阶段,即将立项 【项目现…

c++ new 源码学习一下

之前有一篇文章介绍了 new 的一些用法 c new 在指定内存上创建对象&#xff0c;今天结合源码来学习一下 new 更详细的用法。相关的源码&#xff1a;gcc git 1&#xff0c;void* operator new (std::size_t size); 我们可以在头文件<new>里看到它的原型&#xff1a; _G…

J2EE 技术的企业人事管理系统的设计与实现(论文+源码)_kaic

目 录 一、引 言 二、相关技术概述 (一) 基于 MVC 设计模式的 J2EE 技术 (二) MySql 数据库管理系统 (三) 基于 B/S 结构的系统安全 三、企业人事管理系统总体设计 (一) 系统需求分析 1.功能结构分解 2.员工档案管理模块 3.员工工资管理模块 (二) 系统总体结构设计 四、企业人…

2023-06-03 陕西省技能大赛 crypto 复现

文章目录 奇怪的sar题目描述&#xff1a;题目分析&#xff1a; Ham3题目描述&#xff1a;题目分析&#xff1a; BigDataEnc题目描述&#xff1a;题目分析&#xff1a; 奇怪的sar 题目描述&#xff1a; from Crypto.Util.number import *key flag{**********}bits 1024 msg …

ESP32+U8G2库显示中文

这里写自定义目录标题 在使用esp32u8g2oled进行中文先显示例程 废话不说&#xff0c;直接上代码 #include <Arduino.h> #include <U8g2lib.h> //软件SPI U8G2_SSD1306_128X64_NONAME_F_4W_SW_SPI u8g2(U8G2_R0, /* clock/ 14, / data/ 13, / cs/ 15, / dc/ 7, / r…

【AI绘图】三、stable diffussion操作界面介绍以及如何使用

上一篇&#xff1a;【AI绘图】二、stable diffusion环境准备与安装 stable diffusion操作界面介绍 操作界面总共分为5大块 1.模型选择区&#xff1b;点击跳转 2.功能区域&#xff1b;点击跳转 3.提示词输入&#xff1b;点击跳转 4.参数设置区&#xff1b;点击跳转 5.出图区点击…

计算机基础--->操作系统(1)

文章目录 简单说说操作系统操作系统的主要功能用户态和内核态为什么要有用户态和内核态&#xff1f;只有一个内核态不行吗&#xff1f;用户态和内核态是如何切换的系统调用系统调用过程 简单说说操作系统 操作系统是一种系统软件&#xff0c;它管理计算机硬件资源和提供服务给应…

Jenkins+Docker+SpringCloud微服务持续集成之集群部署

一、集群部署流程说明 环境配置 #环境配置 hostnamectl set-hostname web2-server && su systemctl stop firewalld systemctl disable firewalldvim /etc/selinux/config SELINUXdisabledvim /etc/resolv.conf nameserver 114.114.114.114#安装依赖包 yum install -y…

如何通过python写接口自动化脚本对一个需要调用第三方支付的报名流程进行测试?

对于需要调用第三方支付的报名流程进行接口自动化测试&#xff0c;可以通过以下步骤来编写Python代码&#xff1a; 如果你想学习自动化测试&#xff0c;我这边给你推荐一套视频&#xff0c;这个视频可以说是B站百万播放全网第一的自动化测试教程&#xff0c;同时在线人数到达1…

微信小程序开发实战 ②③(全局数据共享)

作者 : SYFStrive 博客首页 : HomePage &#x1f4dc;&#xff1a; 微信小程序 &#x1f4cc;&#xff1a;个人社区&#xff08;欢迎大佬们加入&#xff09; &#x1f449;&#xff1a;社区链接&#x1f517; &#x1f4cc;&#xff1a;觉得文章不错可以点点关注 &#x1f4…

Nginx:Nginx网站服务(一)

Nginx&#xff1a;Nginx网站服务 一、编译安装Nginx服务1.1 关闭防火墙&#xff0c;将安装nginx所需软件包传到/opt目录下1.2 安装依赖包1.3 创建运行用户、组&#xff08;Nginx 服务程序默认以 nobody 身份运行&#xff0c;建议为其创建专门的用户账号&#xff0c;以便更准确地…

【全面突击数据结构与算法001】绪论篇,数据结构的基本概念

&#x1f341;前言 &#x1f451;作者主页&#xff1a;&#x1f449;CSDN丨博客园 &#x1f3c6;学习交流&#xff1a;&#x1f449;在下周周ovoの社区 &#x1f48e;全面突击数据结构与算法系列专栏&#xff1a;&#x1f449;数据结构与算法专栏 PS&#xff1a;本篇文章主要综…

【架构基础】简单设计原则

简单设计来源于极限编程&#xff08;ExtremeProgramming&#xff0c;简称XP&#xff09;。XP是由KentBeck在1996年提出的&#xff0c;是一种软件工程方法学&#xff0c;是敏捷软件开发中最富有成效的几种方法学之一。XP存在四个核心实践&#xff1a;TDD&#xff08;Test-Driven…

Lecture 6 Sequence Tagging: Hidden Markov Models

目录 Problems with POS Tagging 词性标注的问题Probabilistic Model of HMM HMM的概率模型Two Assumptions of HMM HMM的两个假设Training HMM 训练HMMMaking Predictions using HMM (Decoding) 使用HMM进行预测&#xff08;解码&#xff09;Viterbi AlgorithmHMMs in Practic…

地震勘探基础(五)之地震资料数字处理

地震资料数字处理 地震勘探主要包括地震资料野外采集&#xff0c;地震资料数字处理和地震资料地质解释三大部分。其中地震资料数字处理需要利用高性能的超级计算机和先进的处理软件系统。地震资料的质量和成像精度直接决定了油、气勘探的成功率。 地震资料数字处理的主要目的…

快速解读GC日志

本文介绍GC日志的输出格式, 以及如何解读GC日志, 从中提取有用的信息。我们通过 -XX:UseSerialGC 选项,指定JVM使用串行垃圾收集器, 并使用下面的启动参数让 JVM 打印出详细的GC日志: -XX:PrintGCDetails -XX:PrintGCDateStamps -XX:PrintGCTimeStamps 这样配置以后&#xff…

postgreSQL/kingbase limit分页查询,结果乱序

postgres/kingbase limit分页查询&#xff0c;结果乱序 现象排查总结解决办法1.session中关闭synchronize_seqscans2.查询时带上order by 现象 我使用kingbase8&#xff0c;使用select * from xx limit 0,1000 每次查出来的结果都不一样。 排查 1.由于kingbase的文档较少&am…

Zinx框架学习 - 读写协程分离

Zinx - V0.7 读写协程分离 之前connection使用StartReader对客户端的数据接下来我们就要对Zinx做⼀个⼩⼩的改变&#xff0c;就是与客户端进修数据交互的Gouroutine由⼀个变成两个&#xff0c;⼀个专⻔负责从客户端读取数据&#xff0c;⼀个专⻔负责向客户端写数据。这么设计有…

Vue3 | Element Plus resetFields不生效

Vue3 | Element Plus resetFields不生效 1. 简介 先打开创建对话框没有问题&#xff0c;但只要先打开编辑对话框&#xff0c;后续在打开对话框就会有默认值&#xff0c;还无法使用resetFields()重置。 下面是用来复现问题的示例代码和示例GIF。 <script setup> import…

javascript基础二十一:说说你对BOM的理解,常见的BOM对象你了解哪些?

一、是什么 BOM (Browser Object Model)&#xff0c;浏览器对象模型&#xff0c;提供了独立于内容与浏览器窗口进行交互的对象 其作用就是跟浏览器做一些交互效果,比如如何进行页面的后退&#xff0c;前进&#xff0c;刷新&#xff0c;浏览器的窗口发生变化&#xff0c;滚动条…