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 ...
随机推荐
- Curl 请求数据多’1‘
今天做curl请求时遇到一个问题 数据请求回来,无缘无故多了1 加上这一行代码就就可以了:curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
- asp.net core 系列 12 选项 TOptions
一.概述 本章讲的选项模式是对Configuration配置的功能扩展. 讲这篇时有个专用名词叫“选项类(TOptions)” .该选项类作用是指:把选项类中的属性与配置来源中的键关联起来.举个例,假 ...
- 【朝花夕拾】Android性能篇之(二)Java内存分配
前言 在内存方面,相比于C/C++程序员,咱们java系程序员算是比较幸运的,因为对于内存的分配和回收,都交给了JVM来处理了,而不需要手动在代码中去完成.有了虚拟机内存管理机制,也就不 ...
- SpringMvc通过@Value( ) 给静态变量注入值
spring 不允许/不支持把值注入到静态变量中,如: @Value("${ES.CLUSTER_NAME}")private static String CLUSTER_NAME ...
- adb server is out of date. killing... ADB server didn't ACK解决方法
在使用ADT Bundle进Android开发时,有时经常会碰到如下错误提示: adb server is out of date. killing... ADB server didn't ACK ...
- Windows 下常见的反调试方法
稍稍总结一下在Crack或Rervese中比较常见的一些反调试方法,实现起来也比较简单,之后有写的Demo源码参考,没有太大的难度. ①最简单也是最基础的,Windows提供的API接口:IsDebu ...
- 使用MaxCompute Java SDK运行安全相关命令
使用MaxCompute Console的同学,可能都使用过MaxCompute安全相关的命令.官方文档上有详细的MaxCompute安全指南,并给出了安全相关语句汇总. 简而言之,权限管理.列级 ...
- 痞子衡嵌入式:常用的数据差错控制技术(2)- 奇偶校验(Parity Check)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家讲的是嵌入式里数据差错控制技术-奇偶校验. 在系列第一篇文章里,痞子衡给大家介绍了最简单的校验法-重复校验,该校验法实现简单,检错纠错能力都还不 ...
- eclipse maven 打war包的几种方式
第一种:利用pom.xml文件打包. 右键pom.xml文件,选择Debug as或Run as 都行.但需要选择Maven install 打包 执行成功后,日志会打印出位置(看自己配置是否日志输 ...
- vue webpack打包背景图片
vue的背景图 和 img标签图大于10KB都不会转成base64处理,可以设置limit(不推荐),所以要设置一个公共路径,解决办法如下