这是本人关于 C Primer Plus 这本C语言经典著作 第12章的一个总结 如有不对 欢迎指出
int a = 3;
这个东西创建了一个 叫做 a 的标识符 , 从硬件上来看 就是 有一个叫a的标识符占用了一定物理内存
标识符有两个性质 一个叫 作用域(scope) 还有一个叫 链接(linkage)
一作用域
①块作用域
②文件作用域
③函数原型作用域 (还有一个叫函数作用域不用管他)
①块作用域
int
MAX
(int a , int b, int c){ 我们可以看到在这个函数里面创建了一个叫t的变量 他只在 这个叫MAX的函数里面起作用 这就叫块作用域(在主函数里面的也是的)
int t;
if
(a>b)
t=a;
else
t=b;
if
(c>t)
t=c;
printf
(
"%d\n"
,t);
return
0;
}
二 连接器
①无链接
函数原型作用域的变量 都是无连接的,就是说函数的无连接变量都是属于函数本身的;
②内部链接
③外部连接
内部链接和外部链接的区别就是 看定义变量的时候 加没加 static;
三 储存期
据说分为 四种储存期 静态储存期 线程储存期(这个我不懂不管) 自动储存期 动态分配储存期
静态和自动
#include <stdio.h>
void fn(void) 相信可以看出区别了吧?
{ n是自动储存期 也就是当 fn这个函数运行结束后他就会被释放,而 m他因为外部链接 static 让他变成 能够静态储存期,也就是当程序结束才会释放内存
int n = 10;
printf("n=%d\n", n);
n++;
printf("n++=%d\n", n);
}
void fm_static(void)
{
static int m = 10;
printf("static m=%d\n", m);
m++;
printf("m++=%d\n", nm;
}
int main(void)
{
fn();
fm_static();
fn();
fm_static();
return 0;
}
这里是运行结果
n=10 n++=11 -------------------- static m=10 m++=11 -------------------- n=10 n++=11 -------------------- static m=11 m++=12
动态分配储存期
int *a;
a = (int*)malloc(30 * sizeof(int)) 意思是说 a是一个整型指针 然后给这个指针分布了 30个 int 大小的 内存 换句话说 相当于 int a[30];
free(a); 意思就是说释放a;
动态分配储存期的意思就是说 自己决定这个变量活多久;
最后讲一下 const 和 define
#const A10 const A 认为A是常量;
#define B 10 这个认为B是变量,只不过这个变量是不可改变的;