const类型变量
--------------------------------------
int i;
const int *p;
--------------------------------------
int i;
int *const p = &i;
--------------------------------------
int i;
const int *const p = &i;

三者有何区别呢?
--------------------------------------

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

const int *p;  //定义一个指向常量的指针。

int *const p;  //定义一个指针常量,一旦指向某一变量的地址后,不可再指向其他变量的地址。(注意:指针常量也叫常量指针

二者区别:
const int *p; //p是一个变量,但指向一个常量。(即p可以指向任何地址,但是只能通过*p来读这块地址的内容,不能通过*p来写这块地址的内容)

int *const p; //p是一个常量,但指向一个变量或者常量。(即如果一旦p指向了任何一个有效的地址后,就不可再指向其他变量的地址,但可以通过*p来读写这块地址的内容)

--------------------------------------
1. const int *p;
const用来修饰int *,*p的内容不可变。

 linux下示例代码如下:

 #include <stdio.h>

 int main01()
{
int a = ;
int *p = &a; //此时的p指向了一个int类型的地址,可以通过*p的方式来修改这个内存a的值。
*p = ;
printf("a = %d\n", *p); //或者printf("a = %d\n", a); //此时的*p可读可写。 return ;
} int main()
{
int a = ;
const int *p = &a; //此时的p指向了一个int类型的地址,但不可以通过*p的方式来修改这个内存a的值。
//*p = 10;
a = ; //但是呢,不可以通过*p来改a的值,可以通过a去修改a的值。
printf("a = %d\n", *p); //或者printf("a = %d\n", a); //此时的*p可读不可写。 //c语言的一个小漏洞
const int b = ;
//b = 0; //定义了一个常量,那么这个常量权限是只读了。 //通过指针的方法:即可以通过指向一个变量地址的指针去指向它,然后通过*p1去间接的修改b的值。
//注意编译的时候会出现警告!我们忽略这个警告强行改!这时把b的值改了!!!
//warning: assignment discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers]
//警告:赋值时从指针目标类型丢弃“const”限定符[-Wdiscarded-qualifiers] //这就是在c语言中用常量的时候不用const了!
//因为c语言中的const是有问题的,因为可以通过指针变量间接的修改const定义的常量的值,所以在c语言中用#define定义常量的时候更多。 //为什么#define不能改呢?实质上#define就是一个文本替换,直接把它替换成一个整数了,整数是一个常量,又不是一个变量。
//但是在C++中就没有这个漏洞了。为什么呢?因为c++里面的const是个真的const,而c语言中的const只是在语法的角度不让你去赋值,实际上是假的。
//这是c语言本身存在的弱项。 int *p1;
p1 = &b; //为了避免这个warning,使用强转即可:p1 = (int *)&b;
*p1 = ;
printf("b = %d\n", b); //或者printf("b = %d\n", *p); int *const p2 = &a; //表示p2指向了a的地址,而且p2只能指向a的地址,不可再指向其他变量的地址。
//p2 = &b;//直接编译错误//p2是一个常量指针,p2只能指向固定的一个变量的地址,但可以用*p2读写这个变量的值。 return ;
}

2. int *const p = &i;
const用来修饰p,p是一个常量指针,p只能指向固定的一个变量的地址,但可以用*p读写这个变量的值。

指针p的地址不可变。即表示p指向了i的地址,而且p只能指向i的地址,不可再指向其他变量的地址。

int i = 0;
int j = 0;
int *const p = &i;
p = &j;    //错误
i = 1;    //正确
*p = 1;    //正确

3.const int *const p = &i;

同时限制了指针指向的内容和指向的地址。

const类型变量的详细解读的更多相关文章

  1. MemCache超详细解读

    MemCache是什么 MemCache是一个自由.源码开放.高性能.分布式的分布式内存对象缓存系统,用于动态Web应用以减轻数据库的负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高 ...

  2. MemCache超详细解读 图

    http://www.cnblogs.com/xrq730/p/4948707.html   MemCache是什么 MemCache是一个自由.源码开放.高性能.分布式的分布式内存对象缓存系统,用于 ...

  3. MemCache详细解读

    MemCache是什么 MemCache是一个自由.源码开放.高性能.分布式的分布式内存对象缓存系统,用于动态Web应用以减轻数据库的负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高 ...

  4. C++ 中的 const 类型变量

    之前总感觉C/C++中有const 限定的变量是个很头痛的问题,一会儿能够变.一会儿不能够变,一会儿把const赋给nonconst,一会儿又把nonconst赋给const,头都被它搞大了.今天刚好 ...

  5. rpm软件包管理的详细解读

    CentOS系统上使用rpm命令管理程序包:安装.卸载.升级.查询.校验.数据库维护 1.基本安装 rpm -ivh PackageFile 2.rpm选项 rpm -ivh --test Packa ...

  6. Android BLE蓝牙详细解读

    代码地址如下:http://www.demodashi.com/demo/15062.html 随着物联网时代的到来,越来越多的智能硬件设备开始流行起来,比如智能手环.心率检测仪.以及各式各样的智能家 ...

  7. 为你详细解读HTTP请求头的具体含意

    当我们打开一个网页时,浏览器要向网站服务器发送一个HTTP请求头,然后网站服务器根据HTTP请求头的内容生成当次请求的内容发送给浏览器.你明白HTTP请求头的具体含意吗?下面一条条的为你详细解读,先看 ...

  8. 详细解读Volley(三)—— ImageLoader & NetworkImageView

    ImageLoader是一个加载网络图片的封装类,其内部还是由ImageRequest来实现的.但因为源码中没有提供磁盘缓存的设置,所以咱们还需要去源码中进行修改,让我们可以更加自如的设定是否进行磁盘 ...

  9. 【Python】【Web.py】详细解读Python的web.py框架下的application.py模块

    详细解读Python的web.py框架下的application.py模块   这篇文章主要介绍了Python的web.py框架下的application.py模块,作者深入分析了web.py的源码, ...

随机推荐

  1. stack 的优势 - 每天5分钟玩转 Docker 容器技术(113)

    stack 将应用所包含的 service,依赖的 secret.voluem 等资源,以及它们之间的关系定义在一个 YAML 文件中.相比较手工执行命令或是脚本,stack 有明显的优势. YAML ...

  2. 重写JS的鼠标右键点击菜单

    重写JS的鼠标右键点击菜单 该效果主要有三点,一是对重写的下拉菜单的隐藏和显示:二是屏蔽默认的鼠标右键事件:三是鼠标左键点击页面下拉菜单隐藏. 不多说,上html代码: 1 <ul id=&qu ...

  3. 写给小白的JAVA链接MySQL数据库的步骤(JDBC):

    作为复习总结的笔记,我罗列了几个jdbc步骤,后边举个简单的例子,其中的try块请读者自行处理. /* * 1.下载驱动包:com.mysql.jdbc.Driver;网上很多下载资源,自己找度娘,此 ...

  4. Java NIO (五) 管道 (Pipe)

    Java NIO 管道是2个线程之间的单向数据连接.Pipe有一个source通道和一个sink通道.数据会被写到sink通道,从source通道读取. 如下图: 向管道写数据: 从管道读数据: 1. ...

  5. rabbitMQ教程(三) spring整合rabbitMQ代码实例

    一.开启rabbitMQ服务,导入MQ jar包和gson jar包(MQ默认的是jackson,但是效率不如Gson,所以我们用gson) 二.发送端配置,在spring配置文件中配置 <?x ...

  6. jQuery知识盲点

    一.属性操作 元素的尺寸 width() height() innerWidth() innerHeight() outerWidth() outerHeight() $('div').width() ...

  7. 每天学一点Docker(2)

    容器runtime 容器runtime是容器真正运行的地方,runtime需要和操作系统kernel紧密结合,为容器提供运行环境. 比如说,java程序比作一个容器,JVM就是runtime.JVM为 ...

  8. JS函数的参数声明中用 var 与不用 var的区别

    1.var 声明的变量,作用域是当前 function 2.没有声明的变量,直接赋值的话, 会自动创建变量,但作用域是全局的. 例如: function doSth() { a = "AAA ...

  9. 用Python让单片机“行动”起来——MicroPython实战入门篇

    MicroPython以微控制器作为目标,从而使得Python可以用来控制硬件.说到MicroPython,也许有人会感到陌生.而说到和它密切相关的Python,是否会恍然大悟呢?Python属于解释 ...

  10. checkbox对齐-复选框图标

    checkbox对齐-复选框图标 一般开发过程中,我们直接使用<input type="checkbox"/>这样出现的复选框,设计师一般都说不好看 而让我们按照设计稿 ...