//导入输入输出库
#include<stdio.h>
//stdlib 头文件即standard library标准库头文件
//stdlib 头文件里包含了C、C++语言的最常用的系统函数
#include<stdlib.h>
//time.h是C / C++中的日期和时间头文件
#include<time.h>
//掷骰子的模拟程序函数声明
#include "TwelveAndTwelve.h"
/*
第十二章 存储类、键接和内存管理
关键字
C有五个被作为存储类说明符的关键字
auto
关键字 auto 称为存储类说明符(storage class specifier) 为了表明有意覆盖一个外部函数定义时,或者为了表明不能把变量改变为其他存储类,
且具有自动存储时期
extern
关键字extern表明该声明不是一个定义,因为它指示编译器参考其它地方,比如其它文件定义的变量
static
静态存储时期(static storage duration)
如果有一个变量具有静态存储时期,它在程序执行期间将一直存在,哪怕代码段或函数关闭,它还在那里,再次打开函数可代码段,仍可继续调用.
具有文件作用域的变量本身具有静态存储时期。而关键词static将只表明链接类型 ,而非存储时期
register
寄存器变量,可以存储在cpu寄存器中,或更快的可用闪存中,从而得到更快的访问和操作,因为寄存器变量我是存放在寄存器中而不是内存中,所以
无法获得寄存器变量的地址。但在其它很多方面,寄存器变量与自动变量是一样的
typedef
typedef关键字与内存无关,由于语法原因被归入此类,
特别地,不可以在一个声明中使用一个以上的存储类说明符,这意味着不能将其他任一存储类说明符作为typedef的一部分。
类型限定说明符 (qualified type)受限类型
const 将数据限定为不变的,在使用指针时,const可以表明指针本身不变或指针指向的数据不变,取决于前缀的位置
volatile 表明数据除了可被程序修改外还可通过其他方式修改,警示编译器在优化时还要做出相反的假设
典型的它被用于硬件地址和其他并行运行的程序共享的数据。例如,一个地址中可能保存着当前的时钟时间。
不管程序做些什么,该地址的值都会随着时间而改变。另一种情况是一个地址被 用来接收来自其他计算机的信息。
假如 val1 = x; val2 = x;
优化的编译器可能注意到您两次使用了X,而没有改变它的值。它将把x临时存储在一个寄存器中。接着,当val2需要x时,
可以通过从寄存器而非初始的内存位置中读取该值以节省时间.这个过程被称为缓存(caching),通常,缓存是一个好的优化方式,但如果在两个语句间其他代理改变了x的话,就不是这样了。
如果没有规定volatile关键字,编译器将无从得知这种改变是否可能发生。因此,为了安全起见,编译器不使用缓存。
那是在ANSI以前的情形,现在如果没有声明volatile编译器就可以假定,一个值在使用过程中没有修改,可以试着优化代码.
restrict 限定指针被认为是提供了对其所指向数据块的惟一访问途径
C99授予类型限定词一个新属性;它们现在是幂等的(idempotent)
比如const const const int n=6;相当于 const int n=6;多余的被忽略掉
//生成0到RAND_MAX范围内在整数 j=(int)(n*rand()/(RAND_MAX+1.0))产生一个0到n之间的随机数
rand()
//初始化(设置随机数种子)
srand()
//返回系统时间
time()
分配内存
malloc()
分配指定大小内存
calloc()
释放内存
free()
存储类
C为变量提供了5种不同的存储模型,或称存储类.还有基于指针的第6种存储模型
可以按照一个变量,更一般的,一个数据对象的存储时期(storage duration)描述它,也可以按照它的作用域(scope)
以及它的链接(linkage)来描述它。
存储时期就是变量在内存中保留的时间,变量的作用域和链接一起表明程序的哪些部分可以通过变量名来使用该变量。
不同的存储类提供了变量的作用域、链接以及存储时期的不同组合。
可以拥有多个文件共享的变量、某个特定文件中的所有函数有可以使用的变量、只有在特定函数可以使用的变量、
甚至只有某个函数的一小部分代码段可以使用的变量.
可以拥有在整个程序运行期间都存在的变量,或者只有在包含该变量的函数执行时才存在的变量。还可以通过函数调用数据的存储内存显示的分配和释放
变量的作用域
作用域描述了程序中可以访问一个标识符的一个或多个区域。一个C变量的作用域可以是代码块作用域、函数原型作用域,或者文件作用域。
代码块作用域
函数体是代码块,复合语句也是代码块 花括号中的也是一个代码块
在代码块中定义的变量具有代码块作用域(block scope),从该变量被定义的地方到包含该定义的代码块的末尾该变量均可见。
传统上,具有代码块作用域的变量都必须在代码块的开始处进行声明,C99放宽了这一规则,允许在一个代码块中任何位置声明变量。
一个新的可能 for(int i=0;i<10;i++)C99把代码块的概念扩大到包括由for、while、do while、if语句所控制的代码,即使没有被花括号括起来
这样它的作用域就仅限for循环,离开后就不能在使用这个变量了
函数原型作用域(function prototype scope)适用于函数原型中使用的变量名 |
|