变量存储类型

  1. 变量的存储类有什么作用?

问题解决:存储类的作用是用来说明标识符的作用域和存储期的。

C语言的变量的完全说明格式为:存储类 数据类型 变量名

存储类分为4种:auto(自动类型)static(静态变量类型)register(寄存器变量类型)extern(外部类型)

  1. 变量存储在内存的什么地方?

问题分析:变量名是一个符号地址,代表内存中的某个内存单元。

问题解决:

第一种是在函数外部定义的变量(全局变量或静态外部变量)和在函数内部定义的static变量,这些变量被存储在数据段中。数据段是在内存中为这些变量留出的一段大小固定的空间。

第二种是在函数内部定义的auto变量(不加关键字static的变量),这些变量被存储在栈中。栈是内存中的一段空间,开始很小,以后会逐渐自动增大,这个界限由系统决定,大多数系统会将此空间上限设定的足够大,因此程序员不必担心用尽栈空间。

第三种是内存空间,实际上并不存储变量,但是可以用来存储变量所指向的数据。如果把调用malloc()函数的结果赋给一个指针变量,那么这个指针变量将包含一块动态分配的内存的地址,这块内存位于一段名为堆(heap)的内存空间中。堆开始时也很小,但当程序员调用malloc()calloc()等内存分配函数时它会增大。堆可以和数据段或栈共用一个内存段,也可以有它自己的内存段,这取决于编译选项和操作系统。

  1. C语言中变量“寿命”有哪些种类?

问题分析:变量的“寿命”又称为生存期或存在期,是指整个程序执行过程中,变量的寿命是全局的还是局部的。

问题解决:C语言的变量的“寿命”可分为两类。

第一种是全局寿命的,指程序从开始到结束一直占用固定的存储空间。包括外部变量和静态变量,它们贯穿程序运行的全过程。

第二种是局部寿命的,只有当程序的运行进入或调用了声明该变量的模块时,才为它临时分配存储空间,而当程序的执行退出该变量所在的模块程序时,这一存储空间就被自动释放,此变量将会消失。这种变量包括函数体内或分程序内定义的auto类或寄存器类变量,还有函数的形参。

还有一种特定的变量,是由malloc()函数或calloc()函数被动态分配数据的变量,它们是从程序调用malloc()函数或calloc()函数开始分配存储空间,当调用free()函数或cfree()函数时释放内存空间。

注:如果在同一个源文件中,全局变量和局部变量同名,则在程序的内部,全局变量不起作用。

  1. 作用域和“寿命”有什么关系?

问题解决:变量的作用域和寿命,或者说是变量的存在性和可见性,对自动类、寄存器类和外部类是一致的,即其作用域越大,“寿命”越长;作用域越小,“寿命”越短。在作用域内是存在的,在作用域外是不存在的,这便是一致性的含义。但对静态类变量来讲,作用域和寿命是不一致的。例如,内部静态类变量的作用域是在定义其函数体内或分程序内,但是“寿命”是长的,还是存在的,即变量的内存单元不被释放,直到整个程序释放。

  1. 为什么寄存器变量不能随意使用?

问题分析:寄存器变量作用域和存在性和自动变量相同,区别在于该变量保存在CPU的寄存器中,因此寄存器变量的存取速度是最快的。

问题解决:寄存器变量是不可以随意使用的,有以下几点限制:

  1. register变量必须是能被CPU寄存器所接受的数据类型,如intchar和指针变量,而不能把一个组合类型的变量制定为register变量;

  2. register作为声明寄存器变量存储类别的关键字,不能缺省;

  3. 因为register变量保存在CPU中,显然不应该用取地址运算符&来获取变量的地址;

  4. 如果声明的寄存器变量过多,超过了CPU的寄存器个数,则多余的寄存器变量被自动当成自动变量处理。

注:在现今的C语言版本中,register变量的定义已经不必要了,因为编译程序忽略register修饰符。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值