const类型变量的详细解读
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类型变量的详细解读的更多相关文章
- MemCache超详细解读
MemCache是什么 MemCache是一个自由.源码开放.高性能.分布式的分布式内存对象缓存系统,用于动态Web应用以减轻数据库的负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高 ...
- MemCache超详细解读 图
http://www.cnblogs.com/xrq730/p/4948707.html MemCache是什么 MemCache是一个自由.源码开放.高性能.分布式的分布式内存对象缓存系统,用于 ...
- MemCache详细解读
MemCache是什么 MemCache是一个自由.源码开放.高性能.分布式的分布式内存对象缓存系统,用于动态Web应用以减轻数据库的负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高 ...
- C++ 中的 const 类型变量
之前总感觉C/C++中有const 限定的变量是个很头痛的问题,一会儿能够变.一会儿不能够变,一会儿把const赋给nonconst,一会儿又把nonconst赋给const,头都被它搞大了.今天刚好 ...
- rpm软件包管理的详细解读
CentOS系统上使用rpm命令管理程序包:安装.卸载.升级.查询.校验.数据库维护 1.基本安装 rpm -ivh PackageFile 2.rpm选项 rpm -ivh --test Packa ...
- Android BLE蓝牙详细解读
代码地址如下:http://www.demodashi.com/demo/15062.html 随着物联网时代的到来,越来越多的智能硬件设备开始流行起来,比如智能手环.心率检测仪.以及各式各样的智能家 ...
- 为你详细解读HTTP请求头的具体含意
当我们打开一个网页时,浏览器要向网站服务器发送一个HTTP请求头,然后网站服务器根据HTTP请求头的内容生成当次请求的内容发送给浏览器.你明白HTTP请求头的具体含意吗?下面一条条的为你详细解读,先看 ...
- 详细解读Volley(三)—— ImageLoader & NetworkImageView
ImageLoader是一个加载网络图片的封装类,其内部还是由ImageRequest来实现的.但因为源码中没有提供磁盘缓存的设置,所以咱们还需要去源码中进行修改,让我们可以更加自如的设定是否进行磁盘 ...
- 【Python】【Web.py】详细解读Python的web.py框架下的application.py模块
详细解读Python的web.py框架下的application.py模块 这篇文章主要介绍了Python的web.py框架下的application.py模块,作者深入分析了web.py的源码, ...
随机推荐
- 724. Find Pivot Index
Given an array of integers nums, write a method that returns the "pivot" index of this arr ...
- bzoj 2298: [HAOI2011]problem a
Description 一次考试共有n个人参加,第i个人说:"有ai个人分数比我高,bi个人分数比我低."问最少有几个人没有说真话(可能有相同的分数) Input 第一行一个整数n ...
- ES6 函数的扩展1
1. 函数参数的默认值 基本用法 在ES6之前,不能直接为函数的参数指定默认值,为了避免这个问题,通常需要先判断一下参数y是否被赋值,如果没有,再等于默认值. ES6允许为函数的参数设置默认值,即直接 ...
- cut 命令详解
cut 作用:按列提取文件 参数: -d 指明列分隔符 -f 选择输出的区域 -c 指定字符位置 -b :以字节为单位进行分割.这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志. -c : ...
- 微信小程序如何开发制作
微信小程序如何开发制作 微容SMO是一款微信小程序的免费在线制作工具,用户在微容平台上无需编辑代码,可通过拖拽式操作即可完成小程序的制作,真正意义上实现了小程序零代码免费制作! 消除技术门槛:无需代码 ...
- Java订单功能模块设计与实现
在商城项目中,之前我们介绍了购物车功能模块的实现,商品加入到购物车之后,就是到购物车结算,然后显示购物车的商品列表,点击去结算,然后到了未提交前的订单列表, 点击提交订单后,生成此订单,返回订单的订单 ...
- 三十天学不会TCP,UDP/IP网络编程-TraceRoute的哲学
新年快乐,继续来部分粘贴复制我的这一系列文章啦,如果对和程序员有关的计算机网络知识,和对计算机网络方面的编程有兴趣,欢迎去gitbook(https://www.gitbook.com/@rogerz ...
- Spark监控官方文档学习笔记
任务的监控和使用 有几种方式监控spark应用:Web UI,指标和外部方法 Web接口 每个SparkContext都会启动一个web UI,默认是4040端口,用来展示一些信息: 一系列调度的st ...
- 前端之JavaScript--基础
JavaScript 独立的语言,浏览器具有js解释器 一. JavaScript代码存在形式: - Head中 <script> //javascript代码 alert(123); & ...
- MicroPython-GPRS教程之TPYBoardv702GPRS功能测试
一.什么是TPYBoardV702 TPYBoardV702是目前市面上唯一支持通信通信功能的MicroPython开发板:支持Python3.0及以上版本直接运行.支持GPS+北斗双模通信.GPRS ...