【C语言笔记】<二十一>内部全局变量和外部全局变量

全局变量分为两种:

1.外部全局变量, 默认情况下所有的全局变量都是外部全局变量
什么事外部全局变量? 可以被其它文件访问的全局变量我们称之为外部全局变量
2.内部全局变量, 只要给全局变量加上static关键字就是内部全局变量
什么是内部全局变量? 只能被当前文件访问的全局变量我们称之为内部全局变量

外部全局变量有一个特点:

可以定义同名的外部全局变量
多个同名的外部全局变量指向同一块存储空间

内部全局变量有一个特点

也可以定义多个同名的内部全局变量
多个同名的全局变量如果不在同一个文件中, 那么指向不同的存储空间

为了提高数据的安全性, 不让别人在其它文件中修改我们的全局变量, C语言提供了另外一个用于修改全局变量的关键字, static
只要用static修改的全局变量就是内部全局变量, 只能在当前文件中使用
这样就可以提高我们全局变量的安全性

如果多个文件中存在同名的内部全局变量, 相互不会影响
如果既有外部全局变量也有内部全局变量, 那么会优先访问内部全局变量

extern:

用于声明一个外部全局变量
声明只需要在使用变量之前声明就可以了

static:

用于定义一个内部全局变量
声明和定义的区别:

声明与定义开辟存储空间问题

声明不会开辟存储空间
定义会开辟存储空间

#include 
#include "zs.h"
//int num; // 外部全局变量

static int num; // 内部全局变量 998

int main(int argc, const char * argv[]) {
    num = 998;
    test();
    printf("mian.c = num = %i\n", num);
    return 0;
}
#include "zs.h"

/*
int num; // 由于Xcode升级之后导致的, 在Xcode6以前是可以的
如果直接在zs.c当中定义外部全局变量num, 那么我们说过同名的外部全局变量指向同一块存储空间,
 那么如果在多个文件中有同名的外部全局变量, 可能导致A文件的数据被B文件不小心修改了
 降低了数据的封装性, 提高了发生错误的概率
*/
//int num;

// extern关键字用来修饰全局变量, 代表声明一个全局变量
// 注意: 声明全局变量和声明函数一样, 仅仅是告诉系统我们有这个全局变量, 但并不会真在的开辟存储空间
//extern int num;

//static int num; // 0  666

//int num; // 0 666


void test()
{
extern int num;
    printf("zs.c = num = %i\n", num); // 0
    num = 666;
}
int num;
//  zs.h
void test();

你可能感兴趣的:(【C语言笔记】<二十一>内部全局变量和外部全局变量)