【Asp.net精品源码栏目提醒】:网学会员为广大网友收集整理了,(精品)C语言初学者入门讲座 第十讲 函数(4)(整理) - 培训教程,希望对大家有所帮助!
C语言初学者入门讲座 第十讲 函数4 — 编程爱好者 programfan.comProgramFan.com回到首页 设为首页 加入收藏 网站留言 - 人才招聘频道 编程爱好者BLOG 编程爱好者论坛 首页 论坛 博客 人才招聘 书评 文章 资讯 下载
源码 项目交易 兴趣小组 网友作品 资源共享 收藏夹 ACM题库 VBAPI查询 刻盘服务 您所在的位置编程爱好者网站 文档中心 C/C文章 正文我要投稿 文章搜索 C/C文章 全部分类 C语言初学者入门讲座 第十讲 函数4 加入日期:2005-1-26 【收藏文章】【对此文发表评论】【保存文章至硬盘】【打印文章】【字体大 中 小】 分享到 - 变量的作用域 在讨论函数的形参变量时曾经提到 形参变量只在被调用期间才分配内存单元调用结束立即释放。
这一点表明形参变量只有在函数内才是有效的 离开该函数就不能再使用了。
这种变量有效性的范围称变量的作用域。
不仅对于形参变量 C语言中所有的量都有自己的作用域。
变量说明的方式不同其作用域也不同。
C语言中的变量按作用域范围可分为两种 即局部变量和全局变量。
一、局部变量 局部变量也称为内部变量。
局部变量是在函数内作定义说明的。
其作用域仅限于函数内 离开该函数后再使用这种变量是非法的。
例如 int f1int a /函数f1/ int bc ???? abc作用域 int f2int x /函数f2/ int yz xyz作用域 main int mn mn作用域 在函数f1内定义了三个变量a为形参bc为一般变量。
在 f1的范围内abc有效或者说abc变量的作用域限于f1内。
同理xyz的作用域限于f2内。
mn的作用域限于main函数内。
关于局部变量的作用域还要说明以下几点 1. 主函数中定义的变量也只能在主函数中使用不能在其它函数中使用。
同时主函数中也不能使用其它函数中定义的变量。
因为主函数也是一个函数它与其它函数是平行关系。
这一点是与其它语言不同的应予以注意。
2. 形参变量是属于被调函数的局部变量实参变量是属于主调函数的局部变量。
3. 允许在不同的函数中使用相同的变量名它们代表不同的对象分配不同的单元互不干扰也不会发生混淆。
如在例5.3 中形参和实参的变量名都为n是完全允许的。
4. 在复合语句中也可定义变量其作用域只在复合语句范围内。
例如 main int sa ???? int b sab ????b作用域 ????sa作用域 例5.11main int i2j3k kij int k8 ifi3 printf printfdndnik main int i2j3k kij int k8 ifi3 printfdnk printfdndnik 本程序在main中定义了ijk三个变量其中k未赋初值。
而在复合语句内又定义了一个变量k并赋初值为8。
应该注意这两个k不是同一个变量。
在复合语句外由main定义的k起作用而在复合语句内则由在复合语句内定义的k起作用。
因此程序第4行的k为main所定义其值应为5。
第7行输出k值该行在复合语句内由复合语句内定义的k起作用其初值为8故输出值为8第9行输出ik值。
i是在整个程序中有效的第7行对i赋值为3故以输出也为3。
而第9行已在复合语句之外输出的k应为main所定义的k此k值由第4 行已获得为5故输出也为5。
二、全局变量 全局变量也称为外部变量它是在函数外部定义的变量。
它不属于哪一个函数它属于一个源程序文件。
其作用域是整个源程序。
在函数中使用全局变量一般应作全局变量说明。
只有在函数内经过说明的全局变量才能使用。
全局变量的说明符为extern。
但在一个函数之前定义的全局变量在该函数内使用可不再加以说明。
例如 int ab /外部变量/ void f1 /函数f1/ ???? float xy /外部变量/ int fz /函数fz/ ???? main /主函数/ ???? /全局变量xy作用域 全局变量ab作用域/ 从上例可以看出a、b、x、y 都是在函数外部定义的外部变量都是全局变量。
但xy 定义在函数f1之后而在f1内又无对xy的说明所以它们在f1内无效。
ab定义在源程序最前面因此在f1f2及main内不加说明也可使用。
例5.12输入正方体的长宽高lwh。
求体积及三个面xyxzyz的面积。
int s1s2s3 int vs int aint bint c int v vabc s1ab s2bc s3ac return v main int vlwh printfninput lengthwidth and heightn scanfdddlwh vvslwh printfvd s1d s2d s3dnvs1s2s3 本程序中定义了三个外部变量s1s2s3 用来存放三个面积其作用域为整个程序。
函数vs用来求正方体体积和三个面积 函数的返回值为体积v。
由主函数完成长宽高的输入及结果输出。
由于C语言规定函数返回值只有一个 当需要增加函数的返回数据时用外部变量是一种很好的方式。
本例中如不使用外部变量 在主函数中就不可能取得vs1s2s3四个值。
而采用了外部变量 在函数vs中求得的s1s2s3值在main 中仍然有效。
因此外部变量是实现函数之间数据通讯的有效手段。
对于全局变量还有以下几点说明 1. 对于局部变量的定义和说明可以不加extern 类型说明符 变量名变量名?? 其中方括号内的extern可以省去不写。
例如 int ab 等效于 extern int ab 而外部变量说明出现在要使用该外部变量的各个函数内 在整个程序内可能出现多次外部变量说明的一般形式为 extern 类型说明符 变量名变量名?? 外部变量在定义时就已分配了内存单元 外部变量定义可作初始赋值外部变量说明不能再赋初始值 只是表明在函数内要使用某外部变量。
2. 外部变量可加强函数模块之间的数据联系 但是又使函数要依赖这些变量因而使得函数的独立性降低。
从模块化程序设计的观点来看这是不利的 因此在不必要时尽量不要使用全局变量。
3. 在同一源文件中允许全局变量和局部变量同名。
在局部变量的作用域内全局变量不起作用。
例5.13 int vsint lint w extern int h int v vlwh return v main extern int wh int l5 printfvdvslw int l3w4h5 本例程序中外部变量在最后定义 因此在前面函数中对要用的外部变量必须进行说明。
外部变量lw和vs函数的形参lw同名。
外部变量都作了初始赋值mian函数中也对l作了初始化赋值。
执行程序时在printf语句中调用vs函数实参l的值应为main中定义的l值等于5外部变量l在main内不起作用实参w的值为外部变量w的值为4进入vs后这两个值传送给形参lwvs函数中使用的h 为外部变量其值为5因此v的计算结果为100返回主函数后输出。
变量的存储类型各种变量的作用域不同 就其本质来说是因变量的存储类型相同。
所谓存储类型是指变量占用内存空间的方式 也称为存储方式。
变量的存储方式可分为“静态存储”和“动态存储”两种。
静态存储变量通常是在变量定义时就分定存储单元并一直保持不变 直至整个程序结束。
5.5.1节中介绍的全局变量即属于此类存储方式。
动态存储变量是在程序执行过程中使用它时才分配存储单元 使用完毕立即释放。
典型的例子是函数的形式参数在函数定义时并不给形参分配存储单元只是在函数被调用时才予以分配 调用函数完毕立即释放。
如果一个函数被多次调用则反复地分配、 释放形参变量的存储单元。
从以上分析可知 静态存储变量是一直存在的 而动态存储变量则时而存在时而消失。
我们又把这种由于变量存储生存期和作用域是从时间和空间这两个不同的角度来描述变量的特性这两者既有联系又有区别。
一个变量究竟属于哪一种存储方式 并不能仅从其作用域来判断还应有明确的存储类型说明。
在C语言中对变量的存储类型说明有以下四种 auto 自动变量 register 寄存器变量 extern 外部变量 static 静态变量 自动变量和寄存器变量属于动态存储方式 外部变量和静态变量属于静态存储方式。
在介绍了变量的存储类型之后 可以知道对一个变量的说明不仅应说明其数据类型还应说明其存储类型。
因此变量说明的完整形式应为 存储类型说明符 数据类型说明符 变量名变量名?? 例如 static int ab 说明ab为静态类型变量 auto char c1c2 说明c1c2为自动字符变量 static int a512345 说明a为静整型数组 extern int xy 说明xy为外部整型变量 下面分别介绍以上四种存储类型 一、自动变量的类型说明符为auto 这种存储类型是C语言程序中使用最广泛的一种类型。
C语言规定 函数内凡未加存储类型说明的变量均视为自动变量 也就是说自动变量可省去说明符auto。
在前面各章的程序中所定义的变量凡未加存储类型说明符的都是自动变量。
例如 int ijk char c ???? 等价于 auto int ijk auto char c ???? 自动变量具有以下特点 1. 自动变量的作用域仅限于定义该变量的个体内。
在函数中定义的自动变量只在该函数内有效。
在复合语句中定义的自动变量只在该复合语句中有效。
例如 int kvint a auto int xy auto char c /c的作用域/ ???? /axy的作用域/ 2. 自动变量属于动态存储方式只有在使用它即定义该变量的函数被调用时才给它分配存储单元开始它的生存期。
函数调用结束释放存储单元结束生存期。
因此函数调用结束之后自动变量的值不能保留。
在复合语句中定义的自动变量在退出复合语句后也不能再使用否则将引起错误。
例如以下程序 main auto int asp printfninput a number:n scanfda ifa0 saa paa printfsd pdnsp auto int a printfninput a number:n scanfda ifa0 auto int sp saa paa printfsd pdnsp sp是在复合语句内定义的自动变量只能在该复合语句内有效。
而 3. 由于自动变量的作用域和生存期都局限于定义它的个体内 函数或复合语句内 因此不同的个体中允许使用同名的变量而不会混淆。
即使在函数内定义的自动变量也可与该函数内部的复合语句中定义的自动变量同名。
例5.14表明了这种情况。
例5.14 main auto int as100p100 printfninput a number:n scanfda ifa0 auto int sp saa paa printfsd pdnsp printfsd pdnsp 本程序在main函数中和复合语句内两次定义了变量sp为自动变量。
按照C语言的规定在复合语句内应由复合语句中定义的sp起作用故s的值应为a ap的值为aa。
退出复合语句后的sp 应为main所定义的sp其值在初始化时给定均为100。
从输出结果可以分析出两个s和两个p虽变量名相同 但却是两个不同的变量。
4. 对构造类型的自动变量如数组等不可作初始化赋值。
二、外部变量外部变量的类型说明符为extern 在前面介绍全局变量时已介绍过外部变量。
这里再补充说明外部变量的几个特点 1. 外部变量和全局变量是对同一类变量的两种不同角度的提法。
全局变是是从它的作用域提出的外部变量从它的存储方式提出的表示了它的生存期。
2. 当一个源程序由若干个源文件组成时 在一个源文件中定义的外部变量在其它的源文件中也有效。
例如有一个源程序由源文件F1.C和F2.C组成 F1.C int ab /外部变量定义/ char c /外部变量定义/ main ???? F2.C extern int ab /外部变量说明/ extern char c /外部变量说明/ func int xy ???? 在F1.C和F2.C两个文件中都要使用abc三个变量。
在F1.C文件中把abc都定义为外部变量。
在F2.C文件中用extern把三个变量说明为外部变量表示这些变量已在其它文件中定义并把这些变量的类型和变量名编译系统不再为它们分配内存空间。
对构造类型的外部变量 如数组等可以在说明时作初始化赋值若不赋初值则系统自动定义它们的初值为0。
本栏文章均来自于互联网版权归原作者和各发布网站所有本站收集这些文章仅供学习参考之用。
任何人都不能将这些文章用于商业或者其他目的。
ProgramFan.Com 【对此文发表评论】 【编程爱好者论坛】 【关闭窗口】 本栏最新文章C语言编写linux下的守护进程 2008-7-2 在C中创建持久对象 2008-7-1 C中类的数据成员的安全隐患 2008-7-1 经典c程序100例91--100 2008-4-3 经典c程序100例81--90 2008-4 经典c程序100例71--80 2008-4-3 经典c程序100例61--70 2008-4-3 经典c程序100例51--60 2008-4-3 经典c程序100例41--50 2008-4-3 经典c程序100例31--40 2008-4-3 - 文章分类C/C文章 Visual Basic Visual C C Builder Visual Foxpro Powerbuilder Delphi ASP
ASP.net JAVA WINDOWS编程 VB.net JSP 游戏开发 汇编语言 数据库开发 Visual C XML PHP 算法 Linux文章 最新文章 在Linux下灵活使用expect脚本的小窍门 VB.Net调用存储过程并得到返回值
ASP.NET中的代码分离 JAVA中sleep、wait、yield、join方法浅析 详解VB.NET对象浏览器作用体现 探索
ASP.NET中Tailspin TravelUI层奥秘 老生常谈:从VB6迁移到VB.net Oracle中最易忽视的两个重要进程 探秘Java 7新增垃圾回收器G1特性 在
Asp.net MVC中使用Repeater Java按字节长度截取字符串 Java解析XML文件的四种方法 Java和.NET互操作应该放弃Web Service吗 熟知Linux操作系统紧急情况处理方法 用PHP的PEAR DB模块编写数据库脚本 8图形和图像编程一 7Visual Studio菜单和工具条编程实战 Java源代码的折行规则 Linux环境下入侵工具Knark的分析及防范 用C实现全屏幕截图 最新招聘信息·销售主管 ·高级软件工程师 ·软件工程部总监 ·软件工程师主管 ·服务端C程序员 ·图形程序员 ·工具程序员 ·3D动作美术 ·游戏特效 ·数值策划 ·关卡策划 ·系统策划 ·VC的软件开发工程师 ·软件开发人员技术工程师 ·软件开发人员工程师Team Leader ·免费发布招聘信息 关于本站 - 网站导航 - 诚邀加盟 - 联系站长 - 友情链接 - 赞助本站 Copyrightcopy 1999-2011 Programfan.com. All Rights Reserved网站制作维护Hannibal Email: webmasterpfan.cn- 站长统计