C语言全局变量基础学习-创新互联

  通过学习,我对全局变量以及静态本地变量有个简单基础的认识。以下是我的学习笔记,与大家分享,如果有不妥的地方,欢迎大家在评论区指出来,一起学习进步!!!

创新互联建站专注于企业成都全网营销推广、网站重做改版、安丘网站定制设计、自适应品牌网站建设、H5响应式网站购物商城网站建设、集团公司官网建设、外贸网站制作、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为安丘等各大城市提供网站开发制作服务。文章目录
  • 1.全局变量
    • 1.1定义
    • 1.2生存期与作用域
    • 1.3全局变量的初始化
    • 1.4被隐藏的全局变量
    • 1.5局部变量
  • 2.静态本地变量
    • 2.1定义
    • 2.2生存期与作用域
    • 2.3实际上静态本地变量是一种特殊的全局变量
  • 3.返回指针的函数
    • 3.1返回本地变量的指针
    • 3.2返回全局变量和静态本地变量的地址是安全的
    • 3.3返回malloc的指针
    • 3.4最好的方法是 返回传入的指针
  • 4.全局变量tips
    • 4.1不要使用全局变量的来传递函数的参数和结果
    • 4.2尽量避免使用全局变量

1.全局变量 1.1定义

  定义在函数外面的变量。

1.2生存期与作用域

  具有全局(任何函数内部)的生存期和作用域。
  代码测试

#include#include//定义一个全局变量
int gAll=12;

void f(void);

int main()
{printf("in %s gAll=%d\n", __func__,gAll);
    f();
    f();
    printf("agn in %s gAll=%d\n", __func__,gAll);
    return 0;
 } 

void f(void)
{printf("in %s gAll=%d\n", __func__,gAll);
    gAll+=2;
    printf("agn in %s gAll=%d\n", __func__,gAll);
}

  输出结果

in main gAll=12
in f gAll=12
agn in f gAll=14
in f gAll=14
agn in f gAll=16
agn in main gAll=16

  注意
  输出所在函数的函数名用 func ,
  前后是 2个英文半角状态的“_”。

1.3全局变量的初始化

  自动:没有初始化的会自动初始化为0,指针初始化为NULL;
  人为:用编译时刻已知的值对全局变量初始化,在main函数之前初始化。

1.4被隐藏的全局变量

  如果函数内部有与全局变量同名的变量,则全局被隐藏。
  小范围与大范围定义了一样的变量名,大范围变量被隐藏,执行小范围的变量。
  代码测试

#include#includeint gAll=12;    //定义全局变量,大范围

void f(void);

int main()
{printf("in %s gAll=%d\n", __func__,gAll);
    f();
    printf("agn in %s gAll=%d\n", __func__,gAll);
    return 0;
 } 

void f(void)
{int gAll=1;   //函数内部定义同名的本地变量,小范围
    printf("in %s gAll=%d\n", __func__,gAll);
    gAll+=2;
    printf("agn in %s gAll=%d\n", __func__,gAll);
}

  输出结果

in main gAll=12      //全局变量
in f gAll=1         //函数内部的本地变量
agn in f gAll=3        //函数内部的本地变量
agn in main gAll=12    //重新返回main,全局变量取消隐藏

1.5局部变量

(1)局部变量只能在定义的区域以及他的子区域中使用;
(2)包括:一个函数内部定义的函数、函数形参、复合语句即{ }大括号中的变量;
(3)同一个区域不能定义相同的名字;
(4)不同区域定义相同的名字变量,在本质没有任何关系。

2.静态本地变量 2.1定义

在本地变量定义时前面加上static修饰符就变成了静态本地变量。

2.2生存期与作用域

  生存期:全局,当函数离开时,静态本地变量会继续保持他最后的值;
   作用域:定义函数内部;(static的意思是局部区域访问)
   初始化:静态本地变量的初始化只会在第一次进入这个函数的时候做,以后进入函数时,会保持上次离开函数的值。
  代码测试

int gAll=12;

void f(void);

int main()
{f();
    f();
    f(); 
    return 0;
 } 

void f(void)
{static int all=1;
    printf("in %s all=%d\n", __func__,all);
    all++;
    printf("in %s all=%d\n", __func__,all);
}

  输出结果

in f all=1
in f all=2
in f all=2
in f all=3
in f all=3
in f all=4

2.3实际上静态本地变量是一种特殊的全局变量

  静态本地变量和全局变量的地址挨着,即他们两个在内存中放在一起,在内存相同的区域
  代码测试

#include#includeint gAll=12;

void f(void);

int main()
{f();
    return 0;
 } 

void f(void)
{static int all=1;
    int b=2;
    printf("in %s &gAll=%p\n", __func__,&gAll);
    printf("in %s &all=%p\n", __func__,&all);
    printf("in %s &b=%p\n", __func__,&b);
}

  输出结果

in f &gAll=0000000000403010
in f &all=0000000000403014 //全局变量的地址 挨着 静态本地变量的地址
in f &b=000000000062FDEC

3.返回指针的函数 3.1返回本地变量的指针

   这种做法是危险的,因为当你离开这个函数,本地变量的空间会被free掉,当定义下一个变量的时候,会直接放在这个内存空间里面,所以可能还是原来的值,也可能不是原来的值。
  代码测试

#include#includeint *g(void);
void f(void);

int main()
{int *p=g();
    printf("*p=%d\n",*p);
    f();
    printf("*p=%d\n",*p);
    return 0;
 } 

int *g(void)
{int i=1;
    return &i;
}

void f(void)
{int k=12;
    printf(" k=%d\n",k);
}

  输出结果

*p=1
k=12
*p=12 原来地址被后来定义的k占用

3.2返回全局变量和静态本地变量的地址是安全的

  他们的指针和函数没有关系

3.3返回malloc的指针

  内存是安全的,但是容易出现问题

3.4最好的方法是 返回传入的指针 4.全局变量tips 4.1不要使用全局变量的来传递函数的参数和结果 4.2尽量避免使用全局变量

   “丰田汽车的案子”代码中使用了大量的全局变量,无法维护

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


新闻名称:C语言全局变量基础学习-创新互联
转载注明:http://scyanting.com/article/dososp.html