C语言课件 变量的存储属性
C语言变量的存储属性和预编译命令

作用
其
……}
范围
中
f2 ( int k )
可
{……}
以
用
char c1,c2;
main( )
c1、c2 作用
{……} void f3( )
范围
{ double s;}
p、q 作用 范围
若同一源文件中、外部变量与局部变量同
名,则在局部变量旳作用范围内,外部变
量不起作用。
例24. int a=3 , b=5;
printf("%d",f(a));} 运营成果:7 8 9
例27. 打印1到5旳阶乘值。
int fac(int n)
静态局
{static int f=1; 部变量
f=f*n; return(f);}
不用循环 原值保存
void main()
{int i;
i
f
11
2 1*2
3 2*3
4 6*4
5 24 *5
成果: f:3,5 main:1000,5
main ( )
局部变量
{int a=1000;
f( );
printf ("main:%d,%\n" , a , b ) ;}
f( )
{ printf ("f :%d,%\n" , a , b ) ;}
例25. 外部变量与局部变量同名。
int a=3,b=5; a,b为外部变量
五.全局变量:静态 。
一、auto变量
自动变量:
函数中旳形参、局部变量、复合语句中定义 旳变量,如不专门申明为static存储类别, 都是动态地分配存储空间旳,数据存储在动 态存储区中。调用函数时系统会给它们分配 存储空间,函数调用结束自动释放这些存储 空间。用关键字auto作存储类别旳申明, auto能够省略,auto不写隐含为“自动存 储类别” 。
C语言中变量储存的类别

C语言中变量储存的类别C语言根据变量的生存周期来划分,可以划分为静态存储方式和动态存储方式。
静态存储方式:是指在程序的运行期间分配固定的存储空间的方式。
静态存储区中存储放了在整个程序执行过程中都存在的变量,如全局变量动态存储方式:是指在程序运行期间根据需要进行动态的分配存储空间的方式。
动态存储区中存放的变量是根据程序运行需要而进行的需要而建立和释放的。
通常包括:1.函数形式参数;2.自动变量;3.函数调用时的现场保护、4.和返回值地址等。
C语言中的存储类别又分为4类:自动(auto)、静态(static)、动态(extern)寄存器(register)1、用关键字auto定义的变量为自动变量,auto可以省略,auto 不写则隐含定为”自动存储类别“,属于动态存储方式。
2、用static修饰的为静态变量,如果定义在函数内部,称之为静态局部变量;如果定义在函数外部,称之为静态外部变量,注意:静态局部变量属于静态存储类别,在静态存储区内分配存储单元,在程序整个运行期间都不释放;静态局部变量在编译时赋初值,即只赋初值一次;如果在定义局部变量时,不赋初值的话,则对静态局部变量来说,编译时自动赋初值0.(对数值型变量)或空字符(对字符变量)。
3、为了提高效率,C语言允许将局部变量得值放在CPU中的寄存器中,这种变量叫”寄存器变量“,用关键字register做声明注意:只有局部自动变量和形式参数可以作为寄存器变量;一个计算机系统中的寄存器数目有限,不能定义任意多个寄存器变量局部静态变量不能定义为寄存器变量。
4、用extern声明的变量是外部变量,外部变量的意义是某函数可以调用在该函数之后定义的变量任务:运行结果是x=2;x=4;x=8;x=16;x=32;x=100。
c变量的存储类别

c变量的存储类别
对c变量的存储类别总结一下:
在c语言中每个变量和函数有两个属性:数据类型和数据的存储类别。
存储类别是指数据在内存中的存储方式。
存储类别分为:静态存储类和动态存储类!具体包含4中:auto 、static、register、extern。
1.从作用域角度分:局部变量和全局变量。
采用的存储类别为:
局部变量:
(1) atuo(离开函数,值就消失)
(2) static(离开函数,值仍存在)
(3)register(离开函数,值就消失)
(4)(形参可以定义为atuo或register)
全局变量:
(1)static(只限本文件引用)
(2)extern(允许其他文件引用)
2.从变量存在的时间来分:静态存储和动态存储。
静态存储是程序整个运行时间都存在。
动态存储是在调用函数时临时分配单元静态存储:
(1)静态局部变量(函数内有效)
(2)静态外部变量(本文件内有效)
(3)外部变量(允许其他文件引用)
动态存储:
(1)atuo(本函数内有效)
(2)register(本函数内有效)
(3)形参(函数内有效)
3.从变量存放的位置来分:
内存中的静态存储区:
(1)静态局部变量
(2)静态外部变量(函数外部静态变量)
(3)外部变量(可为其他文件引用)
内存中的动态存储区:自动变量和形参CPU中寄存器:寄存器变量
注意:作用域与生存期的区别。
C语言程序设计教程课件8.4 变量的属性

9.
printf("The inner z = %d\n", z);
10.
}
11.
printf("The outer z = %d\n", z);
12.
return 0;
13. }
8.4.1 局部变量和全局变量
2. 全部变量(外部变量)
在函数之外定义的变量是外部变量。 作用范围:从定义变量的位置开始到本文件结束。
8.4.1 局部变量和全局变量
【例8-12】 局部变量示例。
1. #include <stdio.h>
2. int main()
3. {
4.
int x;
/*作用域: 4~19行*/
5. {
6.
int y; /*作用域:6~12行*/
7.
{
8.
int z; /*作用域:8~10行*/
9.
x = 1; y = 2; z = 3; m = 4;
8.4.1 局部变量和全局变量
关于局部变量的作用域的说明: 3. 主函数main中定义的变量只能在主函数中使用, 不能在其他函数中使用。同时,主函数中也不 能使用其他函数中定义的变量。因为主函数也 是一个函数,它与其他函数是平行关系。 4. 在复合语句中也可定义变量,其作用域只在复 合语句范围内。上下级复合语句变量名也允许 相同。
16.
increaselocal(gCount);
17.
printf("After increaselocal function:%d\n", gCount);
18.
return 0;
19. }
局 部 变 量 gCount 加 1, 对 全
c语言变量和数据存储

第2章变量和数据存储C语言的强大功能之一是可以灵活地定义数据的存储方式。
C语言从两个方面控制变量的性质:作用域(scope)和生存期(lifetime)。
作用域是指可以存取变量的代码范围,生存期是指可以存取变量的时间范围。
作用域有三种:1. extern(外部的) 这是在函数外部定义的变量的缺省存储方式。
extern变量的作用域是整个程序。
2.static(静态的) 在函数外部说明为static的变量的作用域为从定义点到该文件尾部;在函数内部说明为static的变量的作用域为从定义点到该局部程序块尾部。
3.auto(自动的) 这是在函数内部说明的变量的缺省存储方式。
auto 变量的作用域为从定义点到该局部程序块尾部。
变量的生存期也有三种,但它们不象作用域那样有预定义的关键字名称。
第一种是extern和static变量的生存期,它从main()函数被调用之前开始,到程序退出时为止。
第二种是函数参数和auto变量的生存期,它从函数调用时开始,到函数返回时为止。
第三种是动态分配的数据的生存期,它从程序调用malloc()或calloc()为数据分配存储空间时开始,到程序调用free()或程序退出时为止。
2.1 变量存储在内存(memory)中的什么地方?变量可以存储在内存中的不同地方,这依赖于它们的生存期。
在函数外部定义的变量(全局变量或静态外部变量)和在函数内部定义的static变量,其生存期就是程序运行的全过程,这些变量被存储在数据段(datasegment)中。
数据段是在内存中为这些变量留出的一段大小固定的空间,它分为两部分,一部分用来存放初始化变量,另一部分用来存放未初始化变量。
在函数内部定义的auto变量(没有用关键字static定义的变量)的生存期从程序开始执行其所在的程序块代码时开始,到程序离开该程序块时为止。
作为函数参数的变量只在调用该函数期间存在。
这些变量被存储在栈(stack)中。
C语言-第七章-变量的存储类型-luoxch-new-第一部分

第七章变量声明——存储类型变量:是一个命名的存储区域,在程序运行中其值可以发生改变变量的数据类型:具有数据类型,决定了该变量所分配的存储空间的大小,同时决定了在该变量上能够进行的操作变量的其它属性:存储方式、生命期、作用域通过变量声明的位置和存储类型决定。
存储类型包括auto、static、extern和register,声明中最多可以出现一种存储类型,且放置于声明中的首要位置。
变量的生命期变量分配存储空间使用变量变量生命期释放存储空间变量的生存期是一个时间的概念,由变量的存储类型决定。
变量的作用域在变量的生存期内,可以使用该变量的范围称为变量的作用域。
在变量作用域内引用变量,称变量在此作用域内“可见”变量的作用域是一个空间的概念,由变量定义语句的位置决定,根据变量定义语句位置的不同,变量分为局部变量和全局变量。
函数内定义的变量,其作用域为所在的函数,所有函数以外定义的变量,即全局变量,其作用域从定义位置开始,直到程序结束。
变量作用域作用域含义块作用域两个花括号包围的部分,如函数体,复合语句等语句块文件作用域从声明开始到文件结束全局作用域整个软件所有源文件变量的存储类型程序在系统中运行时,操作系统为其分配的存储空间可划分为四个区域,每个区域存放不同的数据。
函数调用是在公共数据区stack area中建栈完成的。
动态内存分配是在heap area中进行分配的。
局部变量动态分配内存全局变量静态变量程序代码变量的存储类型•自动变量/局部变量•静态变量•全局变量•寄存器变量自动变量在函数(模块)内部定义的变量称为自动变量,也称为局部变量。
其生命期和作用域均为局部的,即在函数(模块)内可见,作用域为函数内部(块作用域)。
局部变量存放在栈区中,函数被调用时,局部变量在栈区分配存储空间,函数调用结束时,局部变量随之消失,其值不能保存。
生命期是在函数调用期间。
局部变量在C中没有缺省初值,如果未被显式初始化,其值不确定。
《C语言的变量》ppt课件

静态部分变量
部分变量加以static进展声明就是静态部分变量。
【例3-5】经过求1到100的和,阐明静态部分变量的运用方
法。
静态全局变量
全局变量加以static进展声明就是静态全局变量。
.
13
3.3.4 外部变量
在前面讲全局变量时曾经提到,假设需求扩展外部变量的作用域, 使其在程序中的各个源文件和各个函数中都可以运用此全局变量, 就需求用“extern〞关键字来声明全局变量。外部变量声明的普 通格式为:
变量在程序运转过程中,因需求运用才建立,而运用终了就被 删除。具有动态生存期的变量有部分自动变量和存放器变量,具 有动态生存期的变量存储在程序的动态数据区中。
【例3-1】运用for循环延续打印变量值,以阐明全程生存期
和动态生存期的区别。
.
4
3.1.2 变量的作用域
全局作用域 对于具有全局作用域的变量,可以在程序的任何位置访问它们。 部分作用域 变量在复合语句内部或者函数内部声明,无法被复合语句外或
register 数据类型 变量名
【例3-6】经过求20的阶乘,引见存放器变量。
.
15
3.3.6 变量存储类型小结
按照作用域分类如下图:
局部变量
自动变量 静态局部变量 寄存器变量 函数形参
非静态全局变量 (可用 extern 声明)
静态全局变量
.
16
3.3.6 变量存储类型小结
按照生存期分类,如下图:
extern变量名
外部变量的运用主要分为两种情况:
〔1〕在一个源代码文件内声明外部变量。
〔2〕在多个源代码文件间声明外部变量。
.
14
3.3.5 存放器变量
c语言中变量存储方式

c语言中变量存储方式在C语言中,变量是用来存储数据的一种方式。
C语言中的变量可以存储不同类型的数据,如整数、浮点数、字符等。
变量在内存中的存储方式决定了其在程序运行过程中的表现形式和特性。
本文将介绍C语言中常见的变量存储方式。
1. 自动变量(auto)自动变量是在函数中定义的局部变量,默认情况下存储在栈(stack)中。
栈是一种后进先出(LIFO)的数据结构,用于存储局部变量、函数参数和函数返回值等。
当函数调用结束时,栈中的局部变量会被自动释放。
自动变量的生命周期与函数的执行时间相同。
2. 静态变量(static)静态变量是在函数中定义的局部变量,在函数执行结束后不会被释放,而是存储在静态存储区。
静态存储区是在程序运行期间一直存在的一块内存空间,用于存储全局变量、静态变量和常量等。
静态变量的生命周期与程序的执行时间相同,但作用域仅限于定义它的函数内部。
3. 全局变量(global)全局变量是在函数外部定义的变量,存储在静态存储区。
全局变量的生命周期与程序的执行时间相同,作用域为整个程序。
全局变量可以在程序的任何地方被访问和修改,但应注意避免滥用全局变量,以防止命名冲突和程序的可维护性问题。
4. 寄存器变量(register)寄存器变量是通过register关键字声明的变量,用于将变量存储在CPU的寄存器中,以提高访问速度。
寄存器是CPU内部的一种高速存储器,用于存储临时数据和变量。
寄存器变量的使用受到编译器的限制,编译器可以选择是否将变量存储在寄存器中,也可以忽略register关键字的请求。
5. 动态内存变量(dynamic)动态内存变量是通过动态内存分配函数(如malloc、calloc等)在程序运行时手动分配的内存空间。
动态内存分配是一种灵活的内存管理方式,可以根据程序的需要动态地申请和释放内存。
动态内存变量的生命周期由程序员控制,需要手动释放以避免内存泄漏。
总结:C语言中的变量可以根据存储方式分为自动变量、静态变量、全局变量、寄存器变量和动态内存变量。
专升本C语言课件C08存储属性及预处理

01
02
解决方案
仅在必要时使用宏定义,并尽量保持其简单 明了。避免在宏定义中使用复杂的表达式和 副作用。
问题2
未正确使用条件编译,导致不必要的 代码被编译和执行。
03
问题3
未包含必要的头文件,导致编译错误或链接 错误。
05
06
04
解决方案
根据编译环境和目标平台,合理使用 条件编译指令(如`#ifdef`、 `#ifndef`等),确保只编译必要的代 码。
问题2
在函数内部错误地使用了全局变量的存储属性。
解决方案
全局变量应声明在函数外部,并使用`extern`关键字在函 数内部引用。
问题3
未考虑到存储属性对内存分配和性能的影响。
解决方案
了解不同存储属性对内存分配和访问速度的影响,根据实 际需求选择。
预处理指令使用不当导致的问题
问题1
滥用宏定义,导致代码可读性降低和潜在错误。
03
预处理概述
预处理的定义
预处理是指在C语言编译过程中,对 源代码进行的一系列处理操作。
预处理指令是以“#”开头的特殊指 令,用于在编译前对程序进行特定的 处理。
预处理的作用
01
提高代码的可读性 和可维护性
通过预处理指令,可以将一些常 用的代码片段或宏定义集中管理, 使代码更加清晰易懂。
02
实现条件编译
静态存储类型
静态局部变量在函数调用之间保持其值,静态全局变量在 程序执行期间一直存在。静态变量在程序开始执行前创建 ,并在程序结束时销毁。
寄存器存储类型
寄存器变量存储在计算机的寄存器中,而不是内存中。这 使得对寄存器变量的访问速度更快,但寄存器变量的数量 有限。
c8变量的存储属性 山东建筑大学c语言课件

说明:
a=i3n;…t ab…[=N.4];={1,2,3,4,5};
形参属于局部变量 prf}ionrt(fi(="0m;ia<inN:a/2=;%i+d+,)b=%d\n",a,b);
局ma部in中变定量义可的用变存量储只类在型m:spauari{c{unibhnt中(oat)i、rfn有;(ft"i2tinr效m(,eejitg;mn,atitesipxnt不me=,:iranp能a、=t[;yi因%])s;t为dat,ixb在c,=,ym,%ia,默ji有dn认\函n效"为数,aa中,ubt)定o; 义 就定在义整的个变文量件。或程序中}su有b效(})。…m…aai[[iNn]函=-ia数-[1N也]运=-不it行-e1能m结];p使果; 用:其它函数中
运行结果:1 2 3
例 变量的寿命与可见性 -------Main------
i:1 a:0 b:-10 c:0 全局i
437135
#include <stdio.h> int i=1;
------Other------
main: a other: a
0 462
i:33 a:4 b:0 c:15 other: b
例 引用其它文件中的外部变量
int global; extern float x; main() { int local;
. . . }
file1.c
extern int global; static int number; func2() {.
. . }
file2.c
float x; static int number; func3() { extern int global;
c语言变量与常量的定义与存储方式

c语言变量与常量的定义与存储方式
C语言中,变量和常量是用来存储数据的。
1. 变量的定义与存储方式:
- 变量是一个具有特定类型和名称的内存位置,用于存储和操作数据。
在C语言中,变量的定义一般遵循以下格式:`类型变量名;` 例如:`int age;`
- 变量可以存储不同类型的数据,如整数、浮点数、字符等。
不同类型的变量需要占用不同大小的内存空间。
- 变量在内存中的存储方式取决于它们的作用域和声明位置: - 全局变量:全局变量在程序开始执行时被分配内存,在整个程序运行期间都有效。
它们存储在静态数据区中。
- 局部变量:局部变量只在其所在的代码块内有效,比如函数内部。
它们在代码块执行时被分配内存,离开代码块后释放。
局部变量通常存储在栈中。
2. 常量的定义与存储方式:
- 常量是指在程序运行过程中不能改变的值。
在C语言中,常量可以分为字面常量和符号常量两种形式。
- 字面常量是直接写入代码中的值,如整数常量、浮点数常量、字符常量等。
它们在程序编译时就被分配内存,存储在静态数据区中。
- 符号常量是使用`#define`宏定义或者`const`关键字定义的常量,它们在编译期间会被替换为相应的值。
符号常量通常存储在
静态数据区中。
总结:C语言中,变量和常量都是用来存储数据的,但变量可以改变其存储的值,而常量则不能改变。
变量的存储方式取决于其作用域和声明位置,常量则在编译期间被分配内存。
第2章C语言的基本数据类型和变量的存储类58页PPT

a='x'; b='y'; 实际上是在a、b所在的两个字节内分别存放整数120和121:
a: 0 1 1 1 1 0 0 0
b: 0 1 1 1
1001
2020/4/25
11
char型与int型之间的关系
注意: 1、一个字符型变量占一个字节,只能存放一个
字符,存放该字符的ASCII码值; 2、由于字符型数据也是以整数形式进行存储,
所以它可以以字符形式、整数形式输出; 3、常用字符的ASCII码值:
’ ’ :0x20(32) ’0 ’ : 0x30(48) ’A’ :0x41(65) ’a’ :0x61(97)
C数据类型如下:
变量的概念
变量
变量是指在程序运行过程中可以发生改变的量 变量的特征: (1)它有一个变量名,变量名的命名方式符合标识符的
命名规则。 (2)变量有类型之分。
不同类型的变量占用的内存单元(字节)数不同, 因此每个变量都有一个确定的类型。 (3)变量可以存放值。 程序运行过程中用到的变量必须有确切的值,变量 在使用前必须赋值,变量的值存储在内存中。在程 序中通过变量名来引用变量的值。
"x"和’x’是不同的
字符常数的表示方法 – ’a’,’A’,’5’,’%’,’$’…… – 单引号内只能有一个字符,除非用“\”开头
就是一个普通整数,也可以参与各种数学运算 – 每个字符具有一个0~255之间的数值,可从ASCII表查出 – 注意:’6’和整数6的区别 – 字符的数学运算在密码学内用得比较多
第2章__C语言的基本数据类型和变量的存储类

C 语 言 程 序 设 计
2.1 整 型 数 据
2.1.1 整型常量 整型常量即整常数,C语言中的整常数可以 有三种表示形式,即十进制整数、八进制整 数和十六进制整数。下面分别给出它们的语 法图。
第 二 章 基 本 数 据 类 型 和 变 量 存 储 类
C 语 言 程 序 设 计
2.1 整 型 数 据
第 二 章 基 本 数 据 类 型 和 变 量 存 储 类
C 语 言 程 序 设 计
2.3 浮点型数据
2.3.4 浮点型数据的误差分析 对于一般微型机而言,一个float型变量占用4字节,能保证 大约7位精度。超过7位的数据将会被舍去。由此会带来一些 数据上的误差。例如: #include <stdio.h> void main() { float x,y; x=789456.123e5; y=x+30; printf("y=%f\n",y); }
第 二 章 基 本 数 据 类 型 和 变 量 存 储 类
-0的原码:
10000000
00000000
00000000
00000000
9的原码: 的原码 -9的原码: 的原码
00000000
00000000
00000000
00001001
10000000
00000000
00000000
00001001
2.2 字符型数据
2.2.3 字符型数据的存储表示 字符型数据在C语言中是和整型数据同等对待的。任何一个 字符都相当于一个整型量,其值就是该字符的编码值。C语 言中凡是整型量可以出现的地方,字符型量都可以出现。 对于采用ASCII编码的系统,每个字符在计算机中占用一个 字节的存储单元,其中存放相应字符的ASCII编码。实际上, C语言在内部将每个字符型量都看作字长为8的整型量。
第2章 数据类型及变量的存储属性

2.5 变量的存储属性
C语言的变量除了具备一定的数据类型外,还具有另外一个属性,即存储属性,也 可称之为存储类别或存储类型.在讨论变量的存储属性之前,先要弄清变量的存在性 和可见性两个概念.
2.5.1 变量的存在性和可见性
1.变量的存在性 所谓变量的存在性就是变量占用存储空间的时限. 一个变量的存在性是指在整个程序执行过程中,该变量的寿命是全局的还是局部的.一 个具有全局寿命的变量,则可在整个程序的生存期内占有固定的存储空间,其数值一直 被保存.一个具有局部寿命的变量,当程序的控制流程进入定义该变量的程序块(分程序 或函数)时,才会为其分配一块新的,临时的存储空间;当程序的控制流程退出该程序块 时,这块存储空间就被释放,那么该变量也就不再有意义了,变量原先所具有的值也就 不存在了. 2.变量的可见性 变量的可见性就是在变量占用存储空间时间内是否能够被引用.变量的可见性是指该变 量的有效作用范围,也可称之为作用域. 描述变量存储属性的关健字有如下四种: auto(自动型),register(寄存器型),static(静态型),extern(外部型) 它告诉编译程序怎样为变量分配存储空间.
2.1.2 整型变量
C 语言的整型变量分为:基本型,短整型,长整型和无符号型四种,其定义的关键字为: 1.基本型: 用int表示. 2.短整型: 以short int或short表示. 3.长整型: 用long int或long表示. 4.无符号型: 无符号整型变量在存储单元中的全部二进制位(bit)都用作存放数据本身, 而没有符号位. 用unsigned来修饰前三种类型. 整型变量数值的表示范围 见书P23 表2.1
2.1 整形数据
2.1.1 整型常量
整型常量就是整常数 ,有以下三种表示形式 : 1. 十进制的整型常量.如123,-789,0等. 2. 八进制的整型常量.以0开头的常量是八进制整型常量.如0123表示八进制数123, 即(123)8,它等价于十进制数的83. 3. 十六进制的整型常量.以0x开头的数是十六进制整型常量.如0x123,表示十六 进制数123.
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
static(静态)变量
static变量存放在内存的静态存储区,在整个程序运行
期间占用固定的内存单元。 系统在编译时为static变量分配空间并赋初值,对未赋
值的内部static数值型变量,系统自动给它赋值为0; 对未赋值的内部static字符型变量,自动赋值为空字符。 因为在编译期时赋初值,所以只能赋一次初值且只能在 定义时进行。 再次调用static内部变量时,static内部变量的值为上 次调用结束时的值。 注意:static内部变量的作用域仍然是定义该变量的函 数体(或复合语句)内部。 对函数形参不能使用static。 不在必要时不要使用局部static变量.
格式: #undef 宏名{ …#d…efi.n. e LENGTH (WIYDETSH原+4作0用) 域
宏展开:预编译时,用}宏va体r=替LE换NG宏TH名*2-;--不作语法检查
例 引用其它文件中的外部变量
int global; extern float x; main() { int local;
. . . }
file1.c
extern int global; static int number; func2() {.
. . }
file2.c
float x; static int number; func3() { extern int global;
}分配内存: 分配内存,可初始化} 不分配内存,不可初始化
int a=13,b=-8;
int a=13,b=-8;
全局变量---外部变量 int p=1,q=5;
有效范围:从定义或有exetxetrenrnc声ha明r c的1,位c2置; 开始,直至它所 在源程序文件的结束。float f1(int a) { int b,c;
内部函数
内部函数的定义格式如下: static 数据类型 函数名(形式参数表列) { 声明部分; 执行部分;
} 说明:static类型函数只能被其所在文件中的函数调用,
不能被其他文件中的函数调用
8.4 编译预处理
作用:对源程序编译之前做一些处理,生成扩展C 源程序
种类
宏定义 文件包含 条件编译
定义如 位#置de:f一ine般在YE程S 序1开#vad头re=fiLnEeNGLETHN*G2T; H WIDTH+40
作#u用nd域ef###可:ddd从eee终fff定iiinnn止eee义宏命NPO名IOU令作T例到例 宏3用0.展m文#1p#域d4ra开di件e1ninef5t:i(ffn9结i()n“ev2Hea6束er=lYWloE8,IW0DS+To4Hr0ld*”1)28;;0
#define #include #if--#else--#endif等
格式:
“#”开头 占单独书写行 语句尾不加分号
§8.4.1 宏定义
不带参数宏定义
一般形式: #define 宏名 [宏体]
功能:用指定标识符(宏名)代替字符序列(宏体)
宏一般名用中大不写允字许母有。空格,而例且#必de须fin遵e循WC变ID量TH命名80规则。宏名
…….
}
若外部变量与局部变量同名,则外部变量被屏蔽
外部in变t 量a=的1, 使b=用2; 增加了函数/之*外间部传变递量数a据,的b*途/ 径。若一 个用函外in数部t f需变1(要量int返传a回 递) 两数个据或。两个以上的计算结果时,可以使 { int b=10; printf (“%d %d\n”,a,b); return (a* b); /*a,b是f1的内部变量*/ } main( ) { printf(“%d %d\n”,a,b); /*a,b是外部变量*/ printf(“%d\n”,f1(a+b)); /*a,b是外部变量*/ }
变量定义格式: [存储类型]
数据类型
变量表;
如: int sum; auto int a,b,c; register int i; static float x,y;
局部变量与全局变量 …#…define N 5
局部变量---内部变量 mamina… f(lion)…a(t) f1(int a) 定义:在函数(或复合语句内{)定{in义{itn,aitn,it其b;b;,作c;用域是本函a数,b,(c或有复效合语句)
{ int z; 的外部变量)
int max()
z=x>y外?x部:y变; 量定义与外部变量声明{不in同t z;
return(z);
z=a>b?a:b;
}
return(z);
main()
定义
} 说明
{次e数xt:ern int a,只b; 能1次
mai可n()说明多次
位p置rin:tf("max=所%有d"函,m数ax之(a外,b)); { p函rin数tf(内"m或ax函=%数d外",max());
auto(自动)变量
C系统默认内部变量的存储类型是auto类型。也可以显式使 用关键字auto来定义局部变量。
自动变量在其定义的函数(或复合语句)开始执行时才分 配内存空间,在该函数(或复合语句)执行期间占用内存 空间,在函数(或复合语句)执行结束时自动变量占用的 空间被系统释放。
若不对自动变量显式地赋初值,则它是一个不确定的值。
. . . }
file3.c
§8.3 内部函数和外部函数
外部函数
外部函数定义格式如下: extern 数据类型 函数名(形式参数表列) { 声明部分; 执行部分;
} 函数声明的格式为:
extern 数据类型 函数名(形式参数表列); 说明: • 外部函数既可被同一文件中函数调用,也可被其他 文件中的函数所调用 • 外部函数的定义和声明都可以省略关键字extern
存储方式
动态
存储区 动态区 寄存器
生存期 函数调用开始至结束
静态 静态存储区 程序整个运行期间
作用域 定义变量的函数或复合语句内 本文件 其它文件
赋初值 每次函数调用时
未赋初值
不确定
编译时赋初值,只赋一次 自动赋初值0或空字符
例 局部静态变量值具有可继承性
main() { void increment(void);
printf("i:%d a:%d \
printf("-----OTHER------\n");
b:%d c:%d\n",i,a,b,c); printf("i:%d a:%d \
i=i+10;
b:%d c:%d\n",i,a,b,c);
other();
b=a;
}
}
例:以下程序的运行结果是:
#define MAX 6 int a[MAX], i; sub2()
extern char c1,c2; …….
扩扩 展展 后后 c1,c2 c1,c2
的的 作作 用用 范范 围围
} int f3() {….. } char c1,c2; char f2(int x,int y) { int i,j;
…… } main()
p,q的作用范围 c1,c2的作用范围
{ int m,n;
{ int a[MAX],i, max=5; for(i=0;i<max;i++) a[i]=i;
} sub1() { for(i=0;i< MAX ;i++) a[i]=i+i; } sub3(int a[ ]) { int i;
for(i=0; i<MAX; i++) printf(“%d”, a[i]) ; printf(“\n”); } main() { sub1(); sub3(a); sub2(); sub3(a); }
640
静态 存储区
main()
-------Main-----
{ static int a;
i:33 a:0 b:-10 c:8
register int b=-10;
-------Other-------
int c=0;
i:75 a:6 b:4 c:15 other: c
150
printf("-----MAIN------\n");
main:c 80
动态 a:%d \ b:%d c:%d\n",i,a,b,c);
other()
register b:-10
{ static int a=2;
c=c+8;
static int b;
other();
int c=10;
printf("-----MAIN------\n"); a=a+2; i=i+32; c=c+5;
动态变量与静态变量
存储方式
静态存储:程序运行期间分配固定存储空间 动态存储:程序运行期间根据需要动态分配存储空间
内存用户区
生存期
静态变量:从程序开始执行到程序结束 动态变量:从包含该变量定义的函数开始执行至函数执行结束
变量存储类型
局部变量
外部变量
存储类别 auto register 局部static 外部static 外部
动态存储区
作用域:变量在某范围内有效-------局部变量与全局变量 函数作用域、函数原型作用域、文件作用域
生存期:变量在某一时刻存在-------静态变量与动态变量
变量的存储类型
auto -----自动型 register-----寄存器型 static ------静态型 extern -----外部型