C语言中的变量与函数

变量


局部变量

在函数内部定义的变量,称为局部变量。 函数的形参也是局部变量

全局变量

所有在函数外部定义的变量,称为全局变量

全局变量的作用范围是从定义变量的位置开始到源程序结束,即全局变量可以被在其定义位置之后的其它函数所共享。

变量的存储类型

C语言根据变量的存储类型(变量存储的位置:1. 运行时堆栈 2.普通内存 3.寄存器)的不同,可以把变量分为:自动变量、静态变量、寄存器变量

  • 哪些是自动变量:被关键字auto修饰的局部变量都是自动变量,但是极少使用这个关键字,

基本上是废的,因为所有的局部变量在默认情况下都是自动变量。存于堆栈

  • 哪些是静态变量: 存于内存,程序结束才销毁
    • 所有的全局变量都是静态变量
    • 被关键字static修饰的局部变量也是静态变量
  • 哪些变量是寄存器变量:
    • 被关键字register修饰的局部(自动)变量都是寄存器变量
    • 只有局部变量才可以是寄存器变量,全局变量和静态局部变量不行
    • 寄存器变量只限于int、char和指针类型变量使用

static与全局变量、局部变量

static修饰的变量,其生命周期是存活于整个程序的运行期间的。

  • 静态局部变量

    因其生命周期原因,所以值的变化,会影响之后的操作。

1
2
3
4
5
6
7
8
9
void test_static_params() {
static int pp = 8;
pp++;
printf("%d\n", pp);
}
for (int i=0; i<5; i++) {
test_static_params();
}

上例,会输出;9 10 11 12 13

  • 静态全局变量

    定义在函数外,如:static int MAX = 10; 这样的变量,即为静态的全局变量,通常定义在”头文件”中。

    static 修饰时,不能再有 extern 同时修饰。

extern与全局变量、局部变量

  • 默认情况下

    一个函数不可以访问在它后面定义的全局变量,若要使它可以访问,则需要在函数外声明并加上extern,如:

1
2
3
4
5
extern int xx;
void test1() {
printf("x===%d\n", xx);
}
int xx = 99;

声明在函数外的变量,默认就是全局的,extern可以省略。

  • 多次声明同一个全局变量

    这种情况下,不会报错,只表示一个变量。 即使在多个源文件中声明的同名的全局变量,也都代表着同一个变量。

    前面说过,extern可以省略,都是表示全局变量。

    但,如下情况是会报错的:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    //file: test.h
    extern int MAX;
    //file: main.c
    #include "test.h"
    extern int MAX;
    main {
    MAX = 10;
    }

    如下这样使用,也是有问题的:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    //file: test.h
    int MAX;
    //file: main.c
    #include "test.h"
    extern int MAX;
    main {
    MAX = 10;
    }

    还有,两个文件中都定义成 int MAX, 也不行。

    那么除去上面三种情况,只有一种是正确的:test.h 定义成 extern int MAX; 在main.c中 int MAX

    1. extern 修饰的全局变量,不建议直接声明时初始化
    2. 使用extern 声明后,需要再 『定义』一次,即不使用extern 进行定义。这时会分配内存空间,且可以进行初始化
    3. 多个文件中都存在同一个全局变量时:在要使用的地方,需要使用 『定义』式,以分配空间。
  • 在局部变量前 加extern

    1
    2
    3
    4
    5
    int y = 10; //这样声明并初始化是可以的, 但加上extern后,xcode报了警告,不影响运行
    void test() {
    // int y = 11; //这是局部变量
    extern int y = 12; //这是全局变量
    }

    同名的局部变量和全局变量,是不能在同一个函数内,同时出现的。

函数


内部函数

static 修饰的函数为内部函数,该函数就只能在其定义所在的文件中使用。

1
static void inner(void);//无参时,写上一个void, xcode编译器推荐,一般仅定义在头文件上

定义在前面的函数,可以访问定义在后面的所有函数

外部函数

extern 修饰的函数为外部函数。一般省略该关键字,即默认就是外部函数

1
extern void outer(void);

通常在头文件中,定义好外部函数;在源文件中进行实现。

要引用其它外部函数时,只需要引入其所在的头文件: #include "inner.h"

若,当前源文件中的函数 与 引用的外部函数 同名,且参数个数与类型一致,会报错。

------ 本文结束 ------

版权声明
协议:No Fuck License

stone 创作并维护
本文首发于 stone世界 博客( http://stone86.top
版权所有,侵权必究。如要转载,请声明出处

Fork me on GitHub