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是可变的。

 

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

 

 1 int a = 10;
 2 const int *p = &a;
 3 *p = 12;                //这段程序的编译是错误的,会提示: attempt to modify object qualified const
 4 
 5 
 6 int a = 10;
 7 int b = 20;
 8 const int *p;
 9 p = &a;
10 *p  //*p输出的是10
11 p = &b;
12 *p //*p输出的是20
13 
14 int a;
15 int b;
16 int *const p = &a;
17 p = &b;                //这里会编译出错

 

转载于:https://www.cnblogs.com/Hlg-Blogs/p/10250113.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值