C语言day05_变量
C语言变量
一、全局变量
- 定义在函数外面的变量
- 全局变量具有全局的生存期和作用域
- 它们与任何函数都无关
- 在任何函数内部都可以使用它们
实例:
#include <stdio.h>
int globalVar = 12;
int fun(void);
int fun(void){
printf("in %s globalVar = %d\n",__func__, globalVar);
globalVar += 2;
printf("agn in %s globalVar = %d\n",__func__, globalVar);
}
int main(int argc, char const *argv[])
{
printf("in %s globalVar = %d\n",__func__, globalVar);
fun();
printf("agn in %s globalVar = %d\n",__func__, globalVar);
return 0;
}
输出:
in main globalVar = 12
in fun globalVar = 12
agn in fun globalVar = 14
agn in main globalVar = 14
1.1 全局变量初始化
- 没有zuo初始化的全局变量会得到0值
- 指针会得到NULL值
- 只能用编译时刻已知的值来初始化全局变量
- 它们的初始化发生在main函数之前
1.2 全局变量被隐藏
- 如果函数内部在与全局变量同名的变量,则全局变量被隐藏
二、静态本地变量
- 在本地变量定义时加上
static
修饰符就成为静态本地变量 - 当函数离开的时候,静态本地变量会继续存在并保持
- 静态本地变量的初始化只会在第一次进入函数时做,以后进入函数时会保持上次离开时的值
实例:
int fun(void);
int fun(void){
static int all = 1;
printf("in %s all = %d\n",__func__, all);
all += 2;
printf("agn in %s all = %d\n",__func__, all);
return all;
}
int main(int argc, char const *argv[])
{
fun();
fun();
fun();
return 0;
}
2.1 静态本地变量
- 静态本地变量实际上是特殊的全局变量
- 它们位于相同的内存区域
- 静态本地变量具有全局的生存期,函数内的局部变量作用域
- static在这里的意思是局部作用域(本地可访问)
实例:
int globalVar = 12;
int fun(void);
int fun(void){
int localVar = 0;
static int staticVar = 1;
printf("&globalVar = %p\n", &globalVar);
printf("&staticVar = %p\n", &staticVar); //静态变量的地址是和
printf(" &localVar = %p\n", &localVar);
printf("in %s all = %d\n",__func__, staticVar);
staticVar += 2;
printf("agn in %s all = %d\n",__func__, staticVar);
return staticVar;
}
int main(int argc, char const *argv[])
{
fun();
return 0;
}
输出:
&globalVar = 0000000000403010
&staticVar = 0000000000403014 //静态变量的地址是和全局变量放在一起的。
&localVar = 000000000061FDEC
in fun all = 1
agn in fun all = 3
三、返回指针变量
- 返回本地变量的地址是危险的
- 返回全局变量或静态本地变量的地址是安全的
- 返回在函数内malloc的内存是安全的,但是容易造成问题
- 最好的做法是返回传入的指针
3.1 返回本地变量的地址是危险的
#include <stdio.h>
int* f(void);
void g(void);
int* f(void){
int i = 12;
return &i;
}
void g(void){
int k = 24;
printf("k = %d\n", k);
}
int main(int argc, char const *argv[])
{
int *p = f();
printf("*p = %d\n", *p);
g();
printf("*p = %d\n", *p);
return 0;
}
输出:
*p = 12
k = 24
*p = -858993460
3.2 注意
- 不要使用全局变量来在函数传递参数和结果
- 尽量避免使用全局变量
- 使用全局变量和静态本地变量的函数是线程不安全的