补充知识

  • “const int i”与“int const i”之间的区别
  • 对变量来说,const 关键字可以限定一个变量的值不允许改变,从而保护被修饰的东西,防止意外修改,在一定程度上可以提高程序的安全性和可靠性。

代码

const int *

int i1 = 10;
int i2 = 20;
const int *p = &i1;
/* 输出结果是10 */
printf("%d\n", *p);
p = &i2;
/* 输出结果是20 */
printf("%d\n", *p);
i2 = 30;
/* 输出结果是30 */
printf("%d\n", *p);
  • 为什么 p 的值是可以被修改的,它可以重新指向另一个地址呢
  • 这里的 const 关键字修饰的是整个“*p”,而不是 p。所以这里的“*p”是不能被赋值的,也就是说我们不能通过“*p”来修改 i2 的值。
  • 其次,p 前并没有用 const 关键字进行修饰,所以 p 是指针变量,能被赋值重新指向另一内存地址。也就是说下面的代码是合法的:p = &i2; i2 = 30;
  • “int*const p”这种声明形式。很显然,这里的 const 是写在 p 前和 * 号后的,而不是写在“*p”前的,所以它是用来修饰限定 p 的

int *const

int i1 = 10;
int i2 = 20;
int *const p = &i1;
/* 输出结果是10 */
printf("%d\n", *p);
/* p=&i2; p不能再这样重新赋值了,即不能再指向另一个新地址*/
/* 可以通过*p修改i1的值*/
i1 = 30;
/* 输出结果是30 */
printf("%d\n", *p);
  • p 因为有了 const 的修饰,所以只是一个指针常量。因此,这里的 p 值是不能重新赋值修改的,它只能永远指向初始化时的内存地址。即下面的代码是不合法的:
  • p = &i2; //p不能再这样重新赋值了,即不能再指向另一个新地址
  • 但是,也正因为这里的整个“*p”的前面没有 const 修饰。也就是说,“*p”是变量而不是常量,所以我们可以通过“*p”来修改它所指内存 i1 的值。因此,下面的语句是合法的:
  • 由此可见,如果关键字 const 直接写在“*p”前,则程序不能修改“*p”,但可以修改 p;如果关键字 const 直接写在 p 前,则程序不能修改的是 p,但可以通过“*p”来修改它所指内存的值。理解这两点很重要,否则很难掌握“const int*p”与“int*const p”两者之间的根本区别。

总结

const int i=10;
int *p;
/* 强制类型转换*/
p= (int *) &i;
printf("*p=%d\n",*p)
/*这种赋值是合法的*/
*p=20;
printf("i=%d\n",i);
printf("*P=%d\n",*p);
  • 因为 const int 类型的 i 的地址是不能赋值给指向 int 类型地址的指针 p 的(否则 p 岂不是能修改i的值)。因此下面的语句是不合法的:p = &i
  • 可以通过强制类型转换进行赋值,因此下面的这种赋值方法是合法的  p= (int *) &i;  *p=20;
  • 尽管可以通过强制类型转换进行赋值,也不能通过“*p=20”来修改 i 的值。因此,“printf("i=%d\n”,i)”输出的结果是 10,并不是 20。
  • 示例运行结果为:*p=10  i=10  *p=20

第一个是指针,第二个是指针所指物

p是指指针,*p是指指针所指物

const *p,限制的是(*p),*p不可以动,p可以动

* const  p 限制的是(p),p不可以动,*p可以动

参考链接

  • C语言const int *a和int*const a 的区别详解

const int *a和int*const a 的区别详解相关推荐

  1. mysql int(3)与int(11)的区别详解

    这篇文章主要介绍了mysql int(3)与int(11)的区别详解的相关资料,需要的朋友可以参考下 mysql int(3)与int(11)的区别 总结,int(M) zerofill,加上zero ...

  2. c语言中argc的作用,C语言中 int main(int argc,char *argv[])的两个参数详解

    C语言中 int main(int argc,char *argv[])的两个参数详解 argc是命令行总的参数个数: argv[]是argc个参数,其中第0个参数是程序的全名,以后的参数.命令行后面 ...

  3. 【转载】cocos2d-x类型转换(CCstring int string char UTF-8互转)以及字符串详解

    cocos2d-x中的字符串: <1>:使用 const char* 和 std::string const char* 是C风格的字符串  ,std::string 是C++风格的字符串 ...

  4. 前端开发:JS中let、var和const的区别详解

    前言 前端开发过程中,JS声明变量的关键字想必开发者都不陌生,而且使用的频率在前端开发过程中也是数一数二的.JS中声明变量的关键字有三个let.var和const,但是三者的使用对比和区别也是非常重要 ...

  5. for of 的用法区别_ES6语法:var、let、const的区别详解

    今天来说说es6的语法,最基础的也就是var,let,const 的用法与区别了,我们来看看他们之间的恩怨情仇 首先来说说var,这个只要是学过js的都知道,它是用来声明一个变量的,但是它在开发中也会 ...

  6. java integer == int_Java中int和Integer的区别详解

    1.Java 中的数据类型分为基本数据类型和复杂数据类型 int是前者>>integer 是后者(也就是一个类) 2.初始化时>> int i =1; Integer i= n ...

  7. let const var 区别详解

    let和var区别 一.let不存在变量提升 首先先要了解什么叫变量提升?就是变量声明提前(!注意 不是赋值),var具有这个属性,下面有个小例子: console.log(a) var a='a' ...

  8. C++中的const成员函数(函数声明后加const,或称常量成员函数)用法详解

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

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

最新文章

  1. Crystal For Rubyists 简体中文
  2. python并发编程:阻塞IO
  3. U3D physics总结
  4. Android——浙理体育(飞翔的红蜻蜓)训练记录上传与查询测试DEMO解决方案
  5. 全志A20 刷入Ubuntu/Debian Linux固件 亲测能用
  6. try的动词用法_go on try stop的动词用法 - 英语讨论网
  7. go sublime mysql_Sublime text 3开发GO
  8. python如何创建一个列表_使用python中的format()创建一个列表(make a list using format() in python)...
  9. 【python】matplotlib生成散点矩阵图
  10. 波卡生态项目Polkalokr将在Polkastarter进行IDO
  11. 阿里云OSS进行文件下载时,报NOSuchKeys: com.aliyun.oss.OSSException: The specified key does not exist.
  12. Objective-C 点语法 成员变量的作用域 @property和@synthesize关键字 id类型
  13. 面向对象 —— 类设计(十二)—— 全局变量和成员变量
  14. WPF RadioButton按钮控件取消选中设置
  15. gridview RowCommand 事件获取行索引
  16. IntelliJ IDEA中激活JRebel插件
  17. 百度网页注册HTML代码
  18. 基于电能计量芯片HLW8012计量插座方
  19. Lock接口和AQS原理与实现(Java并发编程的艺术整理)
  20. 虚拟化部署ESXI6.7+intel x710-da4万兆网卡

热门文章

  1. uniapp开发实例github_跨端开发痛点?送你一款Vue最流行的跨端框架——uni-app
  2. 四大开源分布式存储_ipfs分布式存储行业面临着四大主要风险,你知道是哪些吗?...
  3. python gif_python 将png图片格式转换生成gif动画
  4. go MySQL 多语句_八、MySQL经典查询语句-Go语言中文社区
  5. python自动控制库_Python最为神奇的库,可控制你的鼠标键盘自动运行!
  6. C#打开文件和文件夹
  7. 【转】算法导论学习笔记 一 分治算法
  8. TFS多地办公时的处理
  9. powerdesign 缩写AK,PK,IX,CK,FK,DF,UQ
  10. eclipse java maven_java – 非常轻量级的Eclipse-Maven集成 – 仅...