@SuHongjun
2020-04-26T23:58:18.000000Z
字数 1492
阅读 203
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));
}
宏名和小括号之间,不能有空格