定义
存储类:即存储模型 自动、寄存器、具有外部链接的静态、具有内部链接的静态、空链接的静态,还有基于指针的类型。
作用域:作用范围
链接 : 是否可被外部引用
存储时期:变量在内存中保留的时间
作用域
代码块作用域:即方法体等类似范围
函数原型作用域:函数声明时范围
文件作用域:文件内函数外声明的范围,可被内部任何地方和其他文件引用,也称全局变量
链接
外部链接: 文件作用域,不用static
修饰
内部链接: 文件作用域,使用static
修饰
空链接: 代码块作用域 和 函数原型作用域 变量具有空链接
存储时期
静态存储时期: 静态变量在程序执行期间一直存在,具有文件作用域变量具有静态存储时期。
自动存储时期: 局部变量属于自动类型。
存储类
- 寄存器变量 比自动变量访问快、无法获取地址
- 代码块作用域的静态变量
- 外部链接的静态变量 extern声明在其他文件中定义的变量
- 具有内部链接的静态变量
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| #include <stdio.h>
void count(); int main(int argc, char *argv[]) { count(); count(); return 0; }
void count() { static int count = 0; count++; printf("count = %d \n", count); }
|
函数示例
掷骰子,随机数生成
头文件 dice.h
1 2
| int roll(int max); extern int count;
|
实现 dice.c
1 2 3 4 5 6 7 8 9 10 11
| #include "dice.h" #include <stdio.h> #include <stdlib.h>
int count;
int roll(int max) { count++; return rand() % max + 1; }
|
调用 main.c
1 2 3 4 5 6 7 8 9 10
| #include "dice.h" #include <stdio.h>
int main(int argc, char *argv[]) { printf("掷骰子 1 次 : %d \n", roll(100)); printf("掷骰子 2 次 : %d \n", roll(100)); printf("总次数 : %d \n", count); return 0; }
|
内存管理 malloc() 和 free()
创建动态数组,记得要free释放
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| #include <stdio.h> #include <stdlib.h>
int main(int argc, char *argv[]) { double * money; int max; int number; int i = 0; puts("要整个多大的数组啊?\b"); scanf("%d", &max);
money = (double *)malloc(max * sizeof(double)); if (NULL == money) { puts("空间不足"); exit(EXIT_FAILURE); }
puts("往数组放数吧 \n"); while (i < max && scanf("%lf", &money[i]) == 1) { i++; }
printf("你输入的是: %d \n", number = i); for (i = 0; i < number; i++) { printf("%7.2f ", money[i]); } puts("over. \n"); free(money); return 0; }
|