1、局部变量和全局变量

局部变量:凡是在{}以内的变量称为局部变量,也包括形式参数。

全局变量:凡是在{}以外的变量称为全局变量。

2、作用域的概念

局部作用域:{}以内的作用域称为局部作用域,主要包含的是变量

全局作用域:{}以外的作用域称为全局作用域,一类是变量,一类是函数

同一作用域内,不可以用重名的标识符。

局部变量的作用域,起始于定义处,直到所在的大括号结束。

全局变量的作用域,起始于定义处,直到本文件的结束。

3、作用域叠加

作用域叠加:指的是,全局变量同局部变量的作用域叠加,

在不同的作用域,可以有重名的标识符,局部变量会覆盖全局变量的作用域。

更小的作用域,只能用于再次划分局部作用域。

4、全局命名污染

5、生命周期

函数的生命周期,起于调用,结束于调用结束

局部变量的生命周期,起于调用,结束于调用结束

main开始 == 进程的开始, main函数的结束 == 进程的结束

全局变量的生命周期,起始于main函数的调用,结束于main函数的调用结束,等价于进程的生命周期

6、auto (大将军)

auto只能用于修饰局部变量,表示该变量存储于栈stack上。

存储于栈上的数据特点:随用随开,用完即消。

默认的局部变量,就是auto类型的,所以通常将其省略。

在C中将其忘记即可,C++ 中再讨论别的作用

7、register (小太监)

register只能修饰局部变量。存储于cpu的一个变量,速度很快,但数量有限,所以通常被优化。

使用场景:频繁使用的变量,避免cpu和内存之间频繁交互。

一般不用,将其忘记

8、extern (通关文牒)

extern只能用来修饰全局变量。
全局变量本身是全局可用的 ,但是由于文件是单个完成编译 ,并且编译是 自上而下 的,所以说,对于不是在本范围内定义的全局变量,要想使用必须用 extern 进行声明,如果不加上 extern ,就会造成重定义。
注意:经extern 声明的变量,不可以再初始化。

C语言,是单文件编译的,然后再将编译的 .o文件同库一起链接成可执行文件。正是因为这一点,跨文件使用全局变量,需要声明。

//main.c
#include <stdio.h>
extern int a;

int main()
{
    printf("a = %d\n, a");

    return 0;
}

//other.c

int a = 5;

extern是可以省略的,但是不建议省略。

9、声明与定义

变量的声明与定义,现在要区分了。

定义的时候可赋值可不赋值(即可先定义后初始化),但声明时不可赋值。

10、static(限离出境)

1、修饰局部变量

static 修饰,局部变量,修改了局部变量的生命周期。使其生命周期同进程或是 main()函数。

static变量若未初始化,则系统初始化为零,并且只进行一次初始化。

静态局部变量的应用:

①用于流程控制

②用于统计函数 (功能的 )调用次数案例,或是加载资源文件。

2、修饰全局变量

static 修饰,全局变量,限制了他的外延性。使其成为仅在本文件内部使用的全局变量。

全局变量会带来全局空间的命名污染 。 这样既保留了全局变量的使用便利性,又不会造成全局空间的命名污染。

3、修饰函数

static 修饰函数的意义,就在于将全局函数变成了,本文件内的全局函数。

小结:

变量分类

生命周期

作用域

默认值

修饰符

生命周期

作用域

默认值

局部变量

起于调用,结束于调用结束

起始于定义处,直到所在的大括号结束。

随机

auto

起于调用,结束于调用结束

 

起始于定义处,直到所在的大括号结束。

 

随机

 

register

static

起始于main函数的调用,结束于main函数的调用结束

起始于定义处,直到所在的大括号结束。

0

全局变量

起始于main函数的调用,结束于main函数的调用结束,等价于进程的生命周期

起始于定义处,直到本文件的结束。

0

起始于main函数的调用,结束于main函数的调用结束,等价于进程的生命周期

限制了外延性,仅在本文件内部使用的全局变量。

0

extern

可以跨文件(说法不准确),详见上面extern用法

0

参考资料:《零基础入门C语言--王桂林》