变量可以定义在函数内部也可以定义在函数外部,根据定义的位置不同,分为 局部变量
和 全局变量
。局部变量与全局变量的作用域不同
。
1. 局部变量
定义在函数内部的变量是局部变量,局部变量。局部变量的作用域限定在当前函数中,即
{}
内。不同的函数中相同名字的局部变量不会互相影响。
#include <stdio.h>
void Func1()
{
int nValueLocal = 0x12345678;
printf("Func1中的局部变量:%X\r\n", nValueLocal);
}
void Func2()
{
int nValueLocal = 0x55667788;
printf("Func2中的局部变量:%X\r\n", nValueLocal);
}
int main(int argc, char* argv[])
{
Func1();
Func2();
return 0;
}
这可以类比:不同的城市,可能有相同名字的公路。
2. 全局变量
定义在函数外的变量就是全局变量,全局变量在整个工程作用域中都有效,多个函数操作同一个全局变量,会互相影响。
命名规范中全局变量前加
g_
,代表global
#include <stdio.h>
int g_nValue = 0;
void SetGlobalValue()
{
g_nValue = 100;
printf("我将全局变量的值设置为:%d\r\n", g_nValue);
}
void AddGlobalValue()
{
g_nValue += 5;
printf("全局变量的增加后的值为:%d\r\n", g_nValue);
}
int main(int argc, char* argv[])
{
SetGlobalValue();
AddGlobalValue();
g_nValue *= 2;
printf("不同的函数可以操作同一个全局变量:%d\r\n", g_nValue);
return 0;
}
运行结果:
2.1 全局变量的一般作用
全局作用可以用于多个函数的交互,函数将需要交互的信息放在全局变量中,使得我们可以不用依赖于函数返回值,也可以减少函数参数的传递。
定义全局变量时注意:全局函数一时爽,命名冲突火葬场
。
一个宠物养成游戏的例子如下:
#include <stdio.h>
int g_nPetState = 0;
void ShowPetState()
{
switch (g_nPetState)
{
case 0:
printf("初始化状态\r\n");
break;
case 1:
printf("运动状态\r\n");
break;
case 2:
printf("吃饭状态\r\n");
break;
case 3:
printf("睡觉状态\r\n");
break;
}
}
void SetRun()
{
g_nPetState = 1;
}
void SetEat()
{
g_nPetState = 2;
}
void SetSleep()
{
g_nPetState = 3;
}
int main(int argc, char* argv[])
{
ShowPetState();
SetEat();
ShowPetState();
SetSleep();
ShowPetState();
SetRun();
ShowPetState();
return 0;
}
运行结果:
2.2 多cpp文件中使用全局变量加extern
同函数类似,全局变量可以将声明与定义分离开。一般我们应该将全局变量定义在.c/.cpp文件中,然后在头文件中声明。
全局变量时在整个工程中有效的,当存在其他的.cpp文件想要调用全局变量时,全局变量的声明需要关键字
extern
。
extern int g_nPetState;
实例:在一个头文件中声明前加extern
,即可在多个cpp文件中使用
工程整体结构如下图:
myHeader.h:
extern int g_nPetState;
Func2.cpp:
#include "myHeader.h"
void Func()
{
g_nPetState = 6;
}
TestC.cpp:
#include "myHeader.h"
#include <stdio.h>
int g_nPetState = 0;
{...}
int main(int argc, char* argv[])
{
ShowPetState();
SetEat();
ShowPetState();
SetSleep();
ShowPetState();
SetRun();
ShowPetState();
return 0;
}
3. 学习视频地址:局部变量与全局变量