[c++]常量指针和指针常量区别

[c++]常量指针和指针常量区别include bits stdc h usingnamespa intmain inta 10 intb 20 inte 40 constint d amp b 常量指针 cout lt lt d lt bits

1.指向const对象的指针 (常量指针)

const double *cptr; 

这里的cptr是一个指向double类型const对象的指针,const限定了cptr指针所指向的对象类型,而并非cptr本身。也就是说cptr本身并不是const。在定义时不需要对它进行初始化,如果需要的话,允许给cptr重新赋值,使其指向另一个const对象。但不能通过cptr修改其所指对象的值:

*cptr=40;//报错,*cptr应该是const类型 

把一个const对象的地址赋给一个普通的,非const对象的指针也会导致编译时的错误:

const double pi=3.14; double *ptr=π//报错:ptr是一个普通指针 const double *cptr=π//OK: cptr是一个指向const对象的指针 

也不能使用void指针保存const对象的地址,而必须使用const void类型的指针保存const对象的地址:

const int universe=40; const void *cpv=&universe;//OK void *pv=&universe;//报错:universe是const常量 

允许把非const对象的地址赋给指向const对象的指针,例如:

double dval=3.14; const double *cptr=&dval;//OK:但是不能通过cptr来修改dval的值 

尽管dval不是const对象,但任何企图通过指针cptr修改其值的行为都会导致编译时的错误。cptr一经定义,就不允许修改其所指向对象的值。如果该指针恰好指向非const对象时,同样必须遵循这个准则。

然而,事实是可以修改const指针所指向的值,这一点尝尝容易引起误会。

double dval=3.14159; const double *cptr=3.14159;//报错:cptr是指向const对象的指针 const double *cptr=&dval;//OK: 允许把非cosnt对象的地址赋给指向const对象的指针 double *ptr=&dval; //OK:ptr指向dval *ptr=2.72;//OK: ptr是普通指针可以修改 cout<<*cptr< 
  

在上例中,指向const的指针cptr实际上指向了一个非const对象。尽管它所指的对象并非const,但仍不能使用cptr修改该对象的值。本质上说,由于没有方法分辨cptr所指的对象是否为const,系统会把它所指的所有对象都视为const。

如果指向const的指针所指向的对象并非const,则可直接给该对象赋值或间接地利用普通的非cosnt指针修改其值:毕竟这个值不是const。只要的是要记住:不能保证指向const对象指针所指对象的值一定不可以修改

在实际的程序中,指向const的指针常用作函数的形参。将形参定义为指向const的指针,以此确保传递给函数的实例对象在函数中不因为形参而被修改。

2.const指针 (指针常量)

除指向const对象的指针外,C++语言还提供了const指针——本身的值不能修改:

int errNumb=0; int *const curErr=&errNumb;//指针curErr是一个常量 
if(*curErr){ *curErr=10;//OK: 此时errNumb值被修改为10 } 

3.指向const对象的const指针

定义如下:

const double pi=3.14159; const double *const pi_ptr=π 

本例中,既不能修改pi_ptr所指向对象的值,也不允许修改该指针的指向(即pi_ptr中存放的地址值)。读作pi_ptr首先是一个const指针,其指向double型的const对象。


下面给出一个C++上的例子:

#include 
   
     using namespace std; int main(){ int a=10; int b=20; int e=40; const int* d=&b;//常量指针 cout<<"d:"< 
     
   
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

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

(0)
上一篇 2026年3月18日 下午10:53
下一篇 2026年3月18日 下午10:53


相关推荐

  • 使用Matlab对数据归一化

    使用Matlab对数据归一化前言在使用机器学习做分类和回归分析时,往往需要对训练和测试数据首先做归一化处理。这里就对使用MATLAB对数据进行归一化方法做一个小总结。为什么进行归一化一般做机器学习应用的时候大部分时间是花费在特征处理上,其中很关键的一步就是对特征数据进行归一化。关于为什么进行归一化处理维基百科给出的解释是:1)归一化后加快了梯度下降求最优解的速度;2)归一化有可能提高精度。具体介绍:https://w…

    2022年6月23日
    41
  • Java语言中一个字符占几个字节?「建议收藏」

    Java语言中一个字符占几个字节?「建议收藏」要区分清楚内码(internalencoding)和外码(externalencoding)就好了。内码是程序内部使用的字符编码,特别是某种语言实现其char或String类型在内存里用的内部编码;外码是程序与外部交互时外部使用的字符编码。“外部”相对“内部”而言;不是char或String在内存里用的内部编码的地方都可以认为是“外部”。例如,外部可以是序列化之后的char或String…

    2022年6月26日
    31
  • 明德云课堂计算机应用基础,旻德云课堂官网版app「建议收藏」

    明德云课堂计算机应用基础,旻德云课堂官网版app「建议收藏」旻德云课堂app在线快速提供各种云课堂教学软件。该软件使用户可以更好地教云教室。它还提供了各种不同的云端课程,使每个人都可以更好地享受在线云课堂教学,也是最近非常热门的线上云课堂app!软件介绍旻德云课堂app课堂教学的便利性还使老师和同学之间可以更好地进行在线互动,使两方之间的交流变得更加无忧,同时,还可以提高课堂效率,使两方之间的交流更加畅通。简单快捷。旻德云课堂app怎么样?不同的课程都有详…

    2022年6月12日
    88
  • css字体设置透明度,CSS字体透明度怎么设置?

    css字体设置透明度,CSS字体透明度怎么设置?在 css 中有很多好看的样式都可以实现 css 设置出来的样式让整个网页看起来也会非常美观 今天的这篇文章就给大家来介绍一下在 css 中怎么设置字体的透明度 让你的字体在网页中看起来是透明的 在 css3 中新增了一个 rgba 属性 所谓 rgba 属性 就是 R 红 G 绿 B 蓝 三原色加 ALPHA 透明度 下面我们就来具体看看这个 rgba 属性如何设置字体透明度 首先利用 RGBA 来设置背景颜色透明度是非常简单

    2026年3月16日
    2
  • 描述编程语言的BNF

    描述编程语言的BNF转 来自维基百科 BNF 规定是推导规则 产生式 的集合 写为 lt 符号 gt lt 使用符号的表达式 gt 这里的 lt 符号 gt 是非终结符 而表达式由一个符号序列 或用指示选择的竖杠 分隔的多个符号序列构成 每个符号序列整体都是左端的符号的一种可能的替代 从未在左端出现的符号叫做终结符 基本原理 nbsp nbsp nbsp nbsp nbsp BNF 类似一种数学游戏 从一个符号开始 叫做起始标志 实例

    2026年3月19日
    2
  • [深度学习] 大模型学习5-高效微调框架Unsloth使用指北

    [深度学习] 大模型学习5-高效微调框架Unsloth使用指北

    2026年3月13日
    2

发表回复

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

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