const

2023-05-16

const是一个限定符,被const限定的变量其值不会被改变。

目录

1、修饰变量

2、修饰指针

3、修饰引用

4、修饰成员函数

5、宏定义 #define 和 const 常量


1、修饰变量

指向的变量的值不可改变,次数说的不可改变只是不能通过变量本身去改变,如果我们通过指针,还是可以去实现改变的。

在C中,可以通过指针去改变一个const修饰的局部变量的值,注意我加粗的部分,如果是const修饰的全局变量,则无法通过指针去改变。这是因为:

const修饰的全局变量被放在了只读数据区,不能修改,

而const修饰的局部变量存放在栈区,可以修改。

具体案例

修改的局部变量

//C中,使用指针修改const修改的局部变量
#include<stdio.h>

int main()
{
	const int a = 1;
  int * p = (int *)&a;
  //尝试改变其所指向的值
  *p = 3;
  printf("P指向的值是%d\n",*p);


	return 0;
}

修改成功 

 修改全局变量

//C中,使用指针修改const修改的全局变量
#include<stdio.h>

const int a = 1;
int main()
{
  int * p = (int *)&a;
  //尝试改变其所指向的值
  *p = 3;
  printf("P指向的值是%d\n",*p);


	return 0;
}

 修改失败

此外,这块东西在C和C++编译器下还有些不同,从前面的测试结果来看,在C中是可以通过指针去修改一个const修饰的局部变量的值的,但是这在C++中却又是不行的,在C++中变量求值的地方直接替换为立即数,因此不能修改。

#include<iostream>
using namespace std;

int main()
{
  const int a = 1;
  int * p = (int *)&a;
  *p = 3;
  printf("a变量的值是%d\n", a );

  return 0;
}

2、修饰指针

const修饰指针创建了一个指针常量,但是const的位置会导致这个指针常量有不同的含义。 

分为指向常量的指针(pointer to const)和自身是常量的指针(常量指针,const pointer);

(1)指向常量的指针,限定其指向的值。指针的指向可以改变,但是指针所指向的变量的值不可改变。

尝试改变指向

#include<stdio.h>

int main()
{
	int a = 1,b = 2;
	const int * p = &a;	//const修饰的是int *,限定的是指向的值
  //p的指向还是可以变的
  p = &b;
  printf("P指向的值是%d\n",*p);


	return 0;
}

result

尝试改变指向变量的值 

#include<stdio.h>

int main()
{
	int a = 1,b = 2;
	const int * p = &a;	//const修饰的是int *,限定的是指向的值
  //尝试改变其所指向的值
  *p = 3;
  printf("P指向的值是%d\n",*p);


	return 0;
}

result

(2)自身是常量的指针,限定其指向。指针的指向不可改变,指针所指向的变量的值可以改变。

尝试改变其指向

#include<stdio.h>

int main()
{
	int a = 1,b = 2;
  int * const p = &a;	//const修饰的是p,限定的是其指向
  //尝试改变其指向
  p = &b;
  
  printf("P指向的值是%d\n",*p);


	return 0;
}

result

尝试改变指向变量的值 

#include<stdio.h>

int main()
{
	int a = 1,b = 2;
  int * const p = &a;	//const修饰的是p,限定的是其指向
  //尝试改变其指向的变量的值
  *p = 3;
  
  printf("P指向的值是%d\n",*p);


	return 0;
}

result

3、修饰引用

const是修饰一个变量为常量,引用是对一个变量取别名(注意引用在初始化时必须和对应变量相关联),通过改变其引用来改变其原变量,二者一结合,用const修饰引用。

此时,不能通过引用修改原始值,若要修改只能通过直接修改原变量的方式修改。

#include<iostream>
using namespace std;

void func(const int & a)
{
  a = a + 1;//尝试去修改
}

int main()
{
  int x = 1;
  func(x);
  return 0;
}

result 

只能通过更改原始变量改变其值 

#include<iostream>
using namespace std;

void func(const int & a)
{
  cout<<"引用的值是"<<a<<endl;
}

int main()
{
  int x = 1;
  func(x);
  x = x + 1;
  cout<<"改变原始值后是"<<x<<endl;
  return 0;
}

result 

修饰指针,const既可以限定其变量的值,也可以限定指针的指向

修饰引用,const只能限定其变量的值,并且只是限定引用取别名的那个量

这是因为引用只是对象的别名,引用不是对象,不能用 const 修饰

另外,在const修饰的引用中,如果引用类型与初始化变量类型不一致,会生成临时变量,修改变量不会修改引用的临时变量的值

4、修饰成员函数

使用的时候放在函数末尾

将const修饰的类成员函数称之为const成员函数。const修饰类成员函数,实际修饰该成员函数隐含的 this 指针,这表明在该成员函数中不能对类的任何成员进行修改。

#include<iostream>
using namespace std;

class A
{
  public:
    void test(void) const;
  private:
    int a;
};
void A::test(void) const
{
  a++;
  cout<<"a的值是:"<<a<<endl;
}

int main()
{
  A a;
  a.test();
  return 0;
}

result 

5、宏定义 #define 和 const 常量

宏定义#defineconst常量
相当于字符替换常量声明
预处理器处理编译器处理
无类型安全检查有类型安全检查
不分配内存分配内存
存储在代码段存储在数据段

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

const 的相关文章

  • JS中的const、var和let的区别

    看项目的时候遇到了const和let不知道什么意思 xff0c 特写此博客给记忆力不好的我 1 const定义的变量不可以修改 xff0c 而且补习初始化 xff08 相当于java中的常量 xff09 const a 61 2 正确 a
  • c# 常量(const) 使用的注意事项

    在我们编码的过程 xff0c const 是我们经常用到的一种声明类型 xff0c 如果不了解const的运行机制 xff0c 有时候会发生一些莫名其妙的bug 可能让我们掉入深坑中 接下来我们一起看看常量的应用吧 xff01 1 常量默认
  • C#中如何实现C++中的const reference

    C 中如何实现C 43 43 中的const reference 在读C in depth时 xff0c 作者曾经感慨过 xff0c 可惜C 中没有类似于C 43 43 的const机制 xff0c 没有办法方便的返回一个对象的只读视图 读
  • Visual Studio解决const char *与LPCWSTR 不兼容

    项目 gt 属性 gt 配置属性 gt 高级 xff0c 将字符集改为未设置
  • #define和const的区别

    这个区别用从几个角度来说 xff1a 角度1 xff1a 就定义常量说的话 xff1a const 定义的常数是变量 也带类型 xff0c define 定义的只是个常数 不带类型 角度2 xff1a 就起作用的阶段而言 xff1a def
  • void fun() const{}; const void fun(){}; 和void const fun(){}; 的区别?

    const void fun 和void const fun 两个相同 如果采用 34 按址传递方式 34 的函数返回值加const 修饰 xff0c 那么函数返回值 xff08 即地址 xff09 的内容不能被修改 xff0c 该返回值只
  • C和C++的const

    1 C语言的const修饰的变量都有空间 xff0c 全局的在常量区 xff0c 局部的在栈区 xff1b 2 C语言的const修饰的全局变量具有外部链接属性 xff0c extern const int a xff1b 即可使用 xff
  • C++中的四种强制转换 dynamic_case,const_cast,static_case,reinterprer_case的不同

    使用标准C 43 43 的类型转换符 xff1a static cast dynamic cast reinterpret cast 和const cast 1 static cast 用法 xff1a static cast lt typ
  • C语言中的关键字应用技巧(volatile、const、struct/union、_ _预定义_ _、#/##、void/void*、weak)

    嵌入式C开发关键字的应用技巧 1 volatile volatile修饰表示变量是易变的 xff0c 编译器中的优化器在用到这个变量时必须每次都小心地从内存中重新读取这个变量的值 xff0c 而不是使用保存在寄存器里的备份 xff0c 有效
  • 顶层const和底层const

    概念解释 表示声明常量的const都是顶层const 用于声明引用的const都是底层const 顶层const是 xff1a 指针本身是常量 底层const是 xff1a 指针所指的对象是常量 即是顶层const又是底层const xff
  • cv::imread(cv::String const&, int)’未定义的引用

    在 Makefile文件的195 行 LIBRARIES 43 61 opencv core opencv highgui opencv imgproc 后面添加 xff1a opencv imgcodecs opencv videoio修
  • [C/C++] const 详解(修饰变量、输入参数、返回值、成员函数)

    看到const关键字 xff0c 程序员首先想到的可能是const 常量 const 更大的魅力是它可以修饰函数的参数 返回值 xff0c 甚至函数的定义体 const 是constant 的缩写 xff0c 恒定不变 的意思 被const
  • const

    面向对象是C 43 43 的重要特性 但是c 43 43 在c的基础上新增加的几点优化也是很耀眼的 就const直接可以取代c中的 define 以下几点很重要 学不好后果也也很严重 const 1 限定符声明变量只能被读 const in
  • const与define的区别

    1 define是预编译指令 xff0c const是普通变量的定义 xff0c define定义的宏是在预处理阶段展开的 xff0c 而const定义的只读变量是在编译运行阶段使用的 2 const定义的是变量 xff0c 而define
  • 深入理解C++中的mutable关键字

    mutalbe的中文意思是 可变的 易变的 跟constant 既C 中的const 是反义词 在C 中 mutable也是为了突破const的限制而设置的 被mutable修饰的变量 将永远处于可变的状态 即使在一个const函数中 我们
  • ES6中const的使用

    const声明一个只读的常量 一旦声明 常量的值就不能改变 且const一旦声明变量 就必须立即初始化 不能留到以后赋值 const的作用域与let命令相同 只在声明所在的块级作用域内有效 const命令声明的常量也是不提升 同样存在暂时性
  • 对extern,static,const的再认识

    const const修饰的值为常量 是不可改变的 在c 语言中是不可改变的 而在C语言中 我们可以通过指针去修改那一片地址的值 const修饰的指针 表面指针指向或者指针的值是不可被修改的 我们可以通过通配符 的位置来判断 在左说明修饰的
  • C++对于const重铸,在结构体中的const引用通过const_cast转换值

    include
  • var与ES6中const、let声明的变量的区别

    好久以前的研究 今天再来回顾一下 首先我们比较一下使用var声明的变量和不使用var声明的变量的区别 使用var声明的变量声明前调用 那么该变量的值为undefined 不使用var声明的变量声明前调用直接报错Uncaught Refere
  • 指针与const限定符

    const限定符和指针结合起来常见的情况有以下几种 const int a int const a 这两种写法是一样的 a是一个指向const int的指针 a所指向的内存单元不可改写 所以 a 是不允许的 但a可以改写 所以a 是允许的

随机推荐

  • 1487 北极通讯网络

    1487 北极通讯网络 这个题就是用来维护一个最短路径吧 也不难 xff0c 就是用来求最小生成树的第k条边 并且 xff0c 这貌似和并查集还有一定的关系 我太傻了 xff0c 这里生成树的方法就是krusal xff0c 我居然想 xf
  • mybatis实现批量插入

    1 首先 创建一个简单的insert语句 lt insert id 61 insertname gt insert into names name values value lt insert gt 2 然后在java代码中像下面这样执行批
  • java实现简单的用户登录包含token

    要实现简单的用户登录包含token xff0c 可以按照以下步骤进行 xff1a 创建一个用户表 xff0c 在表中存储用户的用户名和密码等信息 当用户登录时 xff0c 首先检查用户提交的用户名和密码是否正确 xff0c 如果正确则生成一
  • tar.gz压缩,查看,解压

    压缩 span class token function tar span czf jpg tar gz jpg 将目录里所有jpg文件打包成jpg tar后 xff0c 并且将其用gzip压缩 xff0c 生成一个gzip压缩过的包 xf
  • C++调用shell脚本并传递参数

    C 43 43 调用脚本的两种方式 1 system 执行shell命令也就是向dos发送一条指令 xff0c system 会调用fork 产生子进程 xff0c 由子进程来调用 bin sh c string来执行参数string字符串
  • 学生成绩信息管理系统 C++(含源码)

    懂的都懂 经典大一大作业 我以前也是面向CSDN和GitHub搞定了 今天也来造福新的小朋友了 一 系统需求分析 学生成绩信息记录了学生的基本信息和成绩情况 包括 姓名 学号 整数 中间无分隔符 性别 院系 班级 各个学科及其成绩 总成绩
  • Vue项目导入ElementUI后,网页无显示,打不开Vue的Main页面

    错误如下 xff0c 这是因为我们的vue版本和node js版本太高了 xff0c 我们需要使用Element plus 执行 cnpm install save element plus 然后字main js中修改 import Ele
  • 递归求n的阶乘完整版

    递归函数 求n的阶乘 span class token keyword def span span class token function fun span span class token punctuation span Num sp
  • Ubuntu基础使用指南

    一 基础操作 1 终端重要热键 Tab xff1a 补全功能 Ctrl 43 c xff1a 中断目前程序 Ctrl 43 d xff1a 键盘输入结束 Ctrl 43 Shift 43 c xff1a 复制 Ctrl 43 Shift 4
  • Fixed Frame [base_link] does not exist

    出现这个问题请先检查有没有启动gazebo xff0c gazebo是否能正常加载模型 如果不能 xff0c 那么rviz很可能也加载不了相应的节点 启动了gazebo xff0c 在Fixed frame后可以选择节点 xff0c 没有启
  • 舵机控制(0°与90°之间反复)

  • 1488 新的开始

    1488 新的开始 新的开始 保证最少的花费 xff0c 那么很明显这就是一个最小生成树了 做题之前盲猜一下 xff0c 这个题应该要跑两遍最小生成树 xff0c 因为他说了使用两种情况 xff0c p和v 在井上修建一个和在各个井中间修建
  • Rancher2.7 + Jenkins CI/CD全流程保姆级最佳实践

    Rancher 43 Jenkins k8s集群 CI CD全流程最佳实践 CI方面 xff0c 官方推荐的视频教程等多是使用极狐Gitlab CI xff0c 但社区版极狐每月仅400分钟构造时间 xff0c 额外购买价格为1000分钟
  • linux驱动----内核模块

    目录 一 引言 二 模块的特点 三 模块程序的构成 必要内容 1 模块入口函数 2 模块出口函数 3 模块许可证声明 非必要内容 1 模块参数 2 模块导出符号 3 模块相关信息 四 模块操作命令 一 引言 我们往往需要对内核的大小进行控制
  • linux驱动----模块符号导出使用

    本文介绍一种 xff0c 一个模块调动另一个模块中定义的函数的方法 在内核中 xff0c 函数又叫做符号 xff0c 为了便于理解 xff0c 此处说成我们在C语言中熟悉的函数调用 xff0c 回想一下C语言中的函数调用 xff0c 如果我
  • gcc的编译流程

    xff08 1 xff09 预处理阶段 xff08 c gt i xff09 预处理器会处理所有的以 开头的命令 xff0c 这些都属于预处理命令 xff0c 也就是会将所有的头文件包含的东西插入到源文件中 xff0c 将所有定义的宏都在程
  • Linux驱动----mmap系统调用

    在介绍mmap之前 xff0c 我们首先要了解 xff0c 如果没有mmap xff0c 在我们对一个设备进行操作时 xff0c 内核中其实有映射一份该设备的物理内存地址 xff0c 这是一份虚拟地址 xff0c 但是这是属于内核的 xff
  • STM32的启动流程

    本文主要介绍 xff0c STM32从 CPU 上电复位执行第 1 条指令开始 xff08 汇编文件 xff09 到进入 C 程序 main 函数入口之间的那个部分 基本流程如下 1 确定启动方式 每个STM32的芯片上都有两个管脚BOOT
  • 推挽输出&&开漏输出

    在学习STM32的时候 xff0c 我发现了一个很值得研究学习的问题 xff0c 下面 xff0c 用我的理解来阐述一遍 xff0c 这其中的原理 首先请看电路图 在给GPIO配置输出的时候 xff0c 其有两种工作模式可选 xff0c 分
  • const

    const是一个限定符 xff0c 被const限定的变量其值不会被改变 目录 1 修饰变量 2 修饰指针 3 修饰引用 4 修饰成员函数 5 宏定义 define 和 const 常量 1 修饰变量 指向的变量的值不可改变 xff0c 次