作用域和内存管理
1,在指针和参量声明中使用const
关键在于区分让指针本身成为const和让指针指向的值成为const
const float *p; //p指向的值必须是不变的
float * const p; //p是一个常量指针,它总是指向同一个地址,但所指向的值是可以改变的
//const可用于指针参数的传递
void display(const int array[],int limit);
//dispaly()只能访问而不能修改array[]的值
2,对全局数据使用const
const变量,const数组,const结构,const指针(上面提到的)
全局常量经常放在一个include文件中,即在其它file1.c等文件中使用时,包含进去即可。此时最好还要使用静态外部存储类,即在其它file1.c等文件中使用时,包含进去即可。否则将导致包含头文件的每个文件都有统一标识的定义声明。形式如下:
xxx.h
static const double PI=3.14;
static const char *Month[12]={"January","","",...};
3,用于存储程序的内存可以按存储时期、作用域和链接来表征。
存储时期:静态,自动和分配。
静态:在程序开始执行是被分配,并在程序运行时一直存在。
自动:进入代码块开始分配,出代码块结束,内存自动释放。
分配:malloc等开始,free结束。
作用域:函数之外声明的变量具有文件作用域,在之后定义的全部函数课件;在代码块内定义的变量具有代码块作用域,在该代码块及其子代码块内可见。
链接:描述了额程序的某个单元定义的变量可被链接到其它哪些地方。具有代码作用域的变量为局部变量,具有空链接。具有文件作用域的变量可有内部链接或外部链接。内部链接意味着变量只可在变量定义的文件内部使用。外部链接意味着变量可在其它文件中使用。
五种存储类:
- 自动:自动存储期、代码块作用域、空链接
- 寄存器:自动存储期、代码块作用域、空链接
- 静态空链接:代码块内使用static修饰的变量,静态存储期、代码块作用域、空链接
- 静态外部链接:所有函数外部定义,未使用static修饰。静态存储期、文件作用域、外部链接
- 静态内部链接:在所以函数外部定义、使用staticx修饰。静态存储期、文件作用域、内部链接
类型限定说明符:
const ,volatile,restrict