没有合适的资源?快使用搜索试试~ 我知道了~
c语言的关键字const等的用法说明,比较详细
资源推荐
资源详情
资源评论
Const 深度解析...................................................................................................................................2
const 用法详解....................................................................................................................................7
的使用
1. const 的用法:
为什么使用 ?
采用符号常量写出的代码更容易维护;指针常常是边读边移动,而不是边写边移动;许多
函数参数是只读不写的。 最常见用途是作为数组的界和 分情况标号(也可以
用枚举符代替)
用法 :常量
取代了 中的宏定义,声明时必须进行初始化。 限制了常量的使用方式,并没有描
述常量应该如何分配。如果编译器知道了某 的所有使用,它甚至可以不为该
分配空间。最简单的常见情况就是常量的值在编译时已知,而且不需要分配存储。―《
》
用 声明的变量虽然增加了分配空间,但是可以保证类型安全。
标准中, 定义的常量是全局的,中视声明位置而定。
用法 :指针和常量
使用指针时涉及到两个对象:该指针本身和被它所指的对象。将一个指针的声明用
预先固定”将使那个对象而不是使这个指针成为常量。要将指针本身而不是被指对象
声明为常量,必须使用声明运算符。
所以出现在 之前的 是作为基础类型的一部分:
到 的 指针
到 的指针
到 的指针(后两个声明是等同的)
从右向左读的记忆方式:
用法 : 修饰函数传入参数
将函数传入参数声明为 ,以指明使用这种参数仅仅是为了效率的原因,而不是想让
调用函数能够修改对象的值。同理,将指针参数声明为 ,函数将不修改由这个参数
所指的对象。
通常修饰指针参数和引用参数:
!"#$%修饰指针型传入参数
!"#$&%修饰引用型传入参数
用法 ':修饰函数返回值
可以阻止用户修改返回值。返回值也要相应的付给一个常量或常指针。
用法 (: 修饰成员函数
对象只能访问 成员函数,而非 对象可以访问任意的成员函数,包括
成员函数;
对象的成员是不能修改的,而通过指针维护的对象确实可以修改的;
成员函数不可以修改对象的数据,不管对象是否具有 性质。编译时以是否修
改成员数据为依据进行检查。
2.static 的用法:
静态变量作用范围在一个文件内,程序开始时分配空间,结束时释放空间,默认初始化为
),使用时可以改变其值。
静态变量或静态函数只有本文件内的代码才能访问它,它的名字在其它文件中不可见。
用法 :函数内部声明的 变量,可作为对象间的一种通信机制
如果一局部变量被声明为 ,那么将只有唯一的一个静态分配的对象,它被用于在该
函数的所有调用中表示这个变量。这个对象将只在执行线程第一次到达它的定义使初始化。
用法 :局部静态对象
对于局部静态对象,构造函数是在控制线程第一次通过该对象的定义时调用。在程序结束
时,局部静态对象的析构函数将按照他们被构造的相反顺序逐一调用,没有规定确切时间。
用法 :静态成员和静态成员函数
如 果一个变量是类的一部分,但却不是该类的各个对象的一部分,它就被成为是一个
静态成员。一个 成员只有唯一的一份副本,而不像常规 的非 成员那样
在每个对象里各有一份副本。同理,一个需要访问类成员,而不需要针对特定对象去调用
的函数,也被称为一个 成员函数。
类的静态成员函数只能访问类的静态成员(变量或函数)。
3.extern 的用法:
可以声明其他文件内定义的变量。在一个程序里,一个对象只能定义一次,它可以
有多个声明,但类型必须完全一样。如果定义在全局作用域或者名字空间作用域里某一个
变量没有初始化,它会被按照默认方式初始化。
将变量或函数声明成外部链接,即该变量或函数名在其它函数中可见。被其修饰的变量
(外部变量)是静态分配空间的,即程序开始时分配,结束时释放。
在 中,还可以指定使用另一语言链接,需要与特定的转换符一起使用。
*声明语句
*+声明语句块 ,
4.volatile 的用法:
类型修正符(-.!/),限定一个对象可被外部进程(操作系统、硬件或并发进
程等)改变。 与变量连用,可以让变量被不同的线程访问和修改。声明时语法:
0
常用于像中断处理程序之类的异步进程进行内存单元访问。
除了基本类型外,对用户定义类型也可以用 类型进行修饰。
注意:可以把一个非 赋给 ,但是不能把非 对象赋给一个
对象。
一个有 标识符的类只能访问它接口的子集,一个由类的实现者控制的子集。用户
只能用 1 来获得对类型接口的完全访问。此外, 向 一样会从类传
递到它的成员。
Const 深度解析
我们也许学习过 的使用,但是对于 的细致的技术细节却不一定掌握。 的用
法在许多的教材上只是简单的介绍,在这里我们对 进行细致的概念以及用法剖析。
是由 采用,并加进标准 中,但是他们的意义完全不同,在旧版本#标准前%的 中,
如果想建立一个常量,必须使用预处理器:
2!/0 '(3
此后无论在何处使用 0,都会被预处理器以 '(3 替代。编译器不对 0 进行类型检查,也
就是说可以不受限制的建立宏并用它来替代值,如果使用不慎,很可能由预处理引入错误,这
些错误往往很难发现。
我们也不能得到 0 的地址(即不能向 0 传递指针和引用)。
引入了命名常量的概念,命名常量就像变量一样,只是它的值不能改变,如果试图改变一
个 对象,编译器将会产生错误。 和正常变量一样有作用域,所以函数内部的
也不会影响程序的其余部分。在 中 可以取代预处理器2!/ 来进行值替
代, 有安全的类型检查,所以不用担心会像预处理器一样引入错误。
在通常的情况下 同预处理器2!/ 一样只是将所赋值保存入编译器的符号表中(符号
表仅仅在编译时存在,在编译过程中编译器将程序中的名字与之在符号表中定义的数值作简单
的替换),在使用的时候进行值替换,并不为 创建存储空间。我们将 的定义放进
头文件里,这样通过包含头文件,可以把 定义单独放在一个地方并把它分配给一个编译
单元, 默认为内部连接(内部连接意味着只对正在编译的文件创建存储空间,别的文件
可以使用相同的标示符和全局变量,编译器不会发现冲突,外部连接意味着为所有被编译过的
文件创建一片单独的存储空间,一般全局变量和函数名的外部连接通过 声明,可以通
过其他的文件访问)也就是说 仅能被它所定义过的文件访问,在定义一个 时,必
须赋一个值给它,除非用 做出说明:
这表示 的定义在其他的什么地方,这里仅仅是一个声明,但是这样的做法使 使用
了外部连接,也就是说上面的 强制进行了对 的存储空间分配,这样我们就无法
再用 作为常量折叠(在可能的情况下,符号常量的值会代替改名字的出现,这个替代过
程叫做常量折叠)使用了,即使我们在其他地方定义了 的值如:
4
因为 的值被放入了存储单元,在编译的过程中,编译器不会去读存储单元的内容。如果
我们这样做:
567
编译器就会给我们一个错误信息。
想不为 分配存储空间是不可能的,因为对于复杂的结构,例如集合,编译器不会复杂到
将集合保存到它的符号表中,所以必须分配内存空间,这就意味着“这是一块不能改变的存储空
间”,当然也就不能在编译期间使用它的值,因为编译器不知道存储的内容:
674+ ',
896677
将得到错误信息,编译器提示不能在数组定义里找到一个常数表达式。
因为编译器靠移动栈指针来存储和读取数据。
也因此,由于无法避免为 分配内存,所以 的定义必须默认为内部连接,否则由于
众多的 在多个文件中分配内存,就会引起错误。下面我们看一段简单有效的代码来说明
的常量折叠:
2!:;
4
54
894#8%&5
65 7
!#%
+
4#%
4
,
我们可以看到, 是一个编译器期间的 ,5 是从 中计算出来的,由于 是一个
,5 的计算值来自一个常数表达式,而它自身也是一个编译器间的 ,接着下面指针
9 取得了 5 的地址,所以迫使编译器给 5 分配了存储空间,不过即使分配了存储空间,由于编
译器已经知道了 5 的值所以仍然不妨碍在决定数组 的大小时使用 5。
在主函数 #%里,标识符 的值在编译期间是不知道的,这也意味着需要存储空间,但是
初始化要在定义点进行,而且一旦初始化,其值就不能改变,我们发现 是由 计算出来的,
它的作用域与其他类型 的作用域是一样的,这是对2!/ 用法的一种改进。
在 引进常量的时候,标准 也引入了 ,但是在 中 的意思和在 中有很
大不同,在 中 的意思是“一个不能改变的普通变量”, 常量总是被分配存储空间
而且它的名字是全局符即 使用外部连接。于是在 中:
剩余24页未读,继续阅读
资源评论
风吟1987
- 粉丝: 63
- 资源: 15
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功