const int *p;int *const p;区别及用法
在单片机程序设计中,我们经常会用到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;区别及用法的更多相关文章
- const int * p 和 int const * p 和 int * const p 的区别
首先注意,const int * p 和int const *p 是一样的,并且不管是不是*p,即使const int i和int const i也是一样的,所以我们接下来只讨论int const * ...
- const int * pi/int * const pi的区别
前面有一篇文章:数组名就是常量指针 参考文章:http://blog.pfan.cn/whyhappy/5164.html const int * pi .int const * pi与int * ...
- const int *p,int *const p区别(转)
1)先从const int i说起.使用const修饰的i我们称之为符号常量.即,i不能在其他地方被重新赋值了.注意:const int i与int const i是等价的,相同的,即const与in ...
- int main (int argc, const char * argv[0]) 中参数的含义;指针数组和数组指针
恩,有的编译器初始化时候会产生这样的参数 argc是命令行总的参数个数,argv[]是argc个参数,其中第0个参数是程序的全名 1. 几种C++ 常见的参数种类 int main(void); in ...
- c语言检测文件是否存在int __cdecl access(const char *, int);
最近写代码,遇到很多地方需要判断文件是否存在的.网上的方法也是千奇百怪,“百家争鸣”. fopen方式打开的比较多见,也有其他各种方式判断文件是否存在的,由于其他方法与本文无关,所以不打算提及. 笔者 ...
- 对于这个函数const int func(const int& a) const声明中,三个const分别是什么意思?
第一个const 函数的返回值类型是const. 这个const修饰没什么意义,你可以想象一下: 既然是函数的 返回值,而且是值传递的形式,是否const有什么意义.如果指针(引用)传递,怎表示返回值 ...
- 【转】int const A::func()和int A::func() const
int const A::func() { return 0; }int A::func() const { return 0; } 上面的代码是合法的,其中A::func成员函数[只能在成员函数后面 ...
- C/C++中的const int*和int * const
代码: #include <iostream> using namespace std; int main(){ const int *p; ; p = &a; a = ; cou ...
- const vector<int> 和 vector<const int>问题讨论
1.const vector <int> vec(10) —— 与const int a[10]是一回事,意思是vec只有10个元素,不能增加了,里面的元素也是不能变化的 vector&l ...
随机推荐
- ASP.NET Core 2.0 MVC项目实战
一.前言 毕业后入职现在的公司快有一个月了,公司主要的产品用的是C/S架构,再加上自己现在还在学习维护很老的delphi项目,还是有很多不情愿的.之前实习时主要是做.NET的B/S架构的项目,主要还是 ...
- JVM基础系列开篇:为什么要学虚拟机?
跟许多人一样,我一开始接触 Java 虚拟机只是因为面试需要用到,所以硬着头皮看看.所以很多人对于为什么要学虚拟机这个问题,他们的答案都是:因为面试.但我经过了几年的学习和实战,我发现其实学习虚拟机并 ...
- 『2019/3/19 USACO测试 反思与总结』
2019/3/8 USACO测试 这是第三次考试了,不过这一次没有上一次考得好,也算是比较失误的,有一道题思路对但是写挂了. 还是看一下试题安排: 题号 试题分组 考察算法 思维难度 代码难度 1 银 ...
- SpringBoot入门教程(三)通过properties实现多个数据库环境自动切换配置
前面的文章已经介绍了CentOS部署SpringBoot项目从0到1的详细过程,包括Linux安装ftp.Tomcat以及Java jdk的全部过程.这篇文章主要介绍关于springboot如何通过多 ...
- 『Asp.Net 组件』Asp.Net 服务器组件 的开发优势和劣势
在写<Asp.Net 服务器组件系列文档>之前,笔者不才,揣测微软战略用意: 微软利益诉求莫过于 微软产品和技术的市场份额: 因此,微软战略之一莫过于将 所有开发人员 团聚在 微软周围,以 ...
- 【WCF学习大全】
我的WCF之旅(1):创建一个简单的WCF程序 我的WCF之旅(2):Endpoint Overview 我的WCF之旅(3):在WCF中实现双向通信(Bi-directional Communica ...
- 新的一年,来看看大数据与AI的未来展望
本文由云+社区发表 作者:堵俊平 在数据爆炸与智能革命的新时代,新的平台与应用层出不穷,开源项目推动了前沿技术和业界生态快速发展.本次分享将以技术和生态两大视角来看大数据和人工智能技术的发展,通过分析 ...
- 是时候给你的产品配一个AI问答助手了!
本文由云+社区发表 | 导语 问答系统是信息检索的一种高级形式,能够更加准确地理解用户用自然语言提出的问题,并通过检索语料库.知识图谱或问答知识库返回简洁.准确的匹配答案.相较于搜索引擎,问答系统能更 ...
- MySQL在线DDL gh-ost 使用说明
背景: 作为一个DBA,大表的DDL的变更大部分都是使用Percona的pt-online-schema-change,本文说明下另一种工具gh-ost的使用:不依赖于触发器,是因为他是通过模拟从库, ...
- 多线程Thread,线程池ThreadPool
首先我们先增加一个公用方法DoSomethingLong(string name),这个方法下面的举例中都有可能用到 #region Private Method /// <summary> ...