const指针和指向常量的指针

先看下面六种写法:

1. const int p;2. const int *p;3. int const* p;4. int * const p;5. const int * const p;6. int const * const p;

那么我们应该怎么区分上面的写法到底是指向常量的指针还是const指针(表示指针本身是常量)呢?

一个简便方法:从由往左读,遇到p就替换为“p is a”,遇到*就替换为“point to”,其余不变。

下面我们来一个一个看:

1. const int p; // p is a int const. p是一个int型常量 这个很简单2. const int *p; //p is a point to int const. p是一个指针,指向int型常量。即p是一个指向int型常量的指针。3. int const* p; //与2相同 const int 和 int const 是一样的意思。《C++ primer》中采用第一种写法。4. int * const p; // p is a const point to int. p是一个指向int的const指针5. const int * const p; //p is a const point to int const. p是一个指向int型常量的const指针。6. int const * const p; //同5

知道怎么区分const指针和指向常量的指针,我们再来看看它们的定义。

指向常量的指针(point to cosnt)不能用于改变其所指对象的值。比如:

const double pi = 3.14; // pi是一个常量,不能改变它的值const double *cptr = π //cptr指向pi,注意这里的const不能丢,因为普通指针不能指向常量*cptr = 3.33;  //错误,试图改变所指对象的值。不能给*cptr赋值,即不能改变指针所指对象的值

cout << cptr << endl;//输出cptr的值//虽然不能改变其所指对象的值,但是它可以指向别的常量对象
//这样的话 指针的值(也就是存放在指针中的那个地址)也会改变 比如:
cosnt double pi2 = 6.28;cptr = &pi2; //正确  *cptr为6.28 

cout << cptr << endl; //cptr的值变了

const指针表示指针本身是一个常量。由于指针是对象,因此就像其他对象一样,允许把指针本身定为常量。cosnt指针必须初始化,并且一旦初始化,const指针的值就不能改变了。const指针的值到底是什么?其实就是存放在指针中的地址,这个地址是一个对象的地址。

把*放在const前面就表示指针是一个常量,这样的书写形式意味着不变的是指针本身的值而不是指向的对象的值(内容)。也就是说,那个地址不能再变了,但是我们可以改变那个地址上存放的内容。比如:

int i = 42;int * cosnt p = &i; //p是一个const指针,不能给p赋值

cosnt int i2 = 44;p = &i2; //错误 试图给p赋值//虽然不能给p赋值,也就是不能改变p的值,但是我们可以通过p改变p所指的对象的内容。比如:*p = 46; //正确 此时i为46

指针本身是一个常量(即const指针)并不意味着不能通过指针修改其所指对象的值,能否这样做完全依赖于所指对象的类型。比如,

const double pi = 4.4;const double *const pip = &pi; //pip是一个指向常量对象的const指针(还记得文章开头的方法吗)。

pip是一个指向常量的常量指针,则不论pip所指的对象值还是pip自己存储的那个地址都不能改变。相反,上例中的p指向的是一般的非常量整数,所以p可以修改i的值。

完整代码:

#include <iostream>
using namespace std;int main(int argc, char const *argv[])
{const int b = 11;const int *p2 = &b;  //指向常量的指针 底层const 不能改变p2的所指对象的值 但是可以改变p2的值(即指针的指向)  前提是仍然指向一个常量cout << *p2 << endl; //11cout << p2 << endl;  //0x72fe38const int c = 22;p2 = &c;cout << *p2 << endl; //22cout << p2 << endl;  //0x72fe34地址发生了改变int i = 9;int *const p1 = &i;  //指针是一个常量(即常量指针)顶层const 不能改变p2的值(存放在p2中对象的地址) 但是可以改变对象的内容cout << p1 << endl;  //0x72fe3c 这个地址不会再改变了*p1 = 88;cout << i << endl;  //88cout << *p1 << endl; //88cout << p1 << endl; //0x72fe3creturn 0;
}

对于指针来说,顶层const表示指针本身是一个常量,底层const表示指针所指的对象是一个常量。所以const指针是顶层cosnt,而指向常量的指针是底层const。

 

转载于:https://www.cnblogs.com/bencai/p/8888760.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/451923.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

配置SQL Server的身份验证方式

下面的文章来源于网络&#xff0c;讲的是怎样配置SQL Server 2005登陆验证方式&#xff0c;但是内容同样适用于SQL Server 2008. 配置SQL Server的身份验证方式 在默认情况下&#xff0c;SQL Server 2005 Express是采用集成的Windows安全验证且禁用了sa登录名。为了工作组环境下…

计算机程序设计艺术+第3卷:排序与查找(第二版)pdf

下载地址&#xff1a;网盘下载 《计算机程序设计艺术排序和查找(第3卷)(第2版)》内容简介&#xff1a;这是对第3卷的头一次修订&#xff0c;不仅是对经典计算机排序和查找技术的最全面介绍&#xff0c;而且还对第1卷中的数据结构处理技术作了进一步的扩充&#xff0c;通盘考虑了…

数据结构与算法--5.Python实现十大排序算法

文章目录0. 相关概念一. 冒泡排序二. 选择排序三. 插入排序四. 希尔排序五. 快速排序六. 归并排序七. 其他0. 相关概念 稳定&#xff1a;如果a原本在b前面&#xff0c;而ab&#xff0c;排序之后a仍然在b的前面。不稳定&#xff1a;如果a原本在b的前面&#xff0c;而ab&#xf…

No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK? 问题

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 maven run as --install 时出错&#xff0c;提示信息如下&#xff1a; [ERROR] Failed to execute goal org.apache.maven.plugins:m…

spring cloud(九):各组件常用配置参数

1、Eureka的常用配置Eureka Server端eureka.server.enable-self-preservation # 设为false&#xff0c;关闭自我保护eureka.server.eviction-interval-timer-in-ms # 清理间隔&#xff08;单位毫秒&#xff0c;默认是60*1000&#xff09;eureka.environmentdev #指定环境eureka…

JSON与XML的区别比较

1.定义介绍 (1).XML定义 扩展标记语言 (Extensible Markup Language, XML) &#xff0c;用于标记电子文件使其具有结构性的标记语言&#xff0c;可以用来标记数据、定义数据类型&#xff0c;是一种允许用户对自己的标记语言进行定义的源语言。 XML使用DTD(document type defini…

ajax传递数组:属性traditional设置

jQuery.ajaxSettings.traditional true; $.post("",function(){});转载于:https://www.cnblogs.com/HansZimmer/p/9334006.html

Python面试题总结(9)--高级特性

文章目录1. 函数装饰器有什么作用&#xff1f;请列举说明&#xff1f;2. Python 垃圾回收机制&#xff1f;3. 魔法函数 _call_怎么使用?4. 如何判断一个对象是函数还是方法&#xff1f;5. classmethod 和 staticmethod 用法和区别6. Python 中的接口如何实现&#xff1f;7. Py…

I/O流讲解

本文来自&#xff1a;曹胜欢博客专栏&#xff1a;http://blog.csdn.net/csh624366188 在软件开发中&#xff0c;数据流和数据库操作占据了一个很重要的位置&#xff0c;所以&#xff0c;熟悉操作数据流和数据库&#xff0c;对于每一个开发者来说都是很重要的&#xff0c;今天就…

Spring Boot入门(9)网页版计算器

介绍 在写了前八篇Spring Boot项目的介绍文章后&#xff0c;我们已经初步熟悉了利用Spring Boot来做Web应用和数据库的使用方法了&#xff0c;但是这些仅仅是官方介绍的一个例子而已。   本次分享将介绍笔者自己的一个项目&#xff1a;网页版计算器&#xff0c;以这两篇博客…

shell编程基础(七): 处理文件命令sed与awk

一、sed&#xff08;以行为单位处理文件&#xff09; sed意为流编辑器&#xff08;Stream Editor&#xff09;&#xff0c;在Shell脚本和Makefile中作为过滤器使用非常普遍&#xff0c;也就是把前一个程序的输出引入sed的输入&#xff0c;经过一系列编辑命令转换为另一种格式输…

数据结构与算法--6.二分查找

文章目录一. 二分查找二. 代码实现一&#xff1a;使用递归三. 代码实现二&#xff1a;非递归一. 二分查找 二. 代码实现一&#xff1a;使用递归 def binary_search(alist, item):"""二分查找&#xff1a;使用递归"""n len(alist)if n > 0:m…

SpringMVC请求处理流程、springMVC工作流程

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 页面请求到来 --> 前端控制器&#xff08;DispatcherServlet&#xff09;收到请求&#xff0c;请求 处理映射器&#xff08;Hanle…

Android的TextView在显示文字的时候,如果有段中文有英文,有中文,有中文标点符号,你会发现,当要换行的时候遇到中文标点, 这一行就会空出很多空格出来...

一、问题描述&#xff1a; Android的TextView在显示文字的时候&#xff0c;如果有段中文有英文&#xff0c;有中文&#xff0c;有中文标点符号&#xff0c;你会发现&#xff0c;当要换行的时候遇到中文标点&#xff0c; 这一行就会空出很多空格出来。原因是&#xff1a; 1&…

什么是IDE

集成开发环境&#xff08;IDE&#xff0c;Integrated Development Environment &#xff09;是用于提供程序开发环境的应用程序&#xff0c;一般包括代码编辑器、编译器、调试器和图形用户界面等工具。集成了代码编写功能、分析功能、编译功能、调试功能等一体化的开发软件服务…

vue 学习

http://jspang.com/ vue 学习 vue 学习 转载于:https://www.cnblogs.com/qianjin888/p/9342031.html

策略模式-Strategy Pattern

解决问题 将算法按照策略或场景封装起来&#xff0c;以方便按照不同的场景执行不同的策略。它很好的解决了通过if...else 来决策行为而带来的代码和逻辑复杂性。 应用场景 一个经常被拿来举例的场景是收银员收银场景&#xff1a;它需要根据不同的场景&#xff08;是否为会员、有…

ssm框架下 tiles框架 的使用

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 tiles框架的工作 在springMVC工作流程中属于视图解析器 解析视图这一步。算是视图解析器的一个插件&#xff0c;作了视图解析这步的一部…