C程序设计语言——七、函数(3)局部、全局、寄存器、外部变量

目录

一、变量的作用域:存在空间性

1、指变量在程序中的有效范围

2、局(内)部变量,分布在动态存储区

3、全(外)局变量,分布在静态存储区(静态局部变量也分布在此)

4、不同的变量所分配的程序区

二、变量的生存期:存在的时间性

1、静态存储(static) static int a;

2、动态存储(auto)  auto int a;

三、C程序的存储类别

1、auto 型(自动变量)(缺省:系统默认状态)

2、static 型(静态变量)

3、register 型(寄存器变量)

4、extern 型(外部变量)

四、例题

1、《选择法对数组中的6个整数按由小到大排序,过程由函数实现》

2、《编写一个函数,判断一个5位数是否是回文数》

3、《编程找出3~1000的所有完数》

4、《斐波那契数列》


一、变量的作用域:存在空间性

1、指变量在程序中的有效范围

2、局(内)部变量,分布在动态存储区

  1. 在函数内(符合语句内)定义的变量,它只在本函数内(复合语句内)有效
  2. 生存期是该语句块,进入语句块时获得内存,仅能由语句块内语句访问,退出语句块时释放内存,不再有效;随用随分配,用完就释放;
  3. 定义时不会自动初始化,除非程序员制定初值;
  4. 并列语句块各自定义的同名变量互补干扰,不同函数可以有相同的变量名
  5. 形参和实参可以同名;
  6. 形参也是局部变量;
  7. 主函数里的变量也是局部变量;
  8. 复合语句里定义的变量也是局部变量;复合语句的局部变量和本函数的局部变量同名时,本函数的局部变量不起作用;内部的优先

3、全(外)局变量,分布在静态存储区(静态局部变量也分布在此)

  1. 在所有函数之外定义的变量;
  2. 生存期是整个程序,从程序运行起占内存,程序退出时释放内存;
  3. 有效范围是从定义变量的位置开始到本程序结束;
  4. 全局变量必须在所有函数之外定义,且只能定义一次
  5. 如果在其作用域内的函数定义了同名局部变量,则在局部变量的作用域内,同名全局变量暂时不起作用;内部的优先
  6. 可以通过声明一个extern的全局变量扩展全局变量的作用域,也可以通过定义一个static的全局变量限制这种扩展;
  7. 全局变量增加函数间数据联系,函数只能返回一个值,可用影响全局变量的方式带回给主调函数多个值;
  8. 全局变量会降低程序的清晰性,因为所有函数都能影响变量的值;
  9. 全局变量的初值为0。

4、不同的变量所分配的程序区

程序区 静态存储区 动态存储区
变量作用域 全(外)局变量,静态局部变量 局部变量,寄存器变量
分配 编译时分配内存 随用随分配
释放 用完不释放,程序结束时释放
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我来回答你的问题。 首先,为了回答这个问题,我们需要先了解一下存储类别的概念。存储类别是用来描述变量函数的存储方式的,在 C 语言中,常见的存储类别有以下五种: 1. auto: 自动存储类别,是默认的存储类别。它表示变量在程序中的存储位置是随着程序的进展而自动分配的。它的作用域是定义它的代码块内。 2. register: 寄存器存储类别,用于定义那些需要频繁访问的变量。这些变量存储在 CPU 的寄存器中,以提高程序的运行效率。 3. static: 静态存储类别,表示变量在程序的整个生命周期内都存在,即使在函数调用结束后也不会被销毁。它可以用于局部变量全局变量,具体的作用域取决于变量的定义位置。 4. extern: 外部存储类别,用于引用在其他源文件中定义的全局变量函数。它的作用域是整个程序。 5. typedef: 类型定义存储类别,用于定义新的数据类型。 接下来,我们来设计一个程序,让它包含上述不同存储类别的变量函数: 文件1:main.c ```c #include <stdio.h> int global_var = 10; static int static_global_var = 20; void func(void); int main() { auto int auto_var = 30; register int register_var = 40; printf("auto_var = %d\n", auto_var); printf("register_var = %d\n", register_var); printf("global_var = %d\n", global_var); printf("static_global_var = %d\n", static_global_var); func(); return 0; } ``` 文件2:func.c ```c #include <stdio.h> extern int global_var; static int static_var = 50; void func(void) { auto int auto_var = 60; register int register_var = 70; printf("auto_var = %d\n", auto_var); printf("register_var = %d\n", register_var); printf("global_var = %d\n", global_var); printf("static_var = %d\n", static_var); } ``` 在上述程序中,我们定义了不同类型的变量函数,其中: - main.c 中定义了全局变量 global_var 和静态全局变量 static_global_var,以及在 main 函数中定义的自动变量 auto_var 和寄存器变量 register_var; - func.c 中定义了静态变量 static_var,以及在 func 函数中定义的自动变量 auto_var 和寄存器变量 register_var。 接下来,我们来编译这个程序。我们可以使用 gcc 编译器来编译这个程序: ```bash $ gcc main.c func.c -o program ``` 编译时,我们可以加上 -Wall 参数以显示所有警告信息。 编译成功后,我们可以运行这个程序: ```bash $ ./program ``` 运行结果如下: ``` auto_var = 30 register_var = 40 global_var = 10 static_global_var = 20 auto_var = 60 register_var = 70 global_var = 10 static_var = 50 ``` 通过运行结果,我们可以看出: 1. auto 变量和 register 变量的作用域仅限于定义它们的代码块内,它们的值在函数调用结束后被销毁; 2. 全局变量和静态变量的作用域是整个程序,它们的值在程序的整个生命周期内都存在; 3. 静态变量只能在定义它们的源文件中访问,其他源文件无法访问它们; 4. 全局变量可以在其他源文件中使用,但需要使用 extern 关键字进行声明。 此外,在编译程序时,我们可以从编译器的输出信息中看出一些关于存储类别的信息。例如,当我们加上 -Wall 参数编译程序时,编译器会输出一些警告信息,其中一些涉及到存储类别: ``` warning: 'auto' storage class specifier is redundant [-Wredundant-decls] warning: 'register' storage class specifier is deprecated and incompatible with C++ [-Wdeprecated-register] ``` 这些警告信息告诉我们,在 C 语言中,auto 存储类别是默认的存储类别,因此在定义变量时不需要显式指定 auto 关键字;而 register 存储类别在 C++ 中已经被废弃,不再被支持。 综上所述,存储类别是描述变量函数存储方式的重要概念,它们的作用范围和生命周期不同,可以通过编译器的输出信息和程序的运行结果来了解它们的特性与区别。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值