原文地址:C语言中变量的作用域和生命周期
作者:wuqiseu
谭浩强书:
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><a target="_blank" href="http://photo.blog.sina.com.cn/showpic.html#blogid=4b37468f0101h9rb&url=http://s12.sinaimg.cn/orignal/80ce3a55gba8f155e8b3b" style="text-decoration:none; color:rgb(62,115,160)"><img src="http://s12.sinaimg.cn/middle/80ce3a55gba8f155e8b3b&690" width="116" height="137" alt="[转载]C语言中变量的作用域和生命周期" title="[转载]C语言中变量的作用域和生命周期" style="margin:0px; padding:0px; border:0px; list-style:none"></a><br><br> 从存储模型可以看到,谭浩强和钱能的模型有一定的对应关系:<br><wbr><wbr><wbr><wbr><wbr>静态存储区<wbr>-><wbr>全局数据区<br><wbr><wbr><wbr><wbr><wbr>动态存储区<wbr>-><wbr>栈(stack)<br><br> 变量的类型:<br><wbr>1.<span style="word-wrap:normal; word-break:normal; line-height:21px; color:rgb(255,0,0)">局部变量和全局变量</span><br><wbr><wbr><wbr>局部变量也称为内部变量。 局部变量是在函数内作定义说明的。其作用域仅限于函数内, 离开该函数后再<br><wbr><wbr><wbr>使用这种变量是非法的。<br><wbr><wbr><wbr><br><wbr><wbr><wbr>全局变量也称为外部变量,它是在函数外部定义的变量。它不属于哪一个函数,它属于一个源程序文件。其<br><wbr><wbr><wbr>作用域是整个源程序。在函数中使用全局变量,一般应作全局变量说明。 只有在函数内经过说明的全局变<br><wbr><wbr><wbr>量才能使用。全局变量的说明符为 extern。但在一个函数之前定义的全局变量,在该函数内使用可不再加<br><wbr><wbr><wbr>以说明。<br><br><wbr><wbr><span style="word-wrap:normal; word-break:normal; line-height:21px; color:rgb(255,0,0)">从变量的作用域(全局作用域,局部作用域,文件作用域)(即从空间)角度来分,可以分为<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>全局变量(静态全局变量的作用域是该文件范围(文件作用域)<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>局部变量。</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></span><br style="color:rgb(255,0,0)"><span style="word-wrap:normal; word-break:normal; line-height:21px; color:rgb(255,0,0)"><wbr></wbr></span><br style="color:rgb(255,0,0)"><span style="word-wrap:normal; word-break:normal; line-height:21px; color:rgb(255,0,0)"><wbr><wbr>从另一个角度,从变量值存在的作时间(即生存期)角度来分,可以分为静态存储方式和动态存储方式。</wbr></wbr></span><br style="color:rgb(255,0,0)"><span style="word-wrap:normal; word-break:normal; line-height:21px; color:rgb(255,0,0)"><wbr><wbr>可见生存周期只是和变量存储的位置相关。</wbr></wbr></span><br><br><wbr><wbr><wbr><span style="word-wrap:normal; word-break:normal; line-height:21px; color:rgb(255,0,0)">auto变量:</span><br><wbr><wbr><wbr><wbr><wbr><wbr>函数中的局部变量,如不专门声明为 static 存储类别,都是动态地分配存储空间的,数<br><wbr><wbr><wbr><wbr><wbr><wbr>据存储在动态存储区中。函数中的形参和在函数中定义的变量(包括在复合语句中定义的变<br><wbr><wbr><wbr><wbr><wbr><wbr>量),都属此类,在调用该函数时系统会给它们分配存储空间,在函数调用结束时就自动释<br><wbr><wbr><wbr><wbr><wbr><wbr>放这些存储空间。这类局部变量称为自动变量。自动变量用关键字 auto 作存储类别的声明。<br><wbr><wbr><wbr><wbr><wbr><wbr>关键字 auto可以省略,auto 不写则隐含定为“自动存储类别”,属于动态存储方式。<br><br><wbr><wbr><span style="word-wrap:normal; word-break:normal; line-height:21px; color:rgb(255,0,0)">用 static声明局部变量 :</span><br><wbr><wbr><wbr><wbr><wbr>有时希望函数中的局部变量的值在函数调用结束后不消失而保留原值,这时就应该指定局部变量为“静态<br><wbr><wbr><wbr><wbr><wbr>局部变量”,用关键字 static 进行声明<br><wbr><wbr><wbr><wbr><wbr><a target="_blank" href="http://photo.blog.sina.com.cn/showpic.html#blogid=4b37468f0101h9rb&url=http://s9.sinaimg.cn/orignal/80ce3a55gba8ef07ca538" style="text-decoration:none; color:rgb(62,115,160)"><img src="http://s9.sinaimg.cn/middle/80ce3a55gba8ef07ca538&690" name="image_operate_89311331023113970" alt="[转载]C语言中变量的作用域和生命周期" title="[转载]C语言中变量的作用域和生命周期" style="margin:0px; padding:0px; border:0px; list-style:none"></a><br><br><br><wbr><wbr><wbr><wbr><wbr><span style="word-wrap:normal; word-break:normal; line-height:21px; color:rgb(255,0,0)">register变量:</span><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr>为了提高效率,C 语言允许将局部变量得值放在 CPU 中的寄存器中,这种变量叫“寄存器变量”,用<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr>关键字 register 作声明。<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr>1)<wbr>只有局部自动变量和形式参数可以作为寄存器变量;<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr>2)<wbr>一个计算机系统中的寄存器数目有限,不能定义任意多个寄存器变量;<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr>3)<wbr>局部静态变量不能定义为寄存器变量<br><wbr><br><br><wbr><wbr><wbr><wbr><wbr><span style="word-wrap:normal; word-break:normal; line-height:21px; color:rgb(255,0,0)">用extern声明外部变量</span>:<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr>外部变量(即全局变量)是在函数的外部定义的,它的作用域为从变量定义处开始,到<br><wbr><wbr><wbr><wbr><wbr><wbr>本程序文件的末尾。如果外部变量不在文件的开头定义,其有效的作用范围只限于定义处到<br><wbr><wbr><wbr><wbr><wbr><wbr>文件终了。如果在定义点之前的函数想引用该外部变量,则应该在引用之前用关键字 extern<br><wbr><wbr><wbr><wbr><wbr><wbr>对该变量作“外部变量声明”。表示该变量是一个已经定义的外部变量。有了此声明,就可<br><wbr><wbr><wbr><wbr><wbr><wbr>以从“声明”处起,合法地使用该外部变量。<br><br><br> 总结:<br><br><wbr>从作用域来划分分为:<br><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>-<wbr><wbr>自动变量auto,即动态局部变量(离开函数,值消失)<br><wbr><wbr><wbr><wbr>局部变量<wbr><wbr><wbr>-<wbr><wbr>静态局部变量static(离开函数,值还保留)<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>-<wbr><wbr>寄存器局部变量register(离开函数,值消失)<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>