auto:默认,自动分配空间,自动回收空间

register:

1.register变量必须是能被CPU寄存器所接受的类型,这通常意味着register变量必须是一个单个 的值,并且其长度应小于或等于整型的长度。这与处理器的类型有关。

2. 声明为register仅仅是一个请求,而非命令,因此变量仍然可能是普通的自动变量,没有放在 寄存器中。

3. 由于变量有可能存储在寄存器中,因此不能用取地址运算符“&”获取register变量的地址。 如果有这样的写法,编译器会报错。

4.只有局部变量和形参可以作为register变量,全局变量不行。

5.实际上有些系统并不把register变量存放在寄存器中,而优化的编译系统则可以自动识别使用 频繁的变量而把他们放在寄存器中。

static:静态型

1.自动初始化为0值或空值,并值其变量的值有继承性

void func(void)

{

static int x = 0;

x = x + 1;

printf("%p->%d\n",&x,x);

}

int main()

{

func();

func();

func();

}

Result:

1

2

3

备注:这里的static就具有继承性,意思第一次定int x,下次再调用的时候就不再调用

2.限制作用域范围

main.c

#include <stdio.h>

#include <stdlib.h>


#include "proj.h"


static int i = 10;

int main()

{

printf("[%s]:i = %d\n",__FUNCTION__,i);

//__FUNCTION__表示是哪个函数

func();

exit(0);

}


proj.h

#ifndef PROJ_H__

#definePROJ_H__

void func(void);


#endif


proj.c

#include <stdio.h>

#include <stdlib.h>

#include "proj.h"

static int i = 100;


void func(void)

{

printf("[%s]:i= %d\n",__FUNCTION__,i);

exit(0);

}

Result:

[main]:i = 10

[func]:i = 100


注意static

1.以上如果变量i不加static会在编译的时候会出现变量冲突,

加了static表示只能在当前文件中使用

2.如果在void func(void)加一个static 表示只能在当前文件中调用,

在其他文件中不能调用,如上面main.c


extern:说明型

不能改变被是一个说明的变量的值或类型