const与指针类型

定义一个指针*p:

const int* p = NULL;
int const* p = NULL; int* const p = NULL;

上面两行定义完全等价,第三行则不同。

下面两行定义也完全等价:

const int* const p = NULL;
int const* const p = NULL;

举例说明:

int x = 3;
const int* p = &x;
//p=&y; 正确
//*p=4; 错误

const修饰的是*p,所以通过*p修改x的值是错误的。

int x = 3;
int* const p = NULL;
//p=&y; 错误

const修饰的是p,p只能指向一个地址,不能再改变。

const int x = 3;
const int* const p = &x;
//p=&y; *p=4; 都是错误的

上面这种情况,就不能再做任何修改。

const与引用类型

int x = 3;
const int& y = x;
//x=10; 正确
//y=20; 错误

y被const修饰,所以不能通过y去修改x的值。

更多示例:

const int x = 5;
x = 5; //错误 int x = 3;
const int y = x;
y = 5; //错误 int x = 3;
const int* y = &x;
*y = 5; //错误
int x = 3, z = 4;
int* const y = &x;
y = &z; //错误 const int x = 3;
const int& y = x;
y = 5; //错误
const int x = 3;
int* y = &x; //错误 int x = 3;
const int* y = &x; //正确

上面这个示例,前者x是不可变的,而y是可变的,如果我们定义一个可变的指针指向一个不可变的变量,那么这就意味着存在风险,我们可以通过指针去修改x的值,这种情况编译器是不允许存在的,所以错误;对于后者,指针只有读权限,x则有读和写的权限,我们用一个权限小的对象接受一个权限大的对象这是允许的,而用一个权限大的对象接受一个权限小的对象则不允许。

const与指针、引用的更多相关文章

  1. 引用、数组引用与指针引用、内联函数inline、四种类型转换运算符

    一.引用 (1).引用是给一个变量起别名 定义引用的一般格式:类型  &引用名 = 变量名: 例如:int a=1;  int  &b=a;// b是a的别名,因此a和b是同一个单元 ...

  2. 不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象, const 指针和指向 const 对象的指针, const 对象的引用

    [源码下载] 不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象,  const 指针和指向 const 对象的指针, con ...

  3. 弄清const与指针、引用之间的关系

    const和 define在常量定义上的差别 在C++中,我们可以使用const 或者 宏define来定义常量.但是C++鼓励使用const定义常量,而不是宏define.原因有很多. 1.defi ...

  4. 【C++编程基础】(1)—— 函数原型声明、函数模板、引用、const 常引用、const 常量指针

    一.函数原型声明: 1.函数声明告诉编译器函数的名称,和如何调用函数(返回类型和参数):函数定义提供了函数的实际主体. 2.强制性的:在C++中,如果函数调用的位置在函数定义之前,则要求在函数调用之前 ...

  5. 第12课.经典问题解析(const;指针和引用)

    问题1:const什么时候为只读变量?什么时候是常量? const常量的判别准则: a.只有用字面量初始化的const常量才会进入符号表(直接初始化过的const为常量) b.被使用其他变量初始化的c ...

  6. Const指针 、 指向const的指针 、引用、指针

    1. const指针和 指向const的指针 指向const的指针: 不允许通过指针来改变其指向的const值 const double *cptr *cptr = 42;  // error! 指针 ...

  7. const 指针与指向const的指针

    最近在复习C++,指针这块真的是重难点,很久了也没有去理会,今晚好好总结一下const指针,好久没有写过博客了,记录一下~ const指针的定义: const指针是指针变量的值一经初始化,就不可以改变 ...

  8. Delphi函数翻译成VC要注意句柄指针传递(传递Handle的时候,必须加上一个指针引用,才能消除编译错误)

    Delphi里做了魔法变化,每个变量名称本身就是指针,因为不怎么需要指针语法.我也不知道是不是因为这个原因引起的Delphi与VC对句柄的不同处理. 这是Delphi的强行关机函数,好用,调用方式:W ...

  9. 比较常见的const与指针的组合情况

    1.对于普通的const与基本类型组合,都是表示的是这是一个常量, const int a; int const a; 表示的意思是一样的,a是一个常量,不可改变 2.对于const与指针组合在一起, ...

随机推荐

  1. spring cloud的配置

    注解篇 @EnableEurekaServer 注解启动一个服务注册中心提供给其他应用进行对话 @EnableDiscoveryClient 激活Eureka中的DiscoveryClient实现 配 ...

  2. 【java面试】java和C/C++的区别

    1.内存分配 java中对内存的分配是动态的,JVM自动对内存进行扫描,对长期不用的空间作为"垃圾"进行收集,使得系统资源得到更充分地利用.按照这种机制,程序员不必关注内存管理问题 ...

  3. 基于Bootstrap和Knockout.js的ASP.NET MVC开发实战 关于 拦截器的 学习 部分

    先贴一段: 下面贴代码: 上面这段代码呢,有几个点迷糊.可以找找看

  4. 基于OpenCV的双目视觉匹配测距系统

    刚读研究生的时候,自己导师研究的方向是双目视觉,于是让自己研究OpenCV,折腾了几个月,算法上没啥突破,不过工程上还是折腾出了一个能用的小玩意,基于OpenCV实现了相机的标定.双目视觉图片的矫正. ...

  5. 看看AQS阻塞队列和条件队列

    上一篇简单介绍了AQS,我们大概知道AQS就是一个框架,把很多功能都给实现了(比如入队规则,唤醒节点中的线程等),我们如果要使用的话只需要实现其中的一些方法(比如tryAcquire等)就行了!这次主 ...

  6. JDK源码之String类解析

    一 概述 String由final修饰,是不可变类,即String对象也是不可变对象.这意味着当修改一个String对象的内容时,JVM不会改变原来的对象,而是生成一个新的String对象 主要考虑以 ...

  7. C++ 强制类型转换详解

    类型转换只不过是让编译器以另外一种方式解释一块内存而已.C++兼容C语言的强制类型转换方式,同时也提供了新型的基于模板的类型转换方式,来提供更多的安全性. 一.C风格的强制类型转换 double k ...

  8. 聊聊“装箱”在CLR内部的实现

    原文连接:https://mattwarren.org/2017/08/02/A-look-at-the-internals-of-boxing-in-the-CLR/ 作者 Matt Warren. ...

  9. Nginx之keepalived高可用工具

    1.创建两台虚拟机,分别为主机和从机,区别两台虚拟机的IP地址 2. 将keepalived上传到linux系统当中 3. cd /usr/local目录 4. tar -zxvf keepalive ...

  10. 《 Java 编程思想》CH03 操作符

    < Java 编程思想>CH03 操作符 在最底层,Java中的数据是通过操作符来操作的. 操作符 +,-,*,*,=与其他语言类似 几乎所有的操作符只能操作"基本类似" ...