美文网首页
2019-03-12 计算机二级C语言程序设计之C语言中用户标识

2019-03-12 计算机二级C语言程序设计之C语言中用户标识

作者: NoelleMu | 来源:发表于2019-03-12 10:26 被阅读0次

参考资料:高教版《全国计算机等级考试二级教程——C语言程序设计》、《21天学通C语言》

局部变量、全局变量和存储分类

用户标识符的作用域

所谓标识符的“作用域”就是指程序中的某一部分,在这一部分中,该标识符是有定义的,可以被C编译和连接程序所识别,也就是说,指的是程序中的哪些部分可以访问变量。

作用域还会影响变量的生存期,也就是变量在内存中存活的时间,或者说何时分配和释放变量占用的内存空间。

局部变量、全局变量和存储分类

在函数内部或复合语句内部定义的变量,称为局部变量。函数的形参也属于局部变量。

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

有时,局部变量也被称为内部变量,全局变量也被称为外部变量

C语言中,有两种存储类别:自动类静态类。全局变量只能是静态类,而局部变量既可以是静态类也可以是自动类。

局部变量及其作用域和生存期

auto变量

当在函数内部或复合语句内定义变量时,如果没有指定存储类,或者使用了auto说明符,系统就认为所定义的变量具有自动类别。

在函数内部或复合语句内,以下两条语句是等价的:

float a;

auto float a;

auto变量的存储单元被分配在内存的动态存储区。这类局部变量的作用域是从定义的位置起到函数体(或复合语句)结束为止。

register变量

寄存器变量也是自动类变量,它与auto类的区别仅在于:用register说明的变量建议编译程序将变量的值保留在CPU的寄存器中,而不是占内存单元。

当程序对运行速度有较高要求时,把那些频繁引用的少数变量指定为register变量,有助于提高程序的运行速度。

例1 以下函数用power()计算x^n

#include <stdio.h>

int power(int, register int);

int main(void)
{
    int s;
    
    s = power(5, 3);
    printf("%d\n", s);
    
    return 0;
}

int power(int x, register int n)
{
    register int p;
    
    for(p = 1; n; n--)
        p = p * x;
    
    return p;
}

在power()函数中,用作循环变量的n和存放连乘积的变量p被定义为register变量,以加快求职速度。

注意:

  1. 只能说明少量的寄存器变量。
  2. register变量没有地址(因为不是放在内存中的)。

静态存储类的局部变量(static变量)

当在函数体或复合语句中用static来说明一个变量时,可以称该变量为静态局部变量

静态局部变量与前两种变量有以下区别:

  1. 整个程序运行期间,静态局部变量在内存的静态存储区中占据着永久性的存储单元。所以,静态局部变量的生存期将一直延长到程序结束。
  2. 静态局部变量的值是在编译时赋予的,而不像自动变量是在程序执行过程中赋值。对于没有赋初值的静态局部变量,C编译程序给其自动赋初值0。

全局变量及其作用域和生存期

全局变量只有静态一种类别。对于全局变量可以使用externstatic两种说明符。

全局变量的作用域和生存期

全局变量的在函数外部任意位置上定义的变量。它的作用域是从变量定义的位置开始,到整个源文件结束为止。

全局变量的生存期是整个程序运行期间

注意:若全局变量和某个局部变量同名,则在该函数中,访问的是局部变量,与同名的全局变量不发生任何关系。

例2 同名的局部变量与全局变量

#include <stdio.h>

int sum;                                    //定义全局变量

void fun(void);

int main(void)
{
    sum = 10;
    
    printf("* * main(1) * *:%d\n", sum);
    fun();
    printf("* * main(2) * *:%d\n", sum);
    
    return 0;
}

void fun(void)
{
    int sum;                                //定义同名局部变量
    
    sum = 20;
    printf("* * fun * *:%d\n", sum);
}

输出:

* * main(1) * *:10
* * fun * *:20
* * main(2) * *:10

注意:除十分必要外,一般不提倡使用全局变量。

在同一编译单位内用extern说明符扩展全局变量的作用域

当全局变量定义在后,引用它的函数在前时,应该在引用它的函数中用extern对此全局变量进行说明。这时其作用域从extern说明处起,延伸到该函数的末尾。函数使用全局变量时,最好在函数内使用extern关键字声明该变量。

静态全局变量

当用static说明符说明全局变量时,此变量可称作“静态”全局变量。静态全局变量仅局限于本编译单位使用,不能被其他编译单位所引用。

函数的存储分类

所有函数都是外部的,因为不允许在函数内部定义另一个函数。

但当定义函数时,可以使用extern或static说明符。

用extern说明函数

当定义一个函数时,若在函数返回值的类型前加上说明符extern,则称此函数为“外部”函数

注:extern说明符可以省略,一般的函数都隐含说明为extern。

外部函数可以被其他编译单位中的函数调用。通常,当函数调用语句与被调用函数不在同一编译单位,且函数的返回值为非整数时,应该在调用语句所在的函数的说明部分用extern对所调用的函数进行函数说明。

用static说明函数

当定义一个函数时,若在函数返回值的类型钱加上说明符static,则称此函数为“静态”函数

静态函数只限于本编译单位的其他函数调用它,而不允许其他编译单位中的函数对它进行调用。所以,静态函数又可称作“内部”函数。

相关文章

网友评论

      本文标题:2019-03-12 计算机二级C语言程序设计之C语言中用户标识

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