在C编程中使用到的几个重要关键字之一const_在c程序中定义一个数组用哪些关键字-程序员宅基地

技术标签: 语言  c  编译器  Linux  string  php  编程  Windows相关  

const是一个C语言的关键字,它限定一个变量不允许被改变。使用const在一定程度上可以提高程序的安全性和可靠性,另外,在观看别人代码的时候,清晰理解const所起的作用,对理解对方的程序也有一些帮助。另外CONST在其他编程语言中也有出现,如C++、PHP5、C#.net、HC08 C。

  C中CONST的使用:
  虽然这听起来很简单,但实际上,const的使用也是c语言中一个比较微妙的地方,微妙在何处呢?请看下面几个问题。
  问题:const变量 & 常量
  为什么下面的例子在使用一个const变量来初始化数组,ANSI C的编译器会报告一个错误呢? 
  const int n = 5;
  int a[n];
  答案与分析:
  1)、这个问题讨论的是“常量”与“只读变量”的区别。常量肯定是只读的,例如5, "abc",等,肯定是只读的,因为常量是被编译器放在内存中的只读区域,当然也就不能够去修改它。而“只读变量”则是在内存中开辟一个地方来存放它的值,只不过这个值由编译器限定不允许被修改。C语言关键字const就是用来限定一个变量不允许被改变的修饰符(Qualifier)。上述代码中变量n被修饰为只读变量,可惜再怎么修饰也不是常量。而ANSI C规定数组定义时长度必须是“常量”,“只读变量”也是不可以的。
  2)、注意:在ANSI C中,这种写法是错误的,因为数组的大小应该是个常量,而const int n,n只是一个变量(常量 != 不可变的变量,但在标准C++中,这样定义的是一个常量,这种写法是对的),实际上,根据编译过程及内存分配来看,这种用法本来就应该是合理的,只是 ANSI C对数组的规定限制了它。
  3)、那么,在ANSI C 语言中用什么来定义常量呢?答案是enum类型和#define宏,这两个都可以用来定义常量。
  问题:const变量 & const 限定的内容
  下面的代码编译器会报一个错误,请问,哪一个语句是错误的呢? 
  typedef char * pStr;
  char string[4] = "abc";
  const char *p1 = string;
  const pStr p2 = string;
  p1++;
  p2++;
  答案与分析:
  问题出在p2++上。
  1)、const使用的基本形式: const char m;
  限定m不可变。
  2)、替换1式中的m, const char *pm;
  限定*pm不可变,当然pm是可变的,因此问题中p1++是对的。
  3)、替换1式char, const newType m;
  限定m不可变,问题中的charptr就是一种新类型,因此问题中p2不可变,p2++是错误的。
  问题:const变量 & 字符串常量
  请问下面的代码有什么问题?
  char *p = "i'm hungry!";
  p[0]= 'I';
  答案与分析:
  上面的代码可能会造成内存的非法写操作。分析如下, "i'm hungry"实质上是字符串常量,而常量往往被编译器放在只读的内存区,不可写。p初始指向这个只读的内存区,而p[0] = 'I'则企图去写这个地方,编译器当然不会答应。
  问题:const变量 & 字符串常量2
  请问char a[3] = "abc" 合法吗?使用它有什么隐患?
  答案与分析:
  在标准C中这是合法的,但是它的生存环境非常狭小;它定义一个大小为3的数组,初始化为"abc",注意,它没有通常的字符串终止符'\0',因此这个数组只是看起来像C语言中的字符串,实质上却不是,因此所有对字符串进行处理的函数,比如strcpy、printf等,都不能够被使用在这个假字符串上。
  问题5:const & 指针
  类型声明中const用来修饰一个常量,有如下两种写法,那么,请问,下面分别用const限定不可变的内容是什么?
  1)、const在前面
  const int nValue; //nValue是const
  const char *pContent; //*pContent是const, pContent可变
  const (char *) pContent;//pContent是const,*pContent可变
  char* const pContent; //pContent是const,*pContent可变
  const char* const pContent; //pContent和*pContent都是const
  2)、const在后面,与上面的声明对等
  int const nValue; // nValue是const
  char const * pContent;// *pContent是const, pContent可变
  (char *) const pContent;//pContent是const,*pContent可变
  char* const pContent;// pContent是const,*pContent可变
  char const* const pContent;// pContent和*pContent都是const
  答案与分析:
  const和指针一起使用是C语言中一个很常见的困惑之处,在实际开发中,特别是在看别人代码的时候,常常会因为这样而不好判断作者的意图,下面讲一下我的判断原则:
  (这个规则是错的)(因为“()”的出现,使得这个规则有时候是不成立的)沿着*号划一条线,如果const位于*的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于*的右侧,const就是修饰指针本身,即指针本身是常量。你可以根据这个规则来看上面声明的实际意义,相信定会一目了然。
  另外,需要注意:对于const (char *) ; 因为char *是一个整体,相当于一个类型(如 char),因此,这时限定指针是const。
  一个简单的判断方法:指针运算符*,是从右到左,那么如:char const * pContent,可以理解为char const (* pContent),即* pContent为const,而pContent则是可变的。
 
出处:http://baike.baidu.com/view/1065598.htm
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/dearwind153/article/details/7422865

智能推荐

LeetCode 226 翻转-程序员宅基地

文章浏览阅读224次。问题:解题思路:把一个二叉树的 每一个节点的左右子树交换就会得到一个翻转之后的二叉树。解题结果:/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val = val; }* TreeNode(int val

2. UE5 RPG使用动画模板创建多个动画蓝图_ue5 使用动画模板-程序员宅基地

文章浏览阅读687次,点赞6次,收藏11次。这里就需要介绍一下动画模板,我们可以将动画蓝图相同的内容放置到一个动画模板内,去修改需求也就不会需要单独的去修改每个动画蓝图。我们制作游戏的时候,角色会根据不同的武器表现出来不同的攻击动画,待机动画以及移动动画。在帧更新里面,获取角色移动组件是否存在,然后获取到角色的这一帧的移动长度,并转换为速度。如果设置的正确,则左侧的模型将会播放动画。到这里,一个简单的动画模板创建完成,接下来,我们将基于这个模版创建动画蓝图使用。在创建指定骨架使用的动画蓝图时,我们需要指定父类使用前面创建的动画蓝图的模板。_ue5 使用动画模板

Socket通信,实现简单的双人聊天功能_react+socket.io怎么进行两台电脑聊天-程序员宅基地

文章浏览阅读478次。Socket通信1.简单介绍学习Socket也只是通过一个小例子学习的,关于Socket原理目前只是了解到是基于TCP协议,关于TCP与UDP协议区别可以去百度详情查一下他们的区别之处,大体上是传输高效与安全方面的区别。2.代码实现关于双人聊天功能实现时候,大体分为一个客户端类,一个服务端类,服务器与客户端之间可以相互发送消息。在客户端和服务端中有监听类和发送类,实现互相之间发送消息。核心代码://监听消息及打印出ObjectInputStream ois = new Obje._react+socket.io怎么进行两台电脑聊天

[Java]JavaWeb学习笔记(尚硅谷2020旧版)_javaweb笔记 尚硅谷-程序员宅基地

文章浏览阅读2.7k次,点赞3次,收藏32次。 Tomcat JavaWeb相关概念 Web资源的分类 常用的 Web 服务器 Tomcat 服务器和 Servlet 版本的对应关系 Tomcat的使用 下载 Tomcat目录介绍 启动Tomcat服务器方式一 常见启动失败情况 双击 startup.bat 文件出现一个小黑窗口一闪而过 常见JAVA_HOME配置失败情况 启动Tomcat服务器方式二 Tomcat 的停止 修改 Tomcat 的端口号 部暑 web 工程到_javaweb笔记 尚硅谷

linux curl命令_curl 输出到文件-程序员宅基地

文章浏览阅读1.8k次。curl命令是一个利用URL规则在命令行下工作的文件传输工具。它支持文件的上传和下载,所以是综合传输工具,但按传统,习惯称curl为下载工具。作为一款强力工具,curl支持包括HTTP、HTTPS、ftp等众多协议,还支持POST、cookies、认证、从指定偏移处下载部分文件、用户代理字符串、限速、文件大小、进度条等特征。做网页处理流程和数据检索自动化,curl可以祝一臂之力。语法curl(选项..._curl 输出到文件

Flutter 常用插件_flutter 插件集合-程序员宅基地

文章浏览阅读3.7k次,点赞3次,收藏18次。flutter 常用插件_flutter 插件集合

随便推点

宠物医院电子处方软件操作教程,兽医处方笺范例经验分享-程序员宅基地

文章浏览阅读759次,点赞20次,收藏12次。以下软件操作教程以,佳易王宠物店兽医电子处方管理系统软件为例说明软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载软件基本功能:权限管理,系统设置,开电子处方,处方查询,统计报表软件已内置数据库,可以下Z试用。兽医电子处方开单,使用A5纸打印【可以定制】

第二章 Flink集成Iceberg的集成方式及基本SQL使用_iceberg0.1 hive3.12 flink1.14-程序员宅基地

文章浏览阅读1.6k次。Flink集成Iceberg的集成方式及基本SQL使用_iceberg0.1 hive3.12 flink1.14

网站服务器高主频还是多核心,CPU核心多好还是主频高好?核心多和主频高区别介绍...-程序员宅基地

文章浏览阅读1.2k次。CPU Render,平均:100fps、最低:78fps、最高:148fps《古墓丽影:暗影》的Benchmark程序可以记录处理器渲染性能,所以既然是对比处理器,那么这一项性能就比较关键了。从测试结果可以看到:英特尔十代酷睿平台在CPU Render(渲染)测试中,平均:116fps、最低:63fps、最高:235fps;AMD三代锐龙平台在CPU Render测试中,平均:100fps、最低..._服务器处理大数据是多核好还是高频好

Kaggle 机器学习竞赛冠军及优胜者的源代码汇总_allstate kaggle-程序员宅基地

文章浏览阅读6.7k次。Kaggle 机器学习竞赛冠军及优胜者的源代码汇总_allstate kaggle

2023/9/17 基于pycharm的爬取豆瓣电影250(一)_如何用pycharm找电影-程序员宅基地

文章浏览阅读1k次,点赞2次,收藏16次。最近用一周的时间进行学习,因此特地记录所学知识,并向外输出以此加深自己的印象。_如何用pycharm找电影

【网络】WireShark过滤 | WireShark实现TCP三次握手和四次挥手_tcp中过滤tcp三次握手-程序员宅基地

文章浏览阅读3.3k次,点赞135次,收藏157次。wireshark是非常流行的网络封包分析软件,功能十分强大。可以截取各种网络封包,显示网络封包的详细信息。常用来检测网络问题、攻击溯源、或者分析底层通信机制。_tcp中过滤tcp三次握手

推荐文章

热门文章

相关标签