文章目录

目录

文章目录

一、const关键字

1.const简介

2.const的使用

二、const与指针的关系

1.c语言与c++中const的区别

2.const与指针的关系


一、const关键字

1.const简介

当const修饰一个变量时,该变量的数据只能被访问不能被修改,也就是"只读",编译器会把const修饰类型的对象放入只读内存中

2.const的使用

代码示例:

    const int n = 10;int b = 10;const int* p = &b;

错误示例:

    const int n = 10;n = 20;//n被const修饰,不能改变其值,编译不通过int b = 10;const int* p = &b;*p = 100;//error 

二、const与指针的关系

1.c语言与c++中const的区别

在C语言中,const以变量为主,而在C++中,const以常性为主。下面通过一些示例来理解二者区别。

举例1:

const int n = 10;

int ar[n]{1,2,3}; // C语言中编译不通过,而C++编译通过

原因:在C语言中,n是变量属性,而数组定义时,[ ]内必须为整型常量,因此报错,而在C++的编译过程中,会在将n替换为字面常量10,所以在C++中,int ar[n]{1,2,3}相当于 int ar[10]{1,2,3},故编译通过。

举例2:

int main()
{const int a = 10;int b = 0;int* ip = (int*)&a;*ip = 100;b = a;printf("a = %d b = %d *ip = %d\n", a, b, *ip);return 0;
}

上面这段代码按C语言编译结果:a=100 b=100 *ip=100,按C++方式编译结果:a=10 b=10 *ip=100,这是因为在C语言中是从a空间中取值,而C++中则是编译时将a替换为字面常量10。

这一点我们可以从反汇编代码中看出

C++中查看反汇编

2.const与指针的关系

(1)const 修饰离它距离最近的变量

代码示例:

int main()
{int a = 10, b = 20;int* p1 = &a;*p1 = 100;//1 编译通过p1 = &b;//2 编译通过const int* p2 = &a;*p2 = 100;//3 编译不通过p2 = &b;//4 编译通过int* const p3 = &a;*p3 = 100;//5 编译通过p3 = &b;//6  不通过const int* const p4 = &a;*p4 = 100;//7 不通过p4 = &b;//8 不通过return 0;
}

以上代码中,没有const修饰,指针的指向和指针自身都能够进行改变,1,2都能编译通过。

const int* p2中,const修饰的是p2的指向,所以不能通过修改指针来改变a的值,但可以改变p2自身的值

int* const p3中const修饰的是指针自身,可以通过修改指针的指向来修改a的值,但是p3自身不能改变。

const int* const p4 二者都被const修饰,均不可改变。

(注意:指针包含两个部分的值,一个是指针自身的值(指向谁的地址),一个是所指向的变量的值)

(2)遵循赋值兼容性原则

能力强的能够赋值给能力弱的

代码示例:

int main()
{int a = 10, b = 20;int* p = &a;int* s1 = p;// √const int* s2 = p; // √int* const p3 = p;// √const int* const s4 = p; //√return 0;
}

以上代码中,指针p没有const修饰,p的指向可以改变,可以通过改变指针来改变a的值,指针s2不可以改变指向,不能通过指针s2的改变来改变a的值,所以相对于s2,p的能力较强,因此编译能够通过。依次类推,如此方法上述判断均可通过。

若用const修饰*p(const int*p),如下:

    int a = 10, b = 20;const int* p = &a;int* s1 = p;// ×const int* s2 = p; // √int* const p3 = p; // ×const int* const s4 = p; // √

若const修饰p(int* const p),都可以通过。

const与指针的关系相关推荐

  1. const与指针变量

    const关键字在修饰指针有时候搞不清楚修饰到底是指针,还是修饰指针指向的内容,下面详细整理了一下,const和指针的关系主要有以下四种情况. 整型常量和常量指针 首先先看看整型常量和常量指针如何定义 ...

  2. 【C++】const与指针

    目录 一.C与C++中const的区别 二.const与指针的关系 1.const int* (int const*) 2.int* const 3.const int* const 三.常变量与指针 ...

  3. C++基础—const与指针

    const与指针 一.const与指针 1.const在C和C++中的区别 1.1 如果在C语言中使用const去定义变量,然后再去定义数组,则会提示:**类型错误** 1.2 C编译 1.3 C++ ...

  4. C++阶段01笔记07【指针(基本概念、变量定义和使用、内存空间、空指针和野指针、const修饰指针、指针和数组、指针和函数)】

    C++| 匠心之作 从0到1入门学编程[视频+课件+笔记+源码] 目录 7 指针 7.1 指针的基本概念 7.2 指针变量的定义和使用 示例 7.3 指针所占内存空间 示例 7.4 空指针和野指针 示 ...

  5. const与指针用法

    const const int z =y.之后z不能再赋值了. person p1("abc",200); const person* p =&p1; //对象是const ...

  6. 【C语言】深入浅出理解指针及内存与指针的关系(详细讲解+代码展示)

    目录 概述 内存 内存含义 内存作用: 物理存储器和存储地址空间 物理存储器:实际存在的具体存储器芯片. 存储地址空间:对存储器编码的范围. 内存地址 指针和指针变量 指针基础知识 指针变量的定义和使 ...

  7. C++中数组和指针的关系(区别)详解

    C++中数组和指针的关系(区别)详解 本文转自:http://c.biancheng.net/view/1472.html 博主在阅读后将文中几个知识点提出来放在前面: 没有方括号和下标的数组名称实际 ...

  8. const 修饰指针

    目录 const修饰指针 1.1const 放在*的左边 1.2const放在*的右边 const修饰指针 1.1const 放在*的左边 修饰的是指针指向的内容(*p),指针指向的内容,不能通过指针 ...

  9. C语言--const修饰指针解析

          这种例子在我们平时编程时可能会很少用,但是在面试时被问的可能性就很大了. 用const修饰指针,常见的情况可以分为四种: 1.const int *p; // p 可变,p 指向的对象不可 ...

最新文章

  1. php解释命令行的参数
  2. XML::Simple与Data::Dumper在Perl中的使用
  3. 如何让python调用C和C++代码
  4. [原]windbg调试系列——崩溃在ComFriendlyWaitMtaThreadProc
  5. 弹簧触摸开关原理图_两种触摸开关电路
  6. Java基础学习总结(76)——Java异常深入学习研究
  7. 关于钥匙串中所有证书签名无效的问题解决纪录
  8. java se ee me都有什么区别?
  9. iOS 关于使用xib创建cell的两种初始化方式
  10. 我对架构的理解-概念篇
  11. 云计算成了“晕技术”就对了
  12. 例2.4 Day of Week - 九度教程第7题(日期类问题)
  13. 2021-09-06单纯形计算方法(
  14. micropython源码分析之c模组注册
  15. 计算机竞赛acm试题,ACM-ICPC 2018 总决赛赛题
  16. 乒乓球基本站姿站位和步伐
  17. OR | IE | SCM | TR: 国际会议集锦
  18. Linux之安装Nginx(安装包方式)
  19. 解决cumcm17问题的代码记录(待改正)
  20. python 之复数

热门文章

  1. 期货股票量化软件:第三代神经网络深度网络
  2. 什么样的人不适合当管理者?有这三种情况,你很难升上去
  3. HTML知识点总结大纲
  4. 手把手教你撸Redis
  5. ssm项目之生成验证码
  6. python获取当前时间并转为字符串
  7. delphi 电子书大全
  8. 教程 | Python 实现 Word 文档操作...
  9. 短视频脚本要注意哪些要素?拍摄场景不能忘,配音也很重要
  10. saas系统:巧用MyBatisPlus,成功实现多租户功能