前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >C语言: const关键字与指针

C语言: const关键字与指针

作者头像
用户3479834
发布于 2021-02-03 06:27:37
发布于 2021-02-03 06:27:37
70200
代码可运行
举报
文章被收录于专栏:游戏开发司机游戏开发司机
运行总次数:0
代码可运行

const修饰指针的4种形式

  • const关键字,在C语言中用来修饰变量,表示这个变量是常量。
  • const修饰指针有4种形式,区分清楚这4种即可全部理解const和指针。
    • 第一种:const int *p;
    • 第二种:int const *p;
    • 第三种:int * const p;
    • 第四种:const int * const p;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制




// 第一种
const int *p1;    // p本身不是cosnt的,而p指向的变量是const的
// 第二种
int const *p2;    // p本身不是cosnt的,而p指向的变量是const的

// 第三种
int * const p3;    // p本身是cosnt的,p指向的变量不是const的
// 第四种
const int * const p4;// p本身是cosnt的,p指向的变量也是const的
*p1  = 3;    // error: assignment of read-only location ‘*p1’
p1 = &a;    // 编译无错误无警告

*p2 = 5;    // error: assignment of read-only location ‘*p2’
p2 = &a;    // 编译无错误无警告

*p3 = 5;    // 编译无错误无警告
p3 = &a;    // error: assignment of read-only variable ‘p3’

p4 = &a;    // error: assignment of read-only variable ‘p4’
*p4 = 5;    // error: assignment of read-only loc
  • 关于指针变量的理解,主要涉及到2个变量:
    • 第一个是指针变量p本身,第二个是p指向的那个变量(*p)。
    • 一个const关键字只能修饰一个变量,所以弄清楚这4个表达式的关键就是搞清楚const放在某个位置是修饰谁的

const修饰的变量真的不能改吗?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制




const int a = 5;
//a = 6;        // error: assignment of read-only variable ‘a’
int *p;
p = (int *)&a;      // 这里报警告可以通过强制类型转换来消除
*p = 6;
printf("a = %d.\n", a);  // a = 6,结果证明const类型的变量被改
  • const修饰的变量其实是可以改的(前提是gcc环境下)。
  • 在某些单片机环境下,const修饰的变量是不可以改的。const修饰的变量到底能不能真的被修改,取决于具体的环境,C语言本身并没有完全严格一致的要求。
  • 在gcc中,const是通过编译器在编译的时候执行检查来确保实现的(也就是说const类型的变量不能改是编译错误,不是运行时错误。)所以我们只要想办法骗过编译器,就可以修改const定义的常量,而运行时不会报错。
  • 更深入一层的原因,是因为gcc把const类型的常量也放在了data段,其实和普通的全局变量放在data段是一样实现的,只是通过编译器认定这个变量是const的,运行时并没有标记const标志,所以只要骗过编译器就可以修改了。

const究竟应该怎么用

  • const是在编译器中实现的,编译时检查,并非不能骗过。所以在C语言中使用const,就好象是 一种道德约束而非法律约束
  • 所以大家使用const时更多是传递一种信息,就是告诉编译器、也告诉读程序的人,这个变量是不应该也不必被修改的。
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-12-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 游戏开发司机 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • const修饰指针的4种形式
  • const修饰的变量真的不能改吗?
  • const究竟应该怎么用
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档