int i。 a[0] a[1] a[2] a[3] fun(&a[1])。第2个的开始连续3个地址 for (i=0。i<=3。i++) 3.5 6.1 0.2 7.9 printf(\。 x[0] x[1] x[2] }
void fun(float x[4]) 共用内存单元 { x[0]=x[0]+1。x[1]=x[1]+1。x[2]=x[2]+1。 } 结果:3.5 7.1 1.2 8.9
数组a和数组x
数组a独享存贮区共享存贮区 数组a独享存贮区 a[0] 3.5 a[1] 7.1 a[0] 3.5 a[1] 6.1 a[2] 1.2 a[1] 7.1
a[2] 0.2 a[3] 8.9 a[2] 1.2 a[3] 7.9 a[3] 8.9
注意:不要使用x[3] , 即:x[2]是子程序最后一个可用元素。
(3)例子
书P164 例8.10例8.11 例8.12书P166例8.13
(4)二维数组作函数参数
二维数组的传值调用与一维数组相似。 例: main ( )
{ int a[3][5]。
调用函数 …
mul( n , a[1][2] , a[0][4] ) 。 … 函数定义 }
int mul(int x , int y , int z ) { int s 。 …
例 (j5_8.c) main ()
{ int tran(int n,int x[])。 int total,a[4][4]={{3,8,9,10},{2,5,-3,5},{7,0,-1,4},{2,4,6,0}}。
tran(2,a)。第一行的第0列 地址 9个
tran(2,&a[0])。 第一行的第0列 地址 9个
tran(0,&a[2])。第二行的第0列 地址 4个 }
计算数组元素在数组中的序号 tran(int n,int arr[])
{ int i。
for (i=0。i<4。i++)
printf(\。 printf(\。 }
程序输出: 7,0,-1,4, 7,0,-1,4, 7,0,-1,4,
七、局部变量和全局变量 1.变量存储作用域
(1)作用域:决定一个变量的有效范围。 a)作用域是整个程序的变量——为全局变量 b)作用域只限于程序的一部分的变量——为局部变量 局部变量:——在一个函数内部定义的变量(内部变量),它只在本函数
范围内有效。
全局变量:——在函数之外定义的变量称为外部变量,外部变量是全局变量
(2)有效范围为: 从定义变量的位置开始到本源文件结束。 书P169
外部变量在文件开头定义,则在整个文件范围内都可以使
用该外部变量。书P170
(3)作用: 增加函数间数据联系的渠道。 同一个文件中的所有函数都能引用全局变量的值 书P170 例8.15
八、变量的存储类型
————用来规定变量的作用域以及它们存在的长短
2.变量的存储类别
? 变量存在的长短:决定一个变量存在的范围(整个程序,部分函数)
? 从变量存在的时间(即生存期)角度来分,有静态存储变量和动态存
储变量
静态存储方式:
指在程序运行期间分配固定的存储空间的方式
动态存储方式:
指在程序运行期间根据需要进行动态的分配存储空间的方式 供用户使用的存储空间:
程 序 区 三个部分 静态存储区 动态存储区
静态存储区:主要放全局变量
即:在程序开始执行时给全局变量分配存储区,程序执行完毕
就释放。
动态存储区:主要放
①函数形参变量。在调用函数时给形参变量分配存储空间。 ②局部变量(未加static说明的局部变量) ③函数调用时的现场保护和返回地址
在函数套眼调用开始时分配动态存储空间,函数结束时释放这些空间。 (分配和释放是动态的)
C语言中,变量和函数有两个属性: 数据类型 (如整型、字符型等) 存储类型 (数据在内存中存储的方法) C语言提供:(四种存贮类型符)
① auto(自动) ② register(寄存器) ③ staic(静态) ④ extern (外部)
C语言规定:存贮类型符放在变量定义的最前面
即:staic int a , b 。 (1)自动变量 ( auto )
定义在函数内部的变量,变量的建立与撤消是系统自动进行的。 在调用此函数时才给此变量分配存储单元,当函数执行完毕时,存储单元就被撤消。
定义方式有:在函数体开始处定义 、在复合语句中定义 注: 1)自动变量的存储类型符(auto)一般可省去。
2)自动变量是一个局部变量,其值在一个函数的两次调用之间不能保持。
例(j4_11.c)
(2)静态变量(static)
在整个函数调用期间都可以保存其值的变量(在函数调用结束后,其值不消失而保留原值,即占用的存储单元不释放)
? 静态变量未初始化时,其值是零 ? 自动变量未初始化时,其值是随机的
书P173 例8.17
注:静态变量的生存期是永久的,但它们的作用域却不都是全局的。
既:凡有static说明的,其作用域都是局限的; a)局限于本函数内(静态局部变量)
b)局限于本文件内(静态外部变量)书P175 例8.18
示例: (j4_15.c)
? 如果把静态变量放在函数外面定义 称为静态外部变量,作用域为全
局
? 静态外部变量的全局性仅限于本程序,它的值不能在文件之间互传 *(3)寄存器变量 ( register )
存放于CPU的一个寄存器中的变量(在CPU中进行)
? 可以把使用频率高的变量 定义为register,提高程序执行的速度。 ? 寄存器变量只能用于整型和字符型。 ? 变量的个数受CPU寄存器数目的限制。
示例:书P175 例8.19(j4_12.c) 目前P系列 CPU自动分配 *(4)外部变量(extern )
外部变量主要用在:要在n个文件之间互访一批变量 ? 外部变量的值是“永久”保留的;既从一个函数调用到另一个
函数调用,它原来的值始终存在。 ? 外部变量的作用域是整个程序(工程)。 1)作用域在n个文件之间的外部变量
一个程序中包含若干个文件,各个文件都要用到一些共用的变量时,就可以在一个文件中定义一批变量,而相关文件只要用extern说明它们是外部变量,那么,这些变量就可以供n个文件“全局”使用;同时,运算结果也可“共享”
(外部变量开辟一条文件之间传递数据的通道)P176 例8.20 2)作用域在一个程序中的外部变量
定义变量的语句应放在变量作用域的开始处,而在引用这些变量的函数中,可以不再使用变量说明。 示例: (j4_18.c) 总结:P180 作用域分析:
局部变量:自动变量(函数内):离开函数,值消失
定义 auto int a 函数内定义
静态局部变量(函数内):离开函数,值保留
定义 static int a函数内定义
寄存奇变量(函数内):离开函数,值消失
定义 register int a函数内定义
全局变量:静态外部变量(函数内,本文件)首字母大写
使用static声明(可多次声明)
定义 ertern int A 函数外定义,用static声明(内外均可)
非静态外部变量(工程内所有文件)首字母大写 非动态,编译时分配内存
定义 ertern int A 函数外定义 变量存储时间
动态存储:自动变量(本函数内存在) 寄存奇变量(本函数内存在) 形式参数(本函数内存在)
静态存储:静态局部变量(函数外存在) 静态外部变量(函数外本文件内存在)
非静态外部变量(函数外,工程内所有文件存在) 变量存放位置
内存中静态存储区:静态局部变量(本函数) 静态外部变量(函数外部静态变量) 非静态外部变量(其它文件可使用) 内存中动态存储区:动态变量和形式参数 CPU中的寄存奇:寄存奇变量 * 3.内部函数和外部函数
内部函数:一个函数只能被本文件中其它函数所调用。(称静态函数)
在定义时:在函数名和函数类型前面加static 即:static 类型标识符 函数名(形参表)
外部函数:以extern说明的函数,表示此函数是外部函数。 书P182 例8.22
4. 工程文件(工程文件prj):多*.C源文件
九.编译预处理 书P187
编译预处理:——编译前对源程序进行的一些预加工。 C语言的预处理功能主要有三种:
a)宏定义 b)文件包含 c)条件编译 以“#”符号开头的行——为预处理的标志 1.宏定义(宏替换)用预处理命令#define指定的预处理 1)不带参数的宏定义
用一个指定的标识符(即名字)来代表一个字符串 格式:#define 标识符 字符串 例: #define PI 3.14159