首页 > const int * 、int * const、int const* 、const int a(){ } 和int a()const { }的区别和联系

const int * 、int * const、int const* 、const int a(){ } 和int a()const { }的区别和联系

前言:很多人都把const int * 、int * const、int const* 的区别和联系搞混,我自己在学习C++的过程中,也经常性          弄不 清楚,今天特意总结一下,作为学习笔记记录下来。

一,const修饰符用于指针

        将const用于指针有些很微妙的地方,有两种不同的方式将const关键字用于指针。第一种方法是让指针指向一个常量对象,这样可以防止使用该指针来修改所指向的值,第二种方法是将指针本身声明为常量,这样可以防止改变指针的位置。

        声明一个指向常量的指针a:

        int y = 1;

        const int * a = &y;

        该声明指出,a指向一个const int,这里为1,因此不能使用a来修改这个值。换句话说,*a的值为const,不能被修改,但是a的声明并不意味着它指向的值实际上就是一个常量,而只是意味着对a而言,这个值是常量。a指向y,而y不是const,可以通过y变量来修改y的值,但不能使用a指针来修改。

        const int m = 9;

        const int * n = &m;  // (1)

        int * t = &m;            //(2)

        上面的(1)和(2)中看到了什么,(2)将const的地址赋给了常规指针,(1)将const地址赋给了const指针,这两张是否正确呢,答案显然(2)不对,因为C++禁止将const的地址赋给非const指针,如果非要这样做,只能使用强制类型转换来突破这种限制。

        int m = 1;

        const int * n = &m;  //(3)

        int * const h = &m;  //(4)

        (3)中声明的const只能防止修改n指向的值,而不能防止修改n的值,也就是说可以将一个新地址赋给n;但仍然不能使用n来修改它指向的值,不允许使用n来修改m的值,但允许将n指向另一个位置。(4)中关键字const的位置与之前的不同,这种声明格式使得h只能指向m,但允许使用h来修改m的值。

二,int const * 与const int *

        int const * a 与const int * a是没有任何区别的,它们的效果是一样的,都表示a指向一个const int,它总是把它指向的目标当做一个int常量。不能使用a来修改这个指向的地址的值,但是可以重新指向其他地址。即*a的值是const,不能被修改。

三,const int * const 与 const int const *

        int trouble = 2;

        const int * const flag1 = &trouble;  //(5)

        const int const * flag2 = &trouble;  //(6)

        其中(5)flag1只能指向trouble,而flag1不能用来修改trouble的值,即flag1和*flag1都是const。指向的地址和指向的地址的值都不能改变。

        其中(6)同(5)的用法类似,也是指针指向的内存地址不可变,并且指针指向的内存地址的值也不能被修改。

四,牛客网例题分析

         请声明一个指针,其所指向的内存地址不能改变,但内存中的值可以被改变。

正确答案: B   你的答案: C (错误)

const int const *x = &y;

int * const x = &y;

const int *x = &y;

int const *x = &y;

const int * const x = &y;

       我们始终记住若const限定符在*之前,则const限定的是*ptr而不限定ptr。也就是说,ptr可以改变其所指向的对象,但不能通过该指针修改其所指向对象的值。

若const限定符在*之后,则const限定的是ptr而不限定*ptr。也就是说,ptr不可以改变其所指向的对象,但能通过该指针修改其所指向对象的值。

若在*之前有const限定符且在*之后也有const限定符,则ptr与*ptr都被限定。也就是说,ptr既不可以改变其所指向的对象,也不能通过该指针修改其所指向对象的值。

只要在*之后有const 限定符,则该指针在声明时必须初始化。

 

     A中指向的内存地址不可变,指向的内存地址的值也不可变

     B中指向的内存地址不可变,但是指向的内存的地址的值可以改变。

     C中指向的内存地址可以改变,但是指向的内存的地址的值不能改变。

     D中指向的内存地址可以改变,但是指向的内存的地址的值不能改变。

     E中指向的内存地址不可变,指向的内存地址的值也不能改变。

*****************************************************************

补充:int a()const { } 表示a()函数中,类的成员变量不能发生任何改变。a不会对参数进行修改;如果a是结构体或者类的成员,那么也不会对结构体或类的成员变量进行修改



const int a(){ } 这属于一种牵强的写法吧,意思是返回值是一个整型 , 而且这个返回值是常量

更多相关:

  • mutable的中文意思是“可变的,易变的”,跟constant(既C++中的const)是反义词。   在C++中,mutable也是为了突破const的限制而设置的。被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中。   我们知道,如果类的成员函数不会改变对象的状态,那么这个成员函数一般会声明成cons...

  •   注意,前情提示: 本代码基于《Node.js(nodejs)对本地JSON文件进行增、删、改、查操作(轻车熟路)》 传送门Node.js(nodejs)对本地JSON文件进行增、删、改、查操作(轻车熟路)_你挚爱的强哥❤给你发来1条消息❤-CSDN博客   在/api/demo/文件夹下面创建exportAndDownl...

  • 项目结构 main.js(入口文件,开启9999端口监听,实现RESTful风格接口访问) const express = require("express"); const app = express(); const port = 9999;//设置端口号,如果端口号被占用需要自己修改,否则无法跑起来(建议不要用80和80...

  • ES6 你可能不知道的事 – 基础篇 转载 作者:淘宝前端团队(FED)- 化辰 链接:taobaofed.org/blog/2016/07/22/es6-basics/   序   ES6,或许应该叫 ES2015(2015 年 6 月正式发布),对于大多数前端同学都不陌生。   首先这篇文章不是工具书,不会去过多谈概念,而是...

  •         Apache POI是一个开源的利用Java读写Excel,WORD等微软OLE2组件文档的项目。        我的需求是对Excel的数据进行导入或将数据以Excel的形式导出。先上简单的测试代码:package com.xing.studyTest.poi;import java.io.FileInputSt...

  • 要取得[a,b)的随机整数,使用(rand() % (b-a))+ a; 要取得[a,b]的随机整数,使用(rand() % (b-a+1))+ a; 要取得(a,b]的随机整数,使用(rand() % (b-a))+ a + 1; 通用公式:a + rand() % n;其中的a是起始值,n是整数的范围。 要取得a到b之间的...

  • 利用本征图像分解(Intrinsic Image Decomposition)算法,将图像分解为shading(illumination) image 和 reflectance(albedo) image,计算图像的reflectance image。 Reflectance Image 是指在变化的光照条件下能够维持不变的图像部分...

  • 题目:面试题39. 数组中出现次数超过一半的数字 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1: 输入: [1, 2, 3, 2, 2, 2, 5, 4, 2] 输出: 2 限制: 1 <= 数组长度 <= 50000 解题: cl...

  • 题目:二叉搜索树的后序遍历序列 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。 参考以下这颗二叉搜索树:      5     /    2   6   /  1   3示例 1: 输入: [1,6,3,2,5] 输出...