c语言中用户标识符

上传人:好** 文档编号:107555276 上传时间:2019-10-20 格式:PPT 页数:97 大小:392KB
返回 下载 相关 举报
c语言中用户标识符_第1页
第1页 / 共97页
c语言中用户标识符_第2页
第2页 / 共97页
c语言中用户标识符_第3页
第3页 / 共97页
c语言中用户标识符_第4页
第4页 / 共97页
c语言中用户标识符_第5页
第5页 / 共97页
点击查看更多>>
资源描述

《c语言中用户标识符》由会员分享,可在线阅读,更多相关《c语言中用户标识符(97页珍藏版)》请在金锄头文库上搜索。

1、1,第十二章C语言中用户标识符的作用域和存储类,知识点1:局部变量与全局变量 1.局部变量又称内部变量。全局变量又称外部变量。 2.在函数内部或复合语句内部定义的变量称局部变量,形参也是局部变量,其作用域从定义的位置开始到本函数或本复合语句结束。 3.在函数外部定义的变量称全局变量,其作用域从定义的位置开始到本源文件结束。 4.在同一个源文件中不同函数中的局部变量可以同名,不同复合语句中的局部变量可以同名。,2,5.在同一个源文件中,全局变量可以和局部变量同名,局部变量将屏蔽同名全局变量。 6.在函数体外进行的函数原型说明也使该函数具有全局的性质,其有效范围是从说明处起到源文件结束。 例如:

2、int a; int f(int x,int y) int j; j=a; main() int x,y; x=a; ,3,知识点2:变量的存储类别 1.C语言中,有两种存储类别:一种是自动类,一种是静态类。 2.局部变量既可以说明成自动类,也可以说明成静态类。全局变量只能是静态类。 3.存储类别有关的说明符:auto(自动)、register(寄存器)、static(静态)和extern(外部)。 4.存储类别说明符的说明形式:通常与类型名一起出现,可以放在类型名左边或右边。 例如:auto int i,j; 也可写成 int auto i,j;,4,知识点3:局部变量及其作用域和生存期 1

3、.auto变量 当在函数内部或复合语句内定义变量时,如果没有指定存储类或使用了auto说明符,系统就认为所定义的变量具有自动类别。因此, float a;等价于 auto float a; auto变量的存储单元被分配在内存的动态存储区。每当进入函数体(或复合语句)时,系统自动为auto变量分配存储单元。退出时自动释放这些存储单元。因此,这类局部变量的作用域是从定义的位置起,到函数体(或复合语句)结束为止。,5,例如: sub(float a) int i; if(i0) int n; printf(“%dn”,n); 这里,变量i,a,n都是auto变量。但i和a的作用域是整个sub函数;而

4、n的作用域仅限于if子名内。,6,生存期:所有自动类局部变量的存储单元都是在进入这些局部变量所在的函数体(或复合语句)时生成,退出其所在的函数体(或复合语句)时消失。 2.register变量 寄存器变量也是自动类变量。它与auto变量的区别仅在于:用register变量是将变量的值保留在CPU的寄存器中,而不是象一般变量那样,占内存单元。特点:程序运行速度快,因为访问寄存器比访问内存快。 注意:(1)CPU中寄存器的数目有限,只能说明少量寄存器变量。 (2)register变量的值存放在寄存器中,因此不能对register变量进行求地址运算。,7,例:以下函数power用以计算xn main

5、() int s; s=power(5,3); printf(“%dn”,s); power(int x, register int n) register int p; for(p=1; n;n-) p=p*x; return p;,8,3.静态存储类的 当在函数体(或复合语句)内部,用static来说明一个变量时,可以称该变量为静态局部变量。静态局部变量作用域与auto,register类的变量一样。 区别(1)在整个程序运行期间,静态局部变量在内存的静态存储区中占所着永久性的存储单元。即使退出函数以后,下次再进入该函数时,静态局部变量仍使用原来的存储单元。由于并不释放这些存储单元,因此这

6、些存储单元中的值得以保留,由此可知,静态局部变量的生存期将一直延长到程序运行结束。,9,(2)静态局部变量的初值是在编译时赋予的,在程序执行期间不再赋予初值。对未赋初值的静态局部变量,C编译程序自动给它赋初值0. 例:以下程序输出结果 int x=3; main() int i; for(i=1;ix;i+) incre(); int incre() static int x=1; x*=x+1; printf(“ %d”,x); A.3 3 B.2 2 C.2 6 D.2 5,10,知识点4:全局变量及其作用域和生存期 全局变量只有静态一种类别。对于全局变量可使用extern和static两

7、种说明符。 1.全局变量的作用域和生存期 全局变量是在函数外部任意位置上定义的变量,它的作用域是从变量定义的位置开始,到整个源文件结束止。例如: int sum; main( ) sum+; int fun1() sum+; int test; int fun2() sum+;test=1;,11,全局变量的生存期是整个程序的运行期间。若全局变量和某一函数中的局部变量同名,则在该函数中,此全局变量被屏蔽,在该函数内访问的是局部变量。 例:有以下程序 int a=3; main() int s=0; int a=5;s+=a+; s+=a+; printf(“%dn”,s); 程序运结果 A.

8、8 B.10 C. 7 D.11,12,2.在同一编译单位内用extern说明符来扩展全局变量的作用域。 当全局变量定义在后,引用它的函数在前时,应该在引用它的函数中用extern对此全局变量进行说明,以便通知编译程序:该变量是一个已在外部定义了的全局变量,这时其作用域从extern说明处起,延伸到该函数末尾。 fun1() extern int x; fun2() int a; a=x; int x,y; main() x=2; ,13,3.静态全局变量 当用static说明符说明全局变量时,此变量可称作“静态”全局变量。静态全局变量只限于本编译单位使用,不能被其它编译单位所引用。 例: /

9、*file1.c*/ /*file2.c*/ static int n; extern int n; void func(); void func() main() printf(“%file2:%dn”,); n=5; printf(“file1:%dn”,n); func(); ,14,知识点5:函数的类别 所有函数都是外部的,因为不允许在函数内部定义另一个函数。但当定义函数时,可以使用extern或static说明符。 1.一般的函数都隐含说明符extern.此说明的特征是:可以被其他编译单位中的函数调用。 2.若在函数返回值的类型前加上说明符static,则称此函数为“静态”函数。此类

10、函数的特征是:只限于本编译单位的其他函数调用它,而不允许其他编译单位中的调用它。,15,12-1以下程序的输出结果 main() int i=2,j=3; printf(“%d,”,i+); int i=0; i+=j*2; printf(“%d,%d,”,i,j); printf(“%d,%dn”,i,j); A.1,6,3,1,3 B.1,6,3,2,3 C.1,6,3,6,3 D.1,7,3,2,3,16,12-2以下程序的输出结果是 int m=13; int fun2(int x,int y) int m=3; return(x*y-m); main() int a=7,b=5; p

11、rintf(“%dn”,fun2(a,b)/m); A. 1 B.2 C.7 D.10,17,第十三章编译预处理和动态存储分配,在C语言中,凡是以”#“号开头的行,都称为“编译预处理”命令行。在此之前我们常用的由#include,#define开始的程序行就是编译预处理命令行。C语言预处理命令有:#undef,#if,#else等等。这些预处理命令组成的预处理命令行必须在一行的开头以“#”号开始,每行的末尾不得加“;”。,18,知识点1:不带参数的宏定义 1.不带参数的宏定义命令行形式如下: #define 宏名 替换文本 或#define 宏名 例:#define PI 3.14156 对于

12、以上例举的宏名PI,在编译时将把一串文本3.15156去替换源程序中的PI。 (1)同一宏名不可重复定义。 (2)替换文本不能替换双引号中与宏名相同的字符串。例如,如果YES是已定义的宏名,则不能用与它相关的替换文本来替换printf(“YES”)中的YES.,19,(3)替换文本并不替换用户标识符中的成分。例如,宏名YES,不会替换标识符YESORNO中的YES。 (4)用作宏名的标识符通常用大写字母表示,这并不是语法规定,只是一种习惯。 (5)在C程序中,宏定义的定义位置一般写在程序的开头。,20,知识点2:带参数的宏定义 1.带参数的宏定义命令行形式如下: #define 宏名(形参表)

13、 替换文本 例: #define MU(X,Y) (X)*(Y) a=MU(5,2); b=6/MU(a+3,a); 等价于 a=(5)*(2); b=6/(a+3)*(a);,21,(1)宏名和左括号之间不得有空格,形参之间用逗号隔开,替换文本中通常应包含有形参。 (2)调用带参的宏时,括号中实参的个数应与形参的相同。编译时,编译预处理程序用“替换文本”来替换宏名,用对应实参不加任何改动地替换“替换文本”中的形参。 (3)宏调用和函数调用有相似之处,但宏调用由编译预处理程序完成的,没有计算过程。 (4)宏调用中,实参不能替换括在双引号中的形参。,22,知识点3:文件包含 1.文件包含命令可有

14、以下两种形式 #include “文件名” #include 2.文件包含命令行的作用 预编译时,预编译程序将用指定文件中的内容来替换此命令行。如果文件名用双引号括起来,系统先在源程序所在的目录内查找指定的包含文件,如果找不到,再按照系统指定的标准方式到有关目录中去寻找。如果文件名用尖括号括起来,系统将直接按照系统指定的标准方式到有关目录中去寻找。,23,3.#include命令行应书写在所用文件的开头,因此也把包含文件称作“头文件”。头文件名可以由用户指定,其后缀不一定用“.h”。 4.包含文件中,一般包含有一些公用的#define命令行、外部说明或对(库)函数的原型说明。例如:“stdio

15、.h”就是这样的文件。 5.当包含文件修改后,对包含文件的源程序必须重新进行编译连接。 6.在一个程序中,允许有任意多个#include命令行。 7.在包含文件中还可以包含其他文件。,24,知识点4:动态存储分配 静态存储分配:我们用存储数据的变量和数组都必须在说明部分进行定义。C编译程序通过定义语句了解它们所需存储空间大小,并预先为其分配适当的内存空间。这些空间一经分配,在变量或数组的生存期内是固定不变的。 动态存储分配:在程序执行期间需要空间来存储数据时,通过“申请”分配指定的内存空间。 C为动态分配系统定义了四个函数,它们是malloc,calloc,free和realloc。使用这些函

16、数时,必须在程序开头包含头文件stdio.h。本书只介绍malloc,calloc和free函数的使用。,25,1.malloc函数 其函数原型为void * malloc(unsigned int); malloc函数返回值的类型为void *,函数调用形式为:malloc(size)。要求size的类型为unsigned int。 其作用是在内存的动态存储区中分配一个长度为size的连续空间。如果此函数未能成功地执行,则返回空指针(NULL)。 我们知道int型占2字节,float型占4字节,则以下程序段将使pi指向一个int类型的存储单元,使pf指向一个float类型的存储单元。,26,int *pi; float *pf; pi=(int *)mallo

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 往来文书

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号