const关键字与指针

1、const修饰指针的四种形式
a.  const是关键字,在C语言中原来修饰变量,表示这个变量是常量。
  const int iNum = 10; 和 int const iNum = 10;的效果是一样的。
  
b.  const修饰指针有4种形式。区分清楚这4种即可全部理解const和指针。
1)const int *p
  p是一个指针,指向一个int型数据,p所指向的是个常量。
  (p本身不是const, 而p指向的变量是const)
 
2)int const *p
  p是一个指针,指向一个int型数据,p所指向的是个常量。
  (p本身不是const, 而p指向的变量是const)
  
  int main(int argc, char* argv[])
{
    const int *p;     //定义一个指向int型的指针p,p所指向的是一个常量
    int iNum = 10;
    p = &iNum;
    (*p)++;           //这样操作会出现错误,p所指向的是个常量,其值不能被修改。
    
    printf("*p = %d.\n", *p);
    
    return 0;
}

3)int *const p
  p是一个指针,指向一个int型数据,p本身是常量,p所指向的是个变量。
  (p本身是const,p指向的变量不是const)
  
4)const int *const p
  p是一个指针,指向一个int型数据,p本身是常量,p所指向的是个常量。
  (p本身是const,p指向的变量也是const)

结论和记忆方法:
关于指针变量的理解,主要涉及到两个变量,第一个是指针变量p本身,第二个是p指向的那个变量(*p)
一个const关键字只能修饰一个变量,所以弄清楚这4个表达式的关键就是搞清楚const放在某个位置修饰谁的。
a.  const在*前面,就表示const作用于p所指向的量。所以这个时候p所指向的是个常量。
b.  const在*后面,表示p本身是个常量,但是p指向的不一定是常量。   
  
2、const修饰变量真的不能改吗?
a.  const修饰的变量到底能不能被改,取决于编译的环境。

b.  在gcc环境下,是可以通过间接去改的。如给出的代码可以验证。
在gcc中,const是通过编译器在编译的时候执行检查来确保实现的(也就是说const类型的变量不能改是编译错误不是运行时错误)。所以想办法骗过编译器,就可以修改const定义的常量,运行时不会报错。更深层的原因是gcc把const类型的常量也放在了data段,其实和普通变量的全局变量放在data段的实现是一样的。只是编译器认定这个变量是const,运行时并没有标记const标志,所以只要骗过了编译器就可以修改了。

c.  在单片机的环境下,const修饰的变量是不可以被改的。

#include<stdio.h>
int main(int argc, char* argv[])
{
    const int a = 10;
    int *p = NULL;
    p = (int *)&a;
    *p = 12;
    printf("a = %d.\n", a);   // a = 12;
    
    return 0;
}
3、const究竟该怎么用
const是在编译器中实现的,编译时检查,并非不能骗过。大家使用const是在传递一种信息,就是告诉编译器、也告诉读程序的人,这个编译时不应该也不必要被修改的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值