@SuHongjun
2020-04-26T23:58:18.000000Z
字数 1492
阅读 248
C语言 2020春季学期
auto: 变量存放于内存中的动态存储区
static: 变量存放于内存中的静态存储区
register: 变量存放于CPU中的寄存器
外部变量(即全局变量)是在函数的外部定义的,它的作用域为从变量定义处开始,到本程序文件的末尾。如果外部变量不在文件的开头定义,其有效的作用范围只限于定义处到文件终了。如果在定义点之前的函数想引用该外部变量,则应该在引用之前用关键字extern对该变量作“外部变量声明”。表示该变量是一个已经定义的外部变量。有了此声明,就可以从“声明”处起,合法地使用该外部变量。
还有一种情况是声明的变量定义于其他.c文件中。
全局变量是存储在静态存储区
auto型的局部变量是存储在动态存储区
static型的局部变量是存储在静态存储区
#include "stdio.h"extern int x; //变量声明static int y=5; //变量定义,//静态存储区int z; //变量定义,//静态存储区main(){int i; //变量定义 ,//动态存储区auto int a; //动态存储区static int c; //静态存储区register int d; //存储在CPU内的寄存器里i = 5;a = 5;c = 5;d = 5;x = 5; //如果没有后面的int x的变量定义,这里会报错,因为extern 只是变量声明,而不是变量定义y = 5;}int x; //变量定义
#include "stdio.h"main(){x = 5; //出错,因为变量x的有效作用范围在这里还没有开始}int x;
#include "stdio.h"extern int x; //变量声明main(){x = 5; //加了变量声明后,这里不再出错}int x;
#include "stdio.h"int y;extern int x;main(){auto int a; //相当于 int a;static int b;register int c;a = 5;b = 5;c = 5;y = 5;x = 5;}int x;
静态的局部变量与动态的局部变量之间的区别,请看下面的例子:
#include "stdio.h"int f1(){int x=0; //动态的局部变量x++;return x;}int f2(){static int x=0; //静态的局部变量x++;return x;}main(){int i;for(i=0; i<10; i++)printf("i:%d\tf1():%d\tf2():%d\n", i,f1(),f2());}
输出:
i:0 f1():1 f2():1
i:1 f1():1 f2():2
i:2 f1():1 f2():3
i:3 f1():1 f2():4
i:4 f1():1 f2():5
i:5 f1():1 f2():6
i:6 f1():1 f2():7
i:7 f1():1 f2():8
i:8 f1():1 f2():9
i:9 f1():1 f2():10
#include "stdio.h"#define N(x) 30*x + x //宏名和小括号之间,不能有空格#define N2(x,y) x+y*x+y //宏名和小括号之间,不能有空格main(){printf("%d\n", N(4));//相当于 printf("%d\n", 30*4 + 4);printf("%d\n", N2(4,3));}
宏名和小括号之间,不能有空格