【C/C++】 常量指针,指针常量、指向常量的常指针详解

【C/C++】 常量指针,指针常量、指向常量的常指针详解什么是指针指针就是指向变量的地址在这里插入代码片指针常量 int constp amp a 特点 指针的指向不可以修改 指针指向的内存的值可以修改举例 p 20 p amp b 常量指针 inta 10 intb 10 constint p amp a 特点 指针的指向可以修改 但是指针指向的值不可以修改

什么是指针

指针就是指向变量在内存中的地址

数据是存放在内存中的,每一个变量都有一个内存地址,假设是一个int类型变量a,占4个字节的内存区,那么在内存中如果是小端方式存储,我们创建指针p,把a的地址赋值给p,就是把a的首地址0x1100赋值给指针p,这个时候p的值就是变量a在内存中的首地址

int a =10; int*p; p=&a; //把a的首地址赋值给P 

也就是说指针的值是这块内存区域的首地址

在这里插入图片描述

内存地址

内存是一个很大的,线性的字节数组,每一个字节都是固定8个二进制位组成,计算机对每个内存单元都进行了编号,这个编号就称为内存地址,地址决定了内存单元在内存中的位置

指针所占内存

32位系统中,处理器一次能处理的最大位数是2的32次方 ,也就是一次处理4个字节的内存数据,哪么指针的长度也就是4个字节

64位系统中,处理器一次能处理的最大位数是2的64次方 ,也就是一次处理8个字节的内存数据,哪么指针的长度也就是8个字节

32位系统指针4个字节 64位系统8个字节

const 变量

const 是 constant 的缩写,本意是不变的,不易改变的意思

也就是说使用const修饰的变量,其值是不允许改变的

const int a = 7; int b = a; // 正确 a = 8; // 错误,不能改变 

指针常量,常量指针和指向常量的指针

在了解了上面的基础知识之后,我们来看一下什么是指针常量,常量指针和指向常量的指针

首先说一下怎么快速的记住他们的区别,只需要按照命名的顺序来读,就可以很好地记忆

比方说:

int * const p =&a; 

首先是一个指针int * , 然后一个const常量 那么p就是指针常量

const int *p=&a; 

首先是一个const常量, 然后一个指针int * 那么p就是常量指针

是不是很好记忆

指针常量

int * const p =&a; 

特点:指针的指向不可以修改,指针指向的内存的值可以修改

因为const的功能就是限定不可以修改,所以我们看到指针常量是先有了int *指针,再有的const修饰p 所以p的值(指向的内存地址) 是不可以修改的

也就是const限制的是指针p的值,但是没有限定p指向的内存地址里的数据,所以内存的数据可以修改

举例:

int a=10; int * const p =&a; //定义指针常量,指向int a的地址 *p = 20; //正确,指向的内存地址中的数据可以修改  p=&b; //错误,指向的内存地址不可以修改 

箭头是指针指向的内存值,是不可以修改的,但是指向的内存地址中的数据可以修改
在这里插入图片描述

常量指针

const int *p=&a; 

特点: 指针的指向可以修改,但是指针指向的值不可以修改。

常量指针,首先要是常量。就是指向的值要是一个常量,但是指向的内存地址不做限制

int a=10; int b=10; const int *p=&a; //定义常量指针,指向int a的地址 *p = 20; //错误,指向的内存地址中的数据不可以修改  p=&b; //正确,指向的内存地址可以修改 

箭头是指针指向的内存值,是可以修改的,但是指向的内存地址中的数据要和之前的一致
在这里插入图片描述

指向常量的常指针

const int const *p=&a; 

特点: 指针的指向不可以修改,指针指向的值也不可以修改。

两个const限制,一旦指向之后就不可以做修改了

int a=10; int b=10; const int const *p=&a; //定义指针常量,指向int a的地址 *p = 20; //错误,指向的内存地址中的数据不可以修改  p=&b; //错误,指向的内存地址不可以修改 

在这里插入图片描述

空指针、野指针

空指针就是指向地址为空的指针

注意:空指针指向的内存是不可以访问的

//-------空指针-------// int *p4 = NULL; //cout << *p4 << endl; //运行Error,使用指针时必须先判断是否空指针 

野指针是指针指向了一个随意的内存地址,如果使用,会造成不可预知的内存错误

//-------野指针(悬浮、迷途指针)-------// int *p5 =0x1100; //任意赋值的野指针 //cout << *p5 << endl; //运行Error int *p6 = new int(5); delete p6; //删除p6的指向 p6 = NULL; //一定要有这一步,否则p6会随机的指向一个地址 

请添加图片描述
请添加图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/177705.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午6:54
下一篇 2026年3月26日 下午6:54


相关推荐

  • Oracle创建表空间「建议收藏」

    Oracle创建表空间「建议收藏」临时表空间和表空间的区别,不想理解可略过表空间此空间是用来进行数据存储的(表、function、存储过程等),所以是实际物理存储区域。临时表空间主要用途是在数据库进行排序运算[如创建索引、or

    2022年7月4日
    39
  • JSP源代码大全–倒计时代码生成器

    JSP源代码大全–倒计时代码生成器请参照以下的原代码 注意 可以替换 JavaScript 码中的 2007 以下是网页源代码 1 将第一部分粘贴到 HTML 的 HEAD 区 2 将 OnLoad 事件加入 BODY 标签内 3 将最后一部分代码加入 BODY 区 varTemp2 vartimerID null vartimerRunn false functionarry this length

    2026年3月26日
    2
  • 奉劝想把编程学好的学弟们 · 如何高效学习编程?

    奉劝想把编程学好的学弟们 · 如何高效学习编程?大家好 我是安然无虞 一 写在前面 简单介绍为了记录自己的成长历程 也刚好 3 万粉了嘛 所以前来感谢大家的认可与厚爱 再加上近期有些大一大二老铁的老铁私信我说自己比较迷茫 不知道怎么上手编程 远远不满足于学校所教授的内容 所以呢 有感而发 特意写下了这一篇关于 IT 大学生该如何学习技术的文章 内附有详细的学习路线及规划 喜欢的老铁来波三连 抱拳了哈 由于我是在去年十月份中旬开始写的第一篇文章 目前还是一位小博主 肯定有很多学长学姐学弟学妹们没有看过我的文章 所以首先呢 我

    2026年3月19日
    2
  • Springboot + Openjpa 整合 GBase8s 实践「建议收藏」

    Springboot + Openjpa 整合 GBase8s 实践「建议收藏」本文我们将先来介绍JPA以及OpenJPA之间的关系,然后通过一个手把手的应用案例来讲述Springboot和Openjpa整合GBase8s。那么就让我们开始吧。JPAJPA(JavaPersistenceAPI)作为JavaEE5.0平台标准的ORM规范,将得到所有JavaEE服务器的支持。Sun这次吸取了之前EJB规范惨痛失败的经历,在充分吸收现有ORM框架的基础上,得到了一个易于使用、伸缩性强的ORM规范。从目前的开发社区的反应上看,JPA受到了极大…

    2022年4月28日
    78
  • php 7.1 openssl_decrypt() 代替 mcrypt_module_open() 方法

    php 7.1 openssl_decrypt() 代替 mcrypt_module_open() 方法

    2021年11月8日
    60

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号