参考《C Primmer Plus》
首先唠唠C语言关键字:
数据类型14个:
void, char(1字节), int(4字节), short(2字节), long(4字节), signed(4字节), unsigned(4字节),
float(4字节), double(8字节), struct, union, enum, typedef, sizeof
存储类控制类型6个:
auto, static, extern, register, const, volatile
流程控制12个
if, else, for, do, while, switch, case, default, return, contiue, break, goto
再看看C语言内存分配形式:
①BSS段:存储未初始化的全局数据和静态数据(静态存储区)
②数据段:存储已初始化的全局变量(静态存储区)
③代码段/文本段/代码区:存储类成员函数、全局函数和其他函数
④栈区:存放调用函数相关的变量和地址、被调用函数临时创建的局部变量(不包括static声明的变量)--函数被调用时,参数也会被压入发起调用进程栈中,
调用结束后,函数返回值也会被存放回栈中
⑤堆区:存储动态分配的变量
C为变量提供了5种不同的存储模型,或称为存储类。 见下表:
存储类 |
存储时期 |
作用域 |
链接 |
声明方式和位置 |
自动 | 自动 | 代码块 | 空链接 | 代码块内 |
寄存器 | 自动 | 代码块 | 空链接 | 代码块内,使用关键字register |
具有外部链接的静态 | 静态 | 文件作用域 | 外部链接 | 所有函数之外 |
具有内部链接的静态 | 静态 | 文件作用域 | 内部链接 | 所有函数之外,使用关键字static |
空链接的静态 | 静态 | 代码块 | 空链接 | 代码块内,使用关键字static |
存储类可以通过一个变量的作用域、链接和存储时期描述之。
1.作用域
作用域用于描述一个标识符可以被访问(可见)的一个或多个区域。一个C变量的作用域可以是代码块作用域、函数原型作用域(函数原型为函数的声明,即不包含函数体)、或者文件作用域。 其中代码块是包含在开始花括号和对应的结束花括号之内的一段代码。在所有函数之外定义的变量具有文件作用域,具有文件作用域的变量从定义的位置到该文件结尾都可见。
2.链接
一个C变量具有下列链接之一:外部链接、内部链接、或空链接。
具有代码块作用域或者函数原型作用域的变量有空链接,即该变量由该代码块或函数原型所私有的。 具有文件作用域的变量,如果使用使用了存储类型说明符static,则为内部链接,否则为外部链接。内部链接变量可以在该文件任何地方使用,而在文件之外不可见,因此不会与其他文件同名变量发生冲突(若同名,链接时候会报重定义错误);外部链接变量可以在该文件和别的文件中(用extern进行声明)使用。
3.存储时期
一个C变量有2中存储时期:静态存储时期和自动存储时期。
具有文件作用域的变量,关键字static表明链接类型,并非存储时期,所有文件作用域变量都具有静态存储时期。静态指的是变量的位置固定不动。
具有外部链接的静态变量:
把变量的定义和声明放在所有函数之外,即创建了一个外部变量。为了使程序更加清晰,可以在使用外部变量的函数中使用extern再次声明它,如果在函数内定义了一个与外部变量同名的局部变量,则该变量为一个独立的自动变量,即会覆盖同名的文件作用域变量。如果一个变量是在别的文件中定义的,使用extern来声明该变量就是必须的(extern表明是引用声明)
其中静态变量和外部变量一般在定义声明时候进行初始化,如果没有初始化,则会自动初始化为0
小例子:
//file1.cpp #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; int Coal = 1214; int abc = 11; //file2.cpp #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; int Errupt = 20; /* 外部定义的变量 */ double Up[100]; /* 外部定义的数组 */ extern int Coal; //int abc = 10; /* 与file1.cpp重定义 */ void next(void) { int Errupt = 10; printf("%d\n", Errupt); } int main() { printf("%d\n", Coal); next(); printf("%d\n", Errupt); extern int Errupt; /* 可选的声明 */ extern int Up[]; /* 可选的声明 */ printf("%d\n", Errupt); return 0; }
输出结果为:
1024
10
20
20
更多拓展http://blog.csdn.net/hackbuteer1/article/details/7487694