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++ 中的区别 的相关文章

  • Unity3D StartCoroutine 调用一个函数,该函数什么时候返回?

    我知道Unity3D StartCoroutine调用了一个与StartCoroutine在同一线程上运行的函数 但是被调用的函数什么时候返回到原始调用者 我在互联网上查找了一个很好的 Unity3D Coroutine 示例 但找不到完整
  • 必须打开存储才能执行此操作 - System.IO.Packaging.Package

    我正在使用 System IO Packaing Package 类来压缩文件 我的应用程序的多个实例可以同时运行 并读取和保存文件 当处理小文件时 一切似乎都很好 但是当涉及大文件时 如果应用程序的两个实例同时保存 我会收到一个异常 消息
  • 检查列表是否包含另一个列表。 C#

    编辑 只是说 ContainsAllItem 中的注释解释得最好 很抱歉问这个问题 我知道以前有人问过这个问题 但我只是不明白 好的 所以我想检查一个列表是否包含另一个列表中的所有项目WITHOUT重叠 以及根据类字符串 名称变量 称为项目
  • 切换图片框可见性 C#

    为什么图片框控件的可见性属性在这里不起作用 我最初将它们设置为 false 以便在屏幕加载时它们不可见 但后来我想切换这个 我已完成以下操作 但似乎不起作用 这是一个 Windows 窗体应用程序 private void Action w
  • Android NDK C++“wstring”支持

    我有用 C 编写的源代码 lib 现在我想在 Android NDK 项目 NDK 6 中编译并使用相同的源代码 lib 我能够编译大多数 C 文件 除了基于 std wstring 的功能 在 Application mk 中 当我指定时
  • 返回 int& 的函数[重复]

    这个问题在这里已经有答案了 我在网上查了一下发现一篇试图解释的文章std move和右值 http thbecker net articles rvalue references section 01 html并发现了一些我实在无法掌握的东
  • 将 C# 反射代码移植到 Metro-Ui

    我正在尝试移植使用反射的现有 C 类 通用工厂 但我无法编译这段代码 Type types Assembly GetAssembly typeof TProduct GetTypes foreach Type type in types i
  • 导出到 CSV 时 Gridview 出现空行

    这个问题是由进一步讨论引发的这个问题 https stackoverflow com questions 6674555 export gridview data into csv file 6674589 noredirect 1 com
  • c# 如何生成锦标赛括号 HTML 表

    所以我已经被这个问题困扰了三个星期 但我一生都无法弄清楚 我想做的是使用表格获得这种输出 演示 http www esl world net masters season6 hanover sc2 playoffs rankings htt
  • 数据损坏 C++ 和 Python 之间的管道

    我正在编写一些代码 从 Python 获取二进制数据 将其通过管道传输到 C 对数据进行一些处理 在本例中计算互信息度量 然后将结果通过管道传输回 Python 在测试时 我发现如果我发送的数据是一组尺寸小于 1500 X 1500 的 2
  • 为什么WCF中不允许方法重载?

    假设这是一个ServiceContract ServiceContract public interface MyService OperationContract int Sum int x int y OperationContract
  • 如何不在类中实现接口的功能?

    面试时面试官问了我以下问题 但我不知道这个问题的答案是什么 请帮忙 如果我不想 我必须做什么 在我的类中实现一个函数 在接口中声明为 由我班实施 Edited 我正在使用 NET 和 C 如果有人可以提供 C 示例代码示例 那就太好了 Th
  • 是什么原因导致 Linq 错误:此方法无法转换为存储表达式?

    我有一堆具有相同 select 语句的 Linq to Entity 方法 所以我想我会很聪明 并将其分离到它自己的方法中以减少冗余 但是当我尝试运行代码时 我得到了以下内容错误 该方法不能转化为 商店表达式 这是我创建的方法 public
  • `cosf`、`sinf` 等不在 `std` 中 [重复]

    这个问题在这里已经有答案了 根据这里的讨论 我有报告了一个错误 https bugs launchpad net ubuntu source gcc 8 bug 1831385给 Ubuntu 开发者 编译以下示例 C 程序时 includ
  • 当在 Repository/UnitOrWork 之上使用 Service 类时,我应该在哪里放置逻辑不适合 Repository 的常用数据访问代码?

    In my 先前的问题 https stackoverflow com questions 24906548 using the generic repository unit of work pattern in large projec
  • 在 SQL Server 上执行分页的最佳方式是什么?

    我有一个数据库超过200万记录 我需要执行分页以在我的 Web 应用程序上显示 该应用程序每页必须有 10 条记录DataGrid 我已经尝试使用ROW NUMBER 但是这种方式会选择所有 200 万条记录 然后只得到 10 条记录 我也
  • 是否有任何不使用公共虚拟方法的正当理由? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 是否有任何不使用公共虚拟方法的正当理由 我在某处读到我们应该避免使用公共虚拟方法 但我想向专家确认这是否是有效的声明 对于良好且稳定的 API
  • 正在获取“未终止 [] 设置”。 C# 中的错误

    我正在 C 中使用以下正则表达式 Regex find new Regex url
  • 在何处将 CFLAG(例如 -std=gnu99)添加到 (Eclipse CDT) 自动工具项目中

    我有一个简单的 Autotools C 项目 不是 C 其框架是由 Eclipse CDT Juno 为我创建的 CFLAG 通过检查 似乎是 g O2 我希望所有生成的 make 文件也具有 std gnu99附加到 CFLAG 因为我使
  • 使用剪贴板 SetText 换行

    如何使用 SetText 方法添加换行符 I tried Clipboard SetText eee n xxxx 但当我将剪贴板数据粘贴到记事本中时 它没有给我预期的结果 预期结果 eee xxxx 我怎样才能做到这一点 Windows

随机推荐

  • 回顾篇-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