美文网首页
7.C(变量类型和作用域)

7.C(变量类型和作用域)

作者: 任振铭 | 来源:发表于2018-05-18 07:33 被阅读12次
    1.普通局部变量

    1)在{}内部定义的变量就是局部变量
    2)只有执行到定义变量的这个语句,系统才会给这个变量分配空间
    3)当离开{},这个非static局部变量自动释放
    4)局部变量的作用域在当前的{}。离开后无法使用
    5){}中的局部变量,加不加auto关键字都一样,局部变量也叫自动变量
    6)不同的{}中,变量名字可以一样
    7)普通局部变量不初始化,它的值为随机数

    2.static局部变量

    1)在{}内部定义的变量就是局部变量
    2)static局部变量,在编译阶段就已经分配空间,函数没有调用前,它已经存在
    3)当离开{},static局部变量不会释放,只有程序结束,才会释放
    4)局部变量的作用域在当前的{}。离开后无法使用
    5){}中的局部变量,加不加auto关键字都一样,局部变量也叫自动变量
    6)不同的{}中,变量名字可以一样
    7)static局部变量不初始化,值默认为0
    8)static局部变量初始化语句,只会执行一次,但是可以赋值多次
    9)static变量只能用常量赋值

    #include <stdio.h>
    void fun() {
        static int i = 0;
        i++;
        printf("i = %d\n", i);
        //static int j = i; err  static变量只能用常量赋值
    }
    int main() {
        fun();
        fun();
        fun();
        system("pause");
    }
    
    3.普通局部变量和static局部变量的区别
    内存分配和释放

    1)普通局部变量只有执行到定义的语句才分配空间;static变量在编译阶段已经分配
    2)普通局部变量离开作用域自动释放;static局部变量在整个程序结束释放

    初始化

    1)普通局部变量如果不初始化,值为随机数;static局部变量如果不初始化,值为0(int)
    2)static 局部变量初始化语句只有第一次执行时有效
    3)static局部变量只能用常量初始化

    3.普通全局变量

    1)在{}外面,也就是函数外面定义的变量为全局变量
    2)只要定义了全局变量,任何地方都能使用此变量
    3)如果使用变量时,在前面找不到此全局变量的定义,需要先声明后再使用
    4)全局变量不初始化,默认值为0
    5)在一个文件或多个文件中,普通全局变量只能定义一次(否则会报重复定义的错误),可以声明多次
    7)全局变量在编译阶段已经分配空间,在整个程序执行完毕释放

    #include <stdio.h>
    void fun() {
        //这样是错误的,虽然a是全局变量,但却在fun方法的后边定义,编译器编
        //译代码是从上往下的,所以在编译fun方法的时候,没有找到a的定义,这时候
        //需要声明一下才行
        //printf("a = %d\n",a);
    
         extern int a; //注意声明的时候不要赋值
         printf("a = %d\n",a);
    }
    int a = 10;
    int main() {
        fun();
        system("pause");
    }
    
    4.在多个文件中使用普通全局变量

    假设我创建了一个a.c的文件,在这个文件中定义了一些变量和方法,这些变量和方法会在多个类中使用,如下 a.c

    int a = 0;
    int b = 0;
    void test() {
        a = 10;
        b = 20;
    }
    

    假设我在1.c和2.c文件中都要调用test方法并且为ab赋值,那么需要这样做,使用之前要添加变量和方法的声明
    a.c

    #include <stdio.h>
    extern void test();
    extern int a;
    int main() {
        test();
        a = 100;
        system("pause");
    }
    

    2.c

    #include <stdio.h>
    extern void test();
    extern int a;
    int haha() {
        a = 1009;
        system("pause");
    }
    

    那么这样一来是非常繁琐的,假设a.c中有一百个方法一百个变量,另外有一百个文件都要用到a.c中的一百个方法和一百个变量,那么就要重复的在这一百个文件中声明这一百个变量和方法了,也就是同一个声明做了一百次,这样是毫无意义的,所以才有了头文件,a中的所有变量和方法都可以声明在一个头文件中,这样那一百个需要使用a中成员的文件只需要引入这个头文件即可,大大简化了无效代码,所以上边的三个文件可以这样写

    注意:不要在头文件中给变量赋值,(赋值之后相当于声明并定义了一个变量),此时如果在多个文件中引入这个头文件,相当于在多个文件中都定义了这个变量,而我们知道在一个文件或多个文件中,普通全局变量只能定义一次(否则会报重复定义的错误)

    //a.c
    int a = 0;
    int b = 0;
    void test() {
        a = 10;
        b = 20;
    }
    
    //a.h
    #pragma once  //防止重复引入
    extern int a;
    extern int b;
    extern void test();
    
    //1.c
    #include <stdio.h>
    //引入头文件
    #include "a.h"
    int main() {
        test();
        a = 100;
        system("pause");
    }
    
    //2.c
    #include <stdio.h>
    //引入头文件
    #include "a.h"
    int haha() {
        a = 1009;
        system("pause");
    }
    
    5.static全局变量

    1)static全局变量和普通全局变量的区别就是文件作用域不同,static全局变量只能在定义它的文件中使用,而普通全局变量在所有文件中都能使用,只需要声明即可,这一点和Java全然不同
    2)static全局变量不能通过extern关键字引入到别的文件中,extern关键字只用于普通全局变量
    3)不同文件只能出现一个普通全局变量定义
    4)一个文件只能有一个static全局变量的定义,不同文件间的static全局变量即使变量名相同,也是两个没有关系的变量
    5)不能在两个文件中定义两个变量名相同的普通全局变量,会报重复定义的错误,因为在一个文件中定义之后,在另一个文件就可以使用了,所以没必要也不允许那样定义

    //这样在两个文件中都定义了a,运行就会报错
    //1.c
    
    #include <stdio.h>
    int a = 100;
    //在1.c中定义一个static变量b
    static int b = 10;
    
    //一个文件只能有一个static全局变量的定义
    //这样再次定义b,会提示重定义
    //static int b = 29;
    int main() {
        system("pause");
    }
    //2.c
    #include <stdio.h>
    
    //这样在两个文件中都定义了a,运行就会报错
    //int a = 200;
    
    int haha() {
        //通过extern引入1.c中的static变量b,这是错误的,
        //不能这样使用,b只能在1.c中使用
        //extern int b;
        //b = 20;
        system("pause");
    }
    
    6.普通函数和static函数的区别

    函数和变量的使用原则是一样的,都是作用域上的区别

    1)在一个文件中定义了一个函数之后,所有文件都可以使用这个函数(前提是声明之后),不能在另一个文件中定义相同的函数
    2)一个文件可以有一个static函数,并且另一个文件可以有完全相同的一个函数的定义,但是这个static函数只能在当前文件使用

    7.变量作用域总结
    图片.png

    相关文章

      网友评论

          本文标题:7.C(变量类型和作用域)

          本文链接:https://www.haomeiwen.com/subject/xkswdftx.html