在单片机程序设计中,我们经常会用到const这个关键字,在有些单片机的编译器中可能会是code(比如51系列单片机),但我们在学习C语言的时候,首先还是先学到的const。我们知道,const关键字的含义是"常量的,常数的,不变的"意思。我们最初学到的是cont int a = 5;或者const unsigned char array[5] = {0,1,2,3,4};我们把a、array[n]称之为常值变量。我们在单片机编程中可能不会经常用到const int a = 5这种语句。但我们会经常用到const unsigned int array[5]这种方式。因为我们都知道,我们要把大数组定义到const所指向的存储空间中,在单片机里我姑且把这片空间称为ROM空间。既然是ROM空间,那肯定就是只读空间了,因为单片机的RAM空间少得可怜。我们知道,C语言最伟大的地方,就是设计了指针,指针可以指向任何地方。在初学指针的时候,老师就教我们int *p;p是一个指向int类型的指针变量,如果我们定义了int a = 8; 如果p = &a;那么我把*p = 10;变量a的值也跟着变成10。原因我们都知道,因为P指向了a,p里存放的是a的地址,而*号的意思是取值(内容),*p变了,a当然会变了。在对const 、指针有了初步的了解后,我们就可以理解const int *p了,当然也有写成int const *p的,其实都是一样的。怎么理解呢?我这里也是跟别人学到的,说是,要看const修饰的谁,比如前面的const int a,const修饰的是 a,所以a是一个常值变量,只会在程序初始化时赋值一次,以后不管怎么搞都不会变化的。对于const int *p,const 修饰的是  *p,我们知道,P是指向int类型的指针变量,*p是指向的变量的内容(值),加上const修饰后,是不是可以理解*p是一个常值呢,所以说,是指向常值变量,换句话说是一个指向ROM空间的指针变量。我们在定义const int *p;这种变量的时候,就是为了指向ROM空间,指向一个存常值的空间。这里有些用词可能不太专业,准确。但这里需要注意,对于ROM空间,不是说只能通过定义const int*p;去访问。这里只是向读者说明,const int *p;是一个指向ROM空间的指针变量

理解了const int *p;我们再来理解一下,int * const p,还是根据前面的模式去理解,const 修饰的是p,而p是一个指针,所以,int * const p,定义的p是一个指针常量,这个指什是固定的,只在初始化的时候赋给它一次,以后就不能乱指了。不像const int*p,P是可变的。

这里通过两个实例来说一下,两者的区别:

 int a = ;
const int *p = &a;
*p = ; //这段程序的编译是错误的,会提示: attempt to modify object qualified const int a = ;
int b = ;
const int *p;
p = &a;
*p //*p输出的是10
p = &b;
*p //*p输出的是20 int a;
int b;
int *const p = &a;
p = &b; //这里会编译出错

const int *p;int *const p;区别及用法的更多相关文章

  1. const int * p 和 int const * p 和 int * const p 的区别

    首先注意,const int * p 和int const *p 是一样的,并且不管是不是*p,即使const int i和int const i也是一样的,所以我们接下来只讨论int const * ...

  2. const int * pi/int * const pi的区别

    前面有一篇文章:数组名就是常量指针 参考文章:http://blog.pfan.cn/whyhappy/5164.html const int * pi .int const * pi与int *   ...

  3. const int *p,int *const p区别(转)

    1)先从const int i说起.使用const修饰的i我们称之为符号常量.即,i不能在其他地方被重新赋值了.注意:const int i与int const i是等价的,相同的,即const与in ...

  4. int main (int argc, const char * argv[0]) 中参数的含义;指针数组和数组指针

    恩,有的编译器初始化时候会产生这样的参数 argc是命令行总的参数个数,argv[]是argc个参数,其中第0个参数是程序的全名 1. 几种C++ 常见的参数种类 int main(void); in ...

  5. c语言检测文件是否存在int __cdecl access(const char *, int);

    最近写代码,遇到很多地方需要判断文件是否存在的.网上的方法也是千奇百怪,“百家争鸣”. fopen方式打开的比较多见,也有其他各种方式判断文件是否存在的,由于其他方法与本文无关,所以不打算提及. 笔者 ...

  6. 对于这个函数const int func(const int& a) const声明中,三个const分别是什么意思?

    第一个const 函数的返回值类型是const. 这个const修饰没什么意义,你可以想象一下: 既然是函数的 返回值,而且是值传递的形式,是否const有什么意义.如果指针(引用)传递,怎表示返回值 ...

  7. 【转】int const A::func()和int A::func() const

    int const A::func() { return 0; }int A::func() const { return 0; } 上面的代码是合法的,其中A::func成员函数[只能在成员函数后面 ...

  8. C/C++中的const int*和int * const

    代码: #include <iostream> using namespace std; int main(){ const int *p; ; p = &a; a = ; cou ...

  9. const vector<int> 和 vector<const int>问题讨论

    1.const vector <int> vec(10) —— 与const int a[10]是一回事,意思是vec只有10个元素,不能增加了,里面的元素也是不能变化的 vector&l ...

随机推荐

  1. java代码之美(6)---guava之multimap

    guava之multimap 上一篇讲到Multiset它可以对存入相同元素做一个计数的功能,那multimap呢? 一.概述 1.基本介绍和案例说明 multimap和MultiSet的继承结果很相 ...

  2. Zookeeper知识点

    Zookeeper是一个分布式协调服务 Zookeeper服务器的角色 Leader: 所有的写操作必须要经过Leader完成,在广播给其它服务器.心跳检测.集群中只有一个Leader. Follow ...

  3. Unity GC 优化要点

    参考:http://blog.csdn.net/znybn1/article/details/76464896 为啥要点?因为讲的重点. 游戏运行时来存储数据,当这些数据不再被使用时,存储这些数据的内 ...

  4. 使用dotnet build时复制引用dll到生成目录

    默认配置下dotnet build只会输出项目代码的dll,依赖用的是dotnet缓存中的dll,只有dotnet publish才会把依赖的dll一起输出到生成目录. 在项目csproj文件中添加以 ...

  5. 初识Shiro

    Shiro是Apache基金会下的一个开源安全框架,提供了身份验证.授权.密码学和会话管理等功能,Shiro框架不仅直观易用,而且也能提供健壮的安全性,另外一点值得说的是Shiro的前身是一个始于20 ...

  6. .net core高性能通讯开源组件BeetleX

    BeetleX beetleX是基于dotnet core实现的轻量级高性能的TCP通讯组件,使用方便.性能高效和安全可靠是组件设计的出发点!开发人员可以在Beetlx组件的支持下快带地构建高性能的T ...

  7. SpringBoot+gradle项目构建war

    前言 一开始觉得这并不是什么很难的事情,但是踩坑了之后才发现... 步骤 1.在build.gradle配置文件中加入apply plugin: 'war' 很多人以为这样就完事了,我一开始也是这样认 ...

  8. 【c#】RabbitMQ学习文档(二)Work Queues(工作队列)

        今天开始RabbitMQ教程的第二讲,废话不多说,直接进入话题.   (使用.NET 客户端 进行事例演示)          在第一个教程中,我们编写了一个从命名队列中发送和接收消息的程序. ...

  9. 新的一年,来看看大数据与AI的未来展望

    本文由云+社区发表 作者:堵俊平 在数据爆炸与智能革命的新时代,新的平台与应用层出不穷,开源项目推动了前沿技术和业界生态快速发展.本次分享将以技术和生态两大视角来看大数据和人工智能技术的发展,通过分析 ...

  10. MySQLSource-Flume

    1. 自定义Source说明 实时监控MySQL,从MySQL中获取数据传输到HDFS或者其他存储框架,所以此时需要我们自己实现MySQLSource. 2. 自定义MySQLSource步骤 根据官 ...