七、C语言进阶:变量分类

七、C语言进阶:变量分类,第1张

C语言进阶7:变量分类 7.1 本地变量(局部变量) 7.1.1 什么是本地变量(局部变量)?

在大括号内定义的变量就是本地变量(局部变量)。

7.1.2 本地变量(局部变量)有什么特点?
  1. 本地变量是定义在代码块内的,可以定义在函数的块内,可以定义在语句的块内。

for(int i=0;i<10;++i){
    printf("%d ",i);
}
printf("%d ",i);

可以定义在一个随意的大括弧里面。

{
    int n = 0;
    printf("%d ",n);
}
printf("%d ",n);
  1. 程序进入块前,内部变量不存在,离开时失效。

  2. 块外定义的变量,块内仍然有效。

函数的每次运行,都会产生一个独立的变量空间,在这个空间中的变量,是函数这次运行独有的。

定义在函数内部的变量就是本地变量
参数也是本地变量

7.1.3 本地变量/局部变量初始化
  • 本地变量不会默认初始化
  • 参数在进入函数时被初始化。


    注:本地变量/局部变量的生存期和作用域都是在大括号内。

7.2 全局变量 7.2.1 什么是全局变量?
  • 定义:在函数外面的变量称为全局变量
  • 实例:
int n;
int main(){
    int m;
    printf("n=%d\m=%d\n",n,m);
}
7.2.2 全局变量有什么特点?
  • 全局变量有全局的生存周期和作用域;
  • 不属于任何函数;
  • 所有函数内部都可以使用。

int n;
int func(){
    printf("in func n = %d\n",n);
    // n = n*2;
}
int main(){
    scanf("%d",&n);
    func();
    printf("in main n = %d\n",n);
}
7.2.3 全局变量初始化
  • 没有初始化的全局变量会自动初始化为0;
  • 只能用编译时刻已知的值初始化全局变量;
  • 初始化发生在main()前。

int n = 2;
int m = n;
double  s = sqrt(n); 
int main(){
    printf("n = %d,m = %d,s = %f",n,m,s);
}
var2.c:4:9: error: initializer element is not constant
 int m = n;
         ^
var2.c:5:12: error: initializer element is not constant
 double s = sqrt(n);
            ^~~~
7.2.4 同名隐藏

如果函数内部存在与全局变量同名的变量,则全局变量被隐藏。

int n = 10;
int main(){
    int n = 1;
    printf("n = %d\n",n);
}
7.3 全局静态变量 7.3.1 全局静态变量是什么?

全局变量前加上关键字static

#include 
static int n;
int main(){
    printf("%d\n",n);
    int n = 10;
    printf("%d\n",n);
}
0 //没有初始化的全局变量会自动初始化为0。

10

7.3.2 全局变量与全局静态变量区别
  • 若程序由一个源文件构成时,全局变量与全局静态变量没有区别。

  • 若程序由多个源文件构成时,全局变量与全局静态变量不同:全局静态变量使得该变量成为定义该变量的源文件所独享,即:全局静态变量对组成该程序的其它源文件是无效的。

  • 具有外部链接的静态,可以在所有源文件里调用,除了本文件,其他文件可以通过extern的方式引用。

7.4 本地静态变量 7.4.1 什么是静态本地变量?

在本地变量定义时加上static变成静态本地变量。

int inc(){
    static int n = 1;
    n = n + 1;
    return n;
}
int main(){
    printf("%d\n",inc());
    printf("%d\n",inc());
    printf("%d\n",inc());
}
2
3
4

静态本地变量的初始化在第一次进入函数时执行,以后进入函数会保持离开的值。


静态本地变量是特殊的全局变量,具有全局生存周期和局部作用域。

7.5 总结
  • 变量的作用域和生命期
    作用域:变量或函数在运行时候的 有效作用范围 ;
    生命期:变量或函数在运行时候的没被销毁回收的存活时间。

分类作用域生命期
局部变量所在代码块内所在函数结束
全局变量所有文件内程序执行结束
静态局部变量所在代码块内程序执行结束
静态全局变量当前文件内程序执行结束
普通函数所有文件内-
静态函数当前文件内-
7.6 static关键字小结

static在C语言里面既可以修饰变量,也可以修饰函数。

  • 静态局部变量:
    1、在函数中定义的,生命周期是整个源程序,但是作用域和局部变量没区别。


    2、只能在定义这个变量的函数范围内使用,而且只在第一次进入这个函数时候被初始化,之后的初始化会跳过,并保留原来的值。


    3、退出这个函数后,尽管这个变量还在,但是已经不能使用了。

  • 静态全局变量:
    全局变量本身就是静态存储的,但是静态全局变量和非静态全局变量又有区别:
    1、全局变量:变量的作用域是整个源程序,其他源文件也可以使用,生命周期整个源程序。


    2、静态全局变量:变量的作用域范围被限制在当前文件内,其他源文件不可使用,生命周期整个源程序。

  • static函数(内部函数):
    只能被当前文件内的其他函数调用,不能被其他文件内的函数调用,主要是区别非静态函数(外部函数)。

在函数前面加上static就使它成为只能所在编译文件中使用的函数。


在全局变量前加上static使它成为只能所在编译文件中使用的全局变量。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/673481.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-19
下一篇 2022-04-19

发表评论

登录后才能评论

评论列表(0条)

保存