全局变量和局部变量
变量作用域基本概念
变量作用域:变量的可用范围
按照作用域的不同,变量可以分为:局部变量和全局变量
局部变量
定义在函数内部的变量以及函数的形参
,
我们称为局部变量
作用域:从定义的那一行开始
,
直到遇到
}
结束或者遇到
return
为止
生命周期
:
从程序运行到定义哪一行开始分配存储空间到程序离开该变量所在的作用域
存储位置
:
局部变量会存储在内存的栈区中
特点:
相同作用域内不可以定义同名变量
不同作用范围可以定义同名变量,内部作用域的变量会覆盖外部作用域的变量
全局变量
定义在函数外面的变量称为全局变量
作用域范围:从定义哪行开始直到文件结尾
生命周期
:
程序一启动就会分配存储空间
,
直到程序结束
存储位置:静态存储区
特点
:
多个同名的全局变量指向同一块存储空间
auto
和
register
关键字
auto
关键字
(
忘记
)
只能修饰局部变量
,
局部变量如果没有其它修饰符
,
默认就是
auto
的
特点
:
随用随开
,
用完即销
register
关键字
(
忘记
)
只能修饰局部变量
,
原则上将内存中变量提升到
CPU
寄存器中存储
,
这样访问速度会更快
但是由于
CPU
寄存器数量相当有限
,
通常不同平台和编译器在优化阶段会自动转换为
auto
static
关键字
对局部变量的作用
延长局部变量的生命周期
,
从程序启动到程序退出
,
但是它并没有改变变量的作用域
enum
Season
{
Spring
=
9
,
Summer
,
Autumn
,
Winter
};
//
也就是说
spring
的值为
9
,
summer
的值为
10
,
autumn
的值为
11
,
winter
的值为
12
auto
int
num
;
//
等价于
int num;
register
int
num
;
代码情缘
定义变量的代码在整个程序运行期间仅仅会执行一次
对全局变量的作用
全局变量分类:
内部变量
:
只能在本文件中访问的变量
外部变量
:
可以在其他文件中访问的变量
,
默认所有全局变量都是外部变量
默认情况下多个同名的全局变量共享一块空间
,
这样会导致全局变量污染问题
如果想让某个全局变量只在某个文件中使用
,
并且不和其他文件中同名全局变量共享同一块存储空
间
,
那么就可以使用
static
#include <stdio.h>
void
test
();
int
main
()
{
test
();
test
();
test
();
return
0
;
}
void
test
(){
static
int
num
=
0
;
//
局部变量
num
++
;
//
如果不加
static
输出
1 1 1
//
如果添加
static
输出
1 2 3
printf
(
"num = %i\n"
,
num
);
}
// A
文件中的代码
int
num
;
//
和
B
文件中的
num
共享
void
test
(){
printf
(
"ds.c
中的
num = %i\n"
,
num
);
}
// B
文件中的代码
#include <stdio.h>
#include "ds.h"
int
num
;
//
和
A
文件中的
num
共享
int
main
()
{
num
=
666
;
test
();
// test
中输出
666
return
0
;
}
// A
文件中的代码
static
int
num
;
//
不和
B
文件中的
num
共享
void
test
(){
printf
(
"ds.c
中的
num = %i\n"
,
num
);
}
代码情缘
extern
关键字
对局部变量的作用
extern
不能用于局部变量
extern
代表声明一个变量
,
而不是定义一个变量
,
变量只有定义才会开辟存储空间
所以如果是局部变量
,
虽然提前声明有某个局部变量
,
但是局部变量只有执行到才会分配存储空间
对全局变量的作用
声明一个全局变量
,
代表告诉编译器我在其它地方定义了这个变量
,
你可以放心使用
static
与
extern
对函数的作用
内部函数
:
只能在本文件中访问的函数
外部函数
:
可以在本文件中以及其他的文件中访问的函数
默认情况下所有的函数都是外部函数
static
作用
声明一个内部函数
// B
文件中的代码
#include <stdio.h>
#include "ds.h"
int
num
;
//
不和
A
文件中的
num
共享
int
main
()
{
num
=
666
;
test
();
// test
中输出
0
return
0
;
}
#include <stdio.h>
int
main
()
{
extern
int
num
;
num
=
998
;
//
使用时并没有存储空间可用
,
所以声明了也没用
int
num
;
//
这里才会开辟
printf
(
"num = %i\n"
,
num
);
return
0
;
}
#include <stdio.h>
int
main
()
{
extern
int
num
;
//
声明我们有名称叫做
num
变量
num
=
998
;
//
使用时已经有对应的存储空间
printf
(
"num = %i\n"
,
num
);
return
0
;
}
int
num
;
//
全局变量
,
程序启动就会分配存储空间
代码情缘
定义一个内部函数
extern
作用
声明一个外部函数
定义一个外部函数
注意点
:
由于默认情况下所有的函数都是外部函数
,
所以
extern
一般会省略
如果只有函数声明添加了
static
与
extern,
而定义中没有添加
static
与
extern,
那么无效