您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > C语言 第7章 函数2
11第7章函数2本章要点函数的概念函数的定义与调用变量的作用域函数的嵌套调用函数的递归调用本节内容3变量的作用域及存储类型局部变量和全局变量动态存储变量和静态存储变量局部变量的存储方式全局变量的存储方式4变量的存储方式和生存期从变量的作用域(即从空间)角度来分,可以分为全局变量和局部变量。从变量值的生存期(即存在的时间)角度来分,又可以分为静态存储方式和动态存储方式。5从变量的作用域来认识变量——局部变量和全局变量可引用变量的范围61、变量的作用域--局部变量和全局变量在一个函数内部定义的变量是内部变量,它只在本函数范围内有效,也就是说只有在本函数内才能使用它们,在此函数以外是不能使用这些变量的。这称为“局部变量”。71、变量的作用域--局部变量和全局变量在函数内定义的变量是局部变量,而在函数之外定义的变量称为外部变量,外部变量是全局变量(也称全程变量)。全局变量可以为本文件中其他函数所共用。它的有效范围为从定义变量的位置开始到本源文件结束。引例:局部变量的作用域举例—交换两个变量的值引例:全局变量的作用域举例—分析下面程序运行结果10局部变量1.局部变量定义:定义在函数内或在{}内的变量,称为局部变量。2.有效范围:在所定义的函数、复合语句中。变量的作用范围仅仅局限在从变量定义处开始、到变量定义所在的那个函数或复合语句结束。函数的形式参数为局部变量。11局部变量举例•floatf1(inta)•{•intb,c;•…•}•intf2(intx,inty)•{•intb,c,i,j;•…}1.形参是局部变量2.main函数的变量也是局部的;3.不同函数中变量的名字可以相同;4.复合语句内可以定义变量;a,b,c有效x,y,b,c,i,j有效12局部变量举例•intmain()•{•intm,n;•{•intk•…}•...}1.形参是局部变量2.main函数的变量也是局部的;3.不同函数中变量的名字可以相同;4.复合语句内可以定义变量;m,n有效k有效13例:func(inta,charch){intb=1,c=2;floatf;...a=5a=3{inta,b=3;a=b+c;printf(a=%d\n,a);}a=b+c;printf(a=%d\n,a);}Why?14全局变量全局变量定义:在函数之外定义的变量,称为全局变量。全局变量又称为外部变量。全局变量的作用范围:从变量定义处开始到该源文件结束处。输入2,5?结论:全局变量在任何程序内可见函数exch()改一下,结果如何?输入2,5?a=3,b=7?如果函数中的局部变量和全局变量同名,在函数范围内,局部变量可见。17变量的作用域及存储类型局部变量和全局变量动态存储变量和静态存储变量局部变量的存储方式全局变量的存储方式18从变量的存储角度认识变量——动态存储变量和静态存储变量19•静态存储方式是指在程序运行期间由系统分配固定的存储空间的方式。•动态存储方式则是在程序运行期间根据需要进行动态的分配存储空间的方式。变量的存储方式和生存期20•这个存储空间可以分为三部分:1.程序区2.静态存储区3.动态存储区•在C语言中每一个变量和函数有两个属性:-----数据类型和数据的存储类别。变量的存储方式和生存期程序在内存中的分布区域存放用户程序代码,即程序中各个函数的代码。程序区静态存储区动态存储区存放程序的全局数据和静态数据。分配在静态存储区中的变量的生命期最长,从程序开始执行到执行结束,这些变量始终占用静态存储区中对应的存储空间,即程序开始执行时分配存储单元,程序执行完毕后释放。存放动态数据。分配在动态存储区中的变量只有在所定义的函数被调用时才分配存储单元,函数结束时就释放。系统对函数调用时的现场保护、返回地址等也占用动态保护区。22静态存储区程序区动态存储区存放程序的全局数据和静态数据存放动态数据程序开始执行时分配存储单元,程序执行完毕后释放所定义的函数被调用时才分配存储单元,函数结束时就释放存放用户程序代码内存23变量的存储器类别变量的存储器类别寄存器静态存储区内存动态存储区CPU24变量的存储方式静态存储方式动态存储方式变量的存储四种存储类型:auto自动变量register寄存器变量static静态变量extern外部变量(全局变量)自动变量和寄存器变量属于动态存储方式静态变量和外部变量属于静态存储方式25变量的作用域及存储类型局部变量和全局变量动态存储变量和静态存储变量局部变量的存储方式全局变量的存储方式26局部变量的存储类别定义局部变量的存储类别时使用三个关键字:说明:局部变量的存储类别缺省是autoauto自动变量static局部静态变量register寄存器变量27局部变量存储类别的定义形式:CPU寄存器内存静态存储区动态存储区registerinta;autofloata;或floata;staticinta;28•{autofloata;}或{floata;}•定义一个动态的局部变量;•意味着:•当a所在函数被调用时,系统为a分配空间,a才真正存在;•在没有为a赋任何值之前,a中的值为随机值;如果存在赋初值语句,在函数每次被调用时,都将被执行一次。•a随它所在函数的执行结束而消失。29•{staticinta;}•定义一个静态的局部变量•意味着:•编译时为a分配空间;在程序运行阶段,a一直存在。不会随着函数的执行结束而消失。•如果不为a赋初值,系统会自动为它赋0。如果在函数中为它赋初值,则该赋值语句仅在编译时被执行一次。•每次函数中对它的改变都将被保留。31变量的作用域及存储类型局部变量和全局变量动态存储变量和静态存储变量局部变量的存储方式全局变量的存储方式32定义全局变量中关键字的使用1.用static定义静态全局变量若在源文件的开头有:staticinta意味着该变量就只能在本文件中使用。若static缺省,则使用范围扩大到组成程序的所有C源文件。2.用extern说明全局变量若在源文件的开头有:externinta意味着该变量在其它文件中定义,在本文件中被使用。34全局变量给程序设计带来诸多弊病:(1)降低程序的清晰度(2)降低函数的灵活性(3)降低存储空间的利用率适当使用!35系统处理程序时:(2)动态局部变量分配在局部动态数据区(3)voidmain函数是所有c程序的执行入口程序。(4)voidmain函数中的变量也是局部变量。静态数据区动态数据区abdacb(1)全局变量和静态局部变量分配在静态数据区;36存储类别小结(1)从作用域角度分,有局部变量和全局变量。它们采用的存储类别如下:•局部变量包括:自动变量、静态局部变量、寄存器变量。形式参数可以定义为自动变量或寄存器变量•全局变量包括:静态外部变量、外部变量37(2)从变量存在的时间来区分,有动态存储和静态存储两种类型。静态存储是程序整个运行时间都存在,而动态存储则是在调用函数时临时分配单元。•动态存储:自动变量、寄存器变量、形式参数•静态存储:静态局部变量、静态外部变量、外部变量38(3)从变量值存放的位置来区分,可分为:•内存中静态存储区:静态局部变量、静态外部变量、外部变量•内存中动态存储区:自动变量和形式参数•CPU中的寄存器:寄存器变量39•(4)static对局部变量和全局变量的作用不同。•对局部变量来说,它使变量由动态存储方式改变为静态存储方式。•而对全局变量来说,它使变量局部化,但仍为静态存储方式。•从作用域角度看,凡有static声明的,其作用域都是局限的,或者是局限于本函数内,或者局限于本文件内。
本文标题:C语言 第7章 函数2
链接地址:https://www.777doc.com/doc-3369200 .html