C语言--变量类型

C语言变量类型

auto
static
external
static external
register

auto 局部变量

     auto 变量是用堆栈(stack)方式占用储存器空间,所以,当执行此区段是,系统会当即为这个变量分配存储器空间,而程序执行完后,这个堆栈当即被系统收回.在大括号{}内声明.
     自动变量就是指在函数内部定义使用的变量。他只是容许在定义他的函数内部使用它。在函数外的其余任何地方都不能使用的变量。自动变量是局部变量,即它的区域性是在定义他的函数内部有效。固然这说明自动变量也没有连接性,由于它也不容许其余的文件访问他。因为自动变量在定义他的函数的外面的任何地方都是不可见的,因此容许咱们在这个函数外的其余地方或者是其余的函数内部定义同名的变量,他们之间不会发生冲突的。由于他们都有本身的区域性, 并且它没有连接性(即:不容许其余的文件访问他的)。来看看自动量的持续性。计算机在执行这个函数的时候,建立并为它分配内存,当函数执行完毕返回后,自动变量就会被销毁。这个过程是经过一个堆栈的机制来实现的。为自动变量分配内存就压栈,而函数返回时就退栈。

static 静态变量

     static 变量是C程序编译器以固定地址存放的变量,只要程序不结束,内存不被释放.
     静态变量与自动变量的本质区别是,静态变量并不像自动变量那样使用堆栈机制来使用内存。而是为静态变量分配固定的内存,在程序运行的整个过程当中,它都会被保持,而不会被销毁。这就是说静态变量的持续性是程序运行的整个周期。这有利于咱们共享一些数据。若是静态变量在函数内部定义,则它的做用域就是在这个函 数内部仅在这个函数内部使用它才有效,可是它不一样于自动变量的,自动变量离开函数后就会别销毁,而静态变量不会被销毁。他在函数的整个运行周期内都会存在。在函数外面定义的变量为全局变量,工程内的全部文件均可以访问他,可是它在整个工程内只能定义一次,不能有重复的定义,否则就会发生错误,而其余的文件要想使用这个变量,必须用extern来声明这个变量,这个声明叫作引用声明。这一点很重要,若是你没有用extern 来声明在其余文件中已经定义的全局变量,就来使用它,就会发生错误若是你只是想在定义他的文件中使用它,而不容许在其余的文件中使用它,那么就用关键字 static来在函数外面声明变量。这样这个变量在其余文件中将不可见,即它的链接性而内部连接。有一点是咱们只得注意的像:若是你在函数外这样声明一个 变量,const int a ; 变量a的链接性为内部连接,只能在定义他的文件内使用。还有若是你在定义静态变量的时候并无给变量初始化,则静态变量将被自s动初始化为0;

external 变量

外部变量 定义在程序外部,全部的函数很程序段均可以使用.

外部变量可能会在某一程序段被从新定义,以段内变量为参考值.

static external 变量

静态外部变量和外部变量差异在于,外部变量生命能够同时给多个文件使用,而静态外部变量则只能给声明此变量的文件使用.

register 变量


寄存器变量,是由寄存器分配空间,访问速度比访问内存快,加快执行速度.寄存器大小有限.

在c语言当中可使用寄存器变量来优化程序的性能,最多见的是在一个函数体当中,将一个经常使用的变量声明为寄存器变量:  register int ra; 若是可能的话,编译器就会为它分配一个单独的寄存器,在整个函数执行期间对这个变量的操做全都是对这个寄存器进行操做,这时候就不用频繁地去访存了,天然就提升了性能。可是寄存器变量不是强制性的,也就是说,即便你使用 register关键字去声明一个变量为寄存器变量,编译器仍是有可能把它做为一个普通的变量而不是寄存器变量来使用的。

须要注意的是,目前C编译器还不容许全局寄存器变量,也就是说寄存器变量只能是局部变量或者函数形参变量,并且最好是int,char或者指针类型变量。在声明寄存器变量的时候,能够制定使用哪一个寄存器,在X86平台上经常使用的有” ebp, ebx, esi, edi“。 能够这样声明: register int local_var __asm__("ebp"); 这时候须要在编译程序的时候给出特别的选项,由于有些寄存器本来是另有用途的,好比ebp寄存器,原来是作frame-pointer用途的,在调试程序 的时候能够用它来跟踪程序的调用关系。这时候咱们使用  -fomit-frame-pointer 选项来指明这一点。
相关文章
相关标签/搜索