C语言全局变量基础学习

文章详细介绍了全局变量和静态本地变量的概念,包括它们的定义、生存期、作用域和初始化。全局变量在整个程序中可见,而静态本地变量在函数内部维持其值。文章强调了返回指针的安全性问题,并提出了减少使用全局变量的建议,以提高代码可维护性。

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

1.全局变量

1.1定义

  定义在函数外面的变量。

1.2生存期与作用域

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

#include<stdio.h>
#include<stdlib.h>
//定义一个全局变量
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<stdio.h>
#include<stdlib.h>

int 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<stdio.h>
#include<stdlib.h>

int 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<stdio.h>
#include<stdlib.h>

int *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尽量避免使用全局变量

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

指针不指南吗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值