c语言中用户标识符的作用域和存储类(2)

2 局部变量及其作用域和生存期

  2.1 auto变量

  当在函数内部或复合语句内定义变量时,如果没有指定存储类,或使用auto说明符,系统默认所定义的变量为自动类别。因此:

  float a;  等价于  auto float a;

  auto变量的存储单元被分配在内存的动态存储区。当进入函数体时,系统自动为auto变量分配存储单元;退出时自动释放这些存储单元。这类局部变量的作用域是从定义的位置起,到函数体结束为止。由于函数的频繁调用,动态存储区内为某个变量分配的存储单元位置随程序的运行而改变,变量的初值也随之而变,所以未赋初值的自动变量其值是不确定的。

  若通过定义语句给自动变量赋初值,赋初值的操作是在程序运行过程中进行的,每进入一次函数体,就赋一次指定的初值。使用这类局部变量的最突出优点是:可在各个函数间造成信息隔离,不同函数中使用同名变量也不会相互干扰,从而可避免因不慎赋值所导致的错误影响到其他函数。

  2.2 register变量

  寄存器变量也是自动类变量,它与auto变量的区别仅在于:用register说明的变量建议编译程序将变量的值保留在CPU的寄存器中,而不是像一般变量那样占内存单元。程序运行时,访问存于寄存器内的值要比访问存于内存中的值快得多。因此当程序对运行速度有较高要求时,把那些频繁引用的少数变量指定为register变量,有助于提高程序的运行速度。

  说明:

  (1)CPU中寄存器的数目是有限的,因此只能说明少量的寄存器变量。在一个函数中,允许说明为寄存器变量的数目不仅取决于CPU的类型,也与所用的C编译程序有关。当没有足够的寄存器来存放指定的变量,或编译程序认为指定的变量不适合放在寄存器中时,将自动按auto变量来处理。因此,register说明只是对编译程序的一种建议,而不是强制性的。

  (2)由于register变量的值是放在寄存器内而不是放在内存中,所以register变量没有地址,也就不能对它进行求地址运算。

  (3)register变量的说明应尽量靠近其使用的地方,以便提高寄存器的利用效率。这可以通过把对register变量的说明和使用放在复合语句中来实现。

  2.3 静态存储类的局部变量

  当在函数体(或复合语句)内部用static来说明一个变量时,可以称该变量为静态局部变量。静态局部变量的作用域仍与 auto、register 类的变量一样,但与后两者有两点本质上的区别:

  (1)在整个程序运行期间,静态局部变量在内存的静态存储区中占据着永久性的存储单元。即使退出函数后,下次再进入函数时,静态局部变量仍使用原来的存储单元。由于并不释放这些存储单元,因此这些存储单元中的值得以保留,因而可以继续使用存储单元中原来的值。静态局部变量的生存期将一直延长到程序运行结束。

  (2)静态局部变量的初值是在编译时赋予的,不是在程序执行期间赋予(自动变量是在程序执行过程中赋初值)。对未赋初值的静态局部变量,C编译程序自动给它赋初值0。

  静态局部变量的上述特点,对于编写那些在函数调用之间必须保留局部变量值的函数是非常有用的。

时间: 2024-10-06 08:53:29

c语言中用户标识符的作用域和存储类(2)的相关文章

c语言中用户标识符的作用域和存储类(1)

在c语言中,标识符必须先定义后使用.但定义语句应该放在什么位置?在程序中,一个定义了的标识符是否随处可用?这些问题牵涉到标识符的作用域.经过赋值的变量是否在程序运行期间总能保存其值?这又牵涉到变量的生存期.当一个程序的若干函数分别存放于不同的文件中时又有何限制?对于上述问题,c语言中有具体的规定. 读者应该特别注意 “定义” 和 “说明” 这两个词.“定义”(definition)是指给变量分配确定的存储单元,“说明”(declaration)只是说明变量的性质,而并不分配存储空间. 1 局部变

存储类、生命周期、作用域、链接域

Linux下c内存映像 大方向分为 应用空间 + 内核空间,他俩内存空间布局差不多.这里重点回顾应用空间布局,应用空间氛围代码段 + 数据段(静态数据段+动态数据段) 代码段 为啥是只读的 代码段在编译时就定好了,在程序的运行过程中,不能在代码段去开辟空间,以及释放空间. 包含哪几部分 ELF头.段头部表.init节 参考:剖析可执行文件ELF组成 .text 指令节,也叫代码节,所有函数中的指令都放在了.text节中.能够与指令直接弄在一起的常量,也随指令一起放在了.text中. .rodat

【转】C语言中标识符的作用域、命名空间、链接属性、生命周期、存储类型

Technorati 标签: C,标识符,作用域,命名空间,链接属性,生命周期,存储类型,scope,name space,linkage,storage durations,lifetime 无论学习哪一种语言,都免不了要讨论这些问题.而且这些问题,深究起来有时也让我们很迷惑. 标识符的定义无需多讲,只需注意不仅仅是指变量,还有函数,标签等. 1. 标识符的作用域 作用域是指允许对标识符进行访问的位置范围.按照C99(章节6.2.1),C语言的作用域共有 4 种类型:文件作用域.代码块作用域.

C语言中变量、全局变量与变量的作用域

什么是变量: 变量常量都是表征数据的一种形式:常量用来表示数据的值: 变量不仅可以用来表示数据的值:还可以用来存放数据:因为变量对应着一定的内存单元: 变量和常量必须先定义后使用. 变量名和常量名都是一种标识符,用来标识变量和常量的.变量和常量必须用标识符(或者可以理解成一个名字)来表示后才能使用. 赋值表达式语句把值赋给变量,或者更一般地说,把值赋给存储空间. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

C语言中的作用域,链接属性和存储类型

作用域 当变量在程序的某个部分被声明的时候,他只有在程序的一定渔区才能被访问,编译器可以确认4种不同类型的作用域:文件作用域,函数作用域,代码块作用域和原型作用域 1.代码块作用域:位于一对花括号之间的所有语句称为一个代码块.任何在代码块的开始位置声明的标识符都具有代码块作用域,表示他可以被这个代码块中的所有语句访问.(例子中:f,g函数,i) 2.文件作用域:任何在所有代码块之外声明的标识符都具有文件作用域,他表示这些标识符从他们的声明之处直到他所在的源文件结尾处都是可以访问的.(例子中:a,

C语言中标识符声明的几个关键字总结

C语言中声明一个名称就是把一个标识符与某个C语言对象相关联,如变量.函数或类型,C语言中可以声明的名称包括:变量.函数.类型.类型标志.结构成员与联合成员.枚举常量.语句标号和预处理器宏.除了语句标号和预处理器宏之外,所有标识符都在C语言声明中声明,变量.函数.类型放在声明的声明符中,类型标志.结构成员与联合成员和枚举常量在声明的某种类型说明符中声明,语句标号在C语言函数中出现时声明,而预处理器宏用#define预处理器命令声明. 如下列声明: extern const volatile uns

C/C++——C++变量的作用域与生命周期,C语言中变量的作用域和生命周期

全局变量 作用域:全局作用域(全局变量只需在一个源文件中定义,就可以作用于所有的源文件.) 生命周期:程序运行期一直存在 引用方法:其他文件中要使用必须用extern 关键字声明要引用的全局变量. 内存分布:全局数据区 注意:如果在两个文件中都定义了相同名字的全局变量,连接出错:变量重定义 全局静态变量 作用域:文件作用域(只在被定义的文件中可见.) 生命周期:程序运行期一直存在 内存分布:全局数据区 定义方法:static关键字,const 关键字 注意:只要文件不互相包含,在两个不同的文件中

Go语言中的变量

1 概述 变量(Variable)是程序运行过程中,内容可以变化(修改)的量,变量的功能是存储用户的数据,是计算机语言中能储存计算结果或能表示值抽象概念.变量,是通过变量的标识符定位值的过程.变量的内存模拟演示: 2 定义:声明和初始化 定义变使用var关键字,需要指定其类型,可以同时初始化,如果没有指定初始化值,则使用类型的默认值,语法如下: // 声明变量,未初始化(默认值初始化) var name string // 声明变量,特定值初始化 var user string = "Hank&

C语言中容易被忽略的细节(第四篇)

前言:本文的目的是记录C语言中那些容易被忽略的细节.我打算每天抽出一点时间看书整理,坚持下去,今天是第一篇,也许下个月的今天是第二篇,明年的今天又是第几篇呢?--我坚信,好记性不如烂笔头.第四篇了,fight~... 第一篇链接:C语言中容易被忽略的细节(第一篇) 第二篇链接:C语言中容易被忽略的细节(第二篇) 第三篇链接:C语言中容易被忽略的细节(第三篇) 1.void*类型的指针不能参与算术运算,只能进行赋值.比较和sizeof操作的原因? 指针的算术运算还要包含指针所指对象的字节数信息.