const 在C和C++ 中的区别

2023-11-16

​​​​​目录

c中的const

C++中的const

const修饰指针

const修饰引用


  • const是construct的缩写,是c/c++语言中的类型限定符,采用const修饰变量,功能是对变量声明为只读特性,并保护变量值以防被修改。

  • c中的const

    在c语言中,用const定义一个常量的时候,编译器会直接开辟一个内存空间存放该常量,不会进行优化。 并且当我们用一个指针去指向该变量的时候我们是可以对该变量进行修改的

    因此,在C语言中的const是“假常量”,用const修饰一个变量的时候,会为该变量开辟一个空间,我们可以利用一个指针去指向该变量,然后间接修改该空间的值。但c++中却不是这样。

  • C++中的const

    c++中用const定义了一个常量后,不会分配一个空间给它,而是以key-value(键值对)的形式写入符号表(symbol table),这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。

    这个特性令c++中的const修饰变量时类似于宏定义#define

    因此c++中const修饰的变量是“真常量”,而c++中也不允许对一个常量取地址。如果对const修饰的变量取地址,编译器会临时开辟一个栈空间,让这个指针存放这个临时空间的地址。因此通过指针去修改const变量,是修改该临时空间中的值。

  • const修饰指针

    在c++中,const修饰指针变量时,const在代码中位置不同,修饰涵义也不同,分为顶层const和底层const。

    顶层const,表示指针本身是个常量

    底层const,表示指针指的对象是一个常量

  • 引用本质上是一个常量指针,在编译过程中对一个引用操作赋值时会隐藏。

int main()
{
	const int n = 10; // C语言中以变量为主。
	int arr[n] = { 1,2 }; // error;
	int* p = (int*)&n; //
	*p = 100;
	printf("%n = %d *p = %d n", n, *p);
	return 0;
}
int main()
{
	const int n = 10; // C++ 语言中以常量为主。
	int arr[n] = { 1,2,3,4 }; // ok;
	int* p = (int*)&n;
	*p = 100;
	cout << "n = " << n << " *p = " << *p << endl;

    int b = 0;
	int* ip = (int*)&a;
	*ip = 100;//a=10
	b = a;//b=10
	cout << a << b << *ip << endl;//10 10 100
   

	return 0;
}

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

const 在C和C++ 中的区别 的相关文章

  • 将整数四舍五入到最接近的 10 倍数[重复]

    这个问题在这里已经有答案了 我想弄清楚如何对价格进行四舍五入 双向 例如 Round down 43 becomes 40 143 becomes 140 1433 becomes 1430 Round up 43 becomes 50 1
  • 从文本文件中读取所有内容 - C

    我正在尝试从文本文件中读取所有内容 这是我写的代码 include
  • C - '=' 标记之前的预期表达式...在没有 '=' 的行上

    我疯狂地试图找出这个与现实 我的代码没有明显联系的错误消息 我一直在这里搜索并得出一个结论 你会讨厌 typedef 隐藏的指针 抱歉 这超出了我的控制范围 教授以这种方式提供了代码 我正在编辑问题中指定的代码 我弹出完整节点以避免每个推送
  • “上下文模式”的这种实现看起来不错吗? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我有多个处理单元可能存在于一个数组中 每个处理单元都有自己的参数 我想使用以下方式传达每个处理单元的参数上下文模式在它被建议作为另一个问题的解答 ht
  • 使用工作表作为数据源的 VSTO Excel 的简单示例

    我想我遇到了 最简单的答案是最难找到的答案 的情况 而且我还没有遇到过任何搜索能够以直接的方式给我这个答案 这是为了Excel 2010 and VS 2010在现有 VSTO C 项目中 我有一个 Excel 工作表 其中包含 4 列数据
  • C 或 C++ 中是否有轻量级的多部分/表单数据解析器? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在考虑将多部分表单数据解析集成到 Web 服务器模块中 以便可以减轻后端 Web 应用程序 通常用动
  • 一个阻塞但非模态的 QDialog?

    我有一堆图像 我想对其执行一些操作 处理完每个图像后 我的程序应该弹出一个对话框 提示用户是否要继续处理下一个图像或中止 在此之前 他们应该有机会对图像或参数进行一些手动更改 无论如何 他们必须能够访问应用程序的窗口 而调用对话框的方法的执
  • 恢复多个监视器的窗口大小/位置

    许多帖子都涉及恢复 WinForm 位置和大小 例子 www stackoverflow com questions 92540 save and restore form position and size http www stacko
  • 如何找到 QDockWidget 标题栏的高度?

    我正在尝试找到 a 的高度QDockWidget标题栏 以便对自定义布局进行一些智能调整大小 但标题栏不是单独的小部件 它内置于停靠小部件的私有布局中 并且没有成员可以访问它 还有其他方法可以找到它的高度吗 是的 您可以使用以下命令找到标题
  • 自定义文件属性

    我需要遵循 在我的申请中 我有文件 需要随时签入和签出的文件 当我从应用程序中签出文档时 我需要将自定义属性添加到文件中 以便稍后在签入文档时可以识别它 我尝试使用以下代码使用 DSOFile 中的 OleDocumentPropertie
  • 您在 C# 或 .NET 中见过的最奇怪的极端情况是什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 从 WMI 运行 exe 时的网络身份验证

    我有一个 C exe 需要使用 WMI 运行并访问网络共享 但是 当我访问共享时 我收到 UnauthorizedAccessException 如果我直接运行 exe 则可以访问共享 我在这两种情况下都使用相同的用户帐户 我的应用程序有两
  • 串行端口轮询和数据处理

    我正在尝试通过微控制器从传感器的多个串行端口读取数据 每个串口将接收超过2000个测量值 每个测量值7个字节 全部为十六进制 而且他们同时开火 现在我正在从 4 个串行端口进行轮询 另外 我将每个测量值转换为字符串并将其附加到字符串构建器
  • 为什么这些双精度数的返回值为-1.#IND?

    I have double score cvMatchContourTrees CT1 CT2 CV CONTOUR TREES MATCH I1 0 0 cout lt
  • 接口作为类型约束和接口作为参数之间的区别?

    如果我想创建一个采用实例的方法IList作为参数 或任何其他接口 但让我们使用IList作为一个例子 我可以创建一个带有类型约束的通用方法 例如 public static void Foo1
  • 有没有 C# 到 C 的转换工具? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我知道 C 与 NET Framework 不同 C 是一种符合 ECMA ECMA 334 和 ISO
  • C++ 中的 Ofstream 数组

    我想要在我的项目中使用 41 个输出文件来在其上写入文本 首先创建一个字符串数组list为了命名这些输出文件 然后我尝试定义一个 ofstream 对象数组并使用list命名它们 但我收到此错误 outfile cannot be used
  • 如果 foreach 是一个结构数组,它会复制每个元素吗?

    我有一个结构数组 做foreach运算符在迭代数组时复制每个元素 据我所理解foreach只是底层的语法糖转换为for 所以看来答案是否定的 但我很想得到一些确认 PS 看来应该有人已经问过了 但我无法轻易找到任何东西 因此 请以提供的参考
  • C 警告函数调用中缺少标记

    这是我的警告 Missing sentinel in function call 我怎样才能删除它 我正在使用 linux 和 gcc 编译器 看来您可能没有终止数组声明NULL 如果没有 null 您可能会遇到一些内存怪异 因为运行时将不
  • 捕获 System.Exception 总是不好的做法吗?

    请考虑下面的代码 它抛出三个不同的异常 即 System Configuration ConfigurationErrorsException System FormatException and System OverflowExcept

随机推荐

  • 回顾篇-SpringBoot-Tomcat

    为什么写 今天看了Spring实战第五版 里边有句话如下 传统的基于Servlet的Web框架 如Spring MVC 在本质上都是阻塞和多线程的 每个连接都会使用一个线程 在请求处理的时候 会在线程池中拉取一个工作者 worker 线程来
  • Linux下修改密码命令及查看密码修改时间

    Linux下修改密码命令及查看密码修改时间 1 如修改用户liu的密码为123456 在root用户下执行 echo 123456 passwd stdin liu 2 查看密码修改时间 date d 1970 01 01 more etc
  • CloudCompare——计算点云的KD树并可视化

    目录 1 功能概述 2 完整操作 3 算法源码 4 相关代码 1 功能概述 使用Tools gt Sand box research gt compute kd tree访问此工具 该功能可以用于论文写作中的KD树绘图 2 完整操作 3 算
  • 你的小程序

    你的小程序还未设置管理员信息 无法被绑定 你可先访问mp weixin qq com 在 用户身份 页面设置管理员信息后即可进行绑定 解决方法 换一个浏览器 别用火狐 真XXX 但解决放哪就这么简单
  • 如何在Visual Studio给多行代码进行注释和取消注释

    如何在Visual Studio给多行代码进行注释和取消注释 用鼠标选中要注释的代码 先按Ctr K 键 再按 Ctrl C 键进行注释多行代码 如果要取消注释 用鼠标选中被注释的代码 先按Ctrl K 再按 Ctrl U 即可取消注释
  • 中文OCR识别

    在闲暇时刻做了一个中文识别能力的工程 工程主要对中文文字进行识别 当前工程没有检测文本能力 后续会加入 文本字段在32000验证集合上准确率为83 2 可识别中文字符5990 由于没有时间做太多优化 可能对于相近字体的准确率并不太高 但是可
  • 拿来即用的 Python SSH+SFTP 实现类

    一个拿来即用的 Python SSH 和 SFTP 实现类 可用于 与 Linux 服务器建立持续交互的 SSH 会话 从 Linux 服务器下载远程文件 上传本地文件到 Linux 服务器 新创建一个 linux client py 文件
  • Vue.js中的v-model指令(双向绑定)

    Vue js中v model的作用 v model的作用和使用场景 1 v model的作用 双向绑定 2 v model双向绑定的使用场景 表单 3 总结 v model的作用和使用场景 你好 Vue js作为现在最为常用的前端框架之一
  • UI自动化测试通过飞书发送告警信息

    1 发送纯文本消息 1 1代码如下 usr bin env python coding utf 8 import json import requests url https open feishu cn open apis bot v2
  • Matting(抠图)--用深度学习自动去除照片背景

    转自 https zhuanlan zhihu com p 38031181 https zhuanlan zhihu com p 151212267 现在又有一个 AI 能干 Photoshop 的活了 自动抠图 一键去除照片背景 这款
  • AD如何画多图纸原理图

    很多东西都讲究模块化 比如 程序模块化 原理图也不例外 模块化后的原理图更能直观的显示其原理 文章中操作的图标是什么功能可以先看下参考文献中的博客在来看看我的这篇博客 效果会更好 原本以为原理图多图纸很难 其实也差不多 只是多了几步罢了 多
  • getClassLoader()返回null,getClassLoader()获取为空

    一 问题描述 通过getClassLoader 的方式获取jar包中的资源 为空 this getClassLoader getResources com xxxx test Start class hasMoreElements this
  • gin context和官方context_go-gin框架入门

    gin入门 介绍 gin是一个golang的微框架 封装比较优雅 api友好 源码注释比较明确 具有快速灵活 容错方便等特点 对于golang而言 web框架的依赖要比python java之类的要小的多 完全使用自身net http包封装
  • 课时 10 自测题

    使用存储快照功能需要用到哪些 Kubernetes API 资源对象 多选题 A VolumeSnapshot B VolumeSnapshotClass C VolumeSnapshotContent D PersistentVolume
  • C++学习 十、函数重载,函数模板

    C 学习 十 函数重载 函数模板 前言 函数重载 二义性 强制类型转换 类型与类型引用 默认参数 const指针参数和const引用参数 函数模板 模板函数声明与定义 函数模板重载 显式实例化 显式具体化 重载解析 引导编译器使用函数模板
  • Box layout

    Layout management with layout classes is much more flexible and practical It is the preferred way to place widgets on a
  • Vue3+TypeScript 完整项目上手教程

    转自 Vue3拥抱TypeScript的正确姿势 https juejin im post 6875713523968802829 一个完整的Vue3 Ts项目 支持 vue和 tsx写法 项目地址 https github com vin
  • Tomcat的安装与环境变量配置(图文详解)

    Tomcat的安装与环境变量配置 首先说明一下我的电脑配置 Windows 7 专业版 64位操作系统 安装内存8G 四核处理器 一 Tomcat的下载与安装 1 进入Tomcat官网 https tomcat apache org 2 在
  • soap错误码和获取处理错误码的详细信息

    gsoap页面 https www genivia com doc guide html index html soap客户端用户登录返回值错误代码表 ERROR CODE SOAP EOF 1 Unexpected end of file
  • const 在C和C++ 中的区别

    目录 c中的const C 中的const const修饰指针 const修饰引用 const是construct的缩写 是c c 语言中的类型限定符 采用const修饰变量 功能是对变量声明为只读特性 并保护变量值以防被修改 c中的con