目录
变量:
定义:
指在程序运行时其值可以改变的量,起存储数据的功能
在C语言中,变量是对程序中数据所占内存空间的一种抽象定义,定义变量时,用户定义变量的名、变量的类型,这些都是变量的操作属性,不仅可以通过变量名访问该变量,系统还通过该标识符确定变量在内存中的位置
在计算机中,保存变量当前值的存储单元有两类,一类是内存,另一类是CPU的寄存器。变量的存储类型关系到变量的存储位置,C语言中定义了4种存储属性,即自动变量(auto)、外部变量(extern)、静态变量(static)和寄存器变量(register),它关系到变量在内存中的存放位置,由此决定了变量的保留时间和变量的作用范围。
时间角度
变量的保留时间又称为生存期,从时间角度,可将变量分为静态存储和动态存储两种情况
静态变量
指变量存储在内存的静态存储区,在编译时就分配了存储空间,在整个程序的运行期间,该变量占有固定的存储单元,程序结束后,这部分空间才释放,变量的值在整个程序中始终存在
动态变量
指变量存储在内存的动态存储区,在程序的运行过程中,只有当变量所在的函数被调用时,编译系统才临时为该变量分配一段内存单元,函数调用结束,该变量空间释放,变量的值只在函数调用期存在
空间角度
变量的作用范围又称为作用域,从空间角度,可以将变量分为全局变量和局部变量
全局变量
在函数之外定义的变量,其作用范围为从定义处开始到本文件结束,编译时,编译系统为其分配固定的内存单元,在程序运行的自始至终都占用固定单元
局部变量
在自动变量(auto)自动变量(auto)自动变量(auto)一个函数或复合语句内定义的变量,它仅在函数或复合语句内有效,编译时,编译系统不为局部变量分配内存单元,而是在程序运行过程中,当局部变量所在的函数被调用时,编译系统根据需要,临时分配内存,调用结束,空间释放
自动变量(auto)
函数中的局部变量,如不专门声明为static存储类别,都是动态地分配存储空间的,数据存储在动态存储区中。函数中的形参和在函数中定义的变量(包括在复合语句中定义的变量)都属此类,在调用该函数时系统会给它们分配存储空间,在函数调用结束时就自动释放这些存储空间,这类局部变量称为自动变量
使用auto进行声明
外部变量(extern)
即全局变量,是在函数的外部定义的,它的作用域为从变量定义处开始,到本程序文件的末尾
如果外部变量不在文件的开头定义,其有效的作用范围只限于定义处到文件末尾。如果在定义点之前的函数想引用该外部变量,则应该在引用之前用关键字extern对该变量进行“外部变量声明”,表示该变量是一个已经定义的外部变量。有了此声明,就可以从“声明”处起,合法地使用该外部变量
通常的,用extern声明外部变量,扩展程序文件中的作用域
静态变量(static)
函数中的局部变量的值在函数调用结束后不消失而保留原值
通过用static类型声明后的变量,其变量的内存空间位于内存的全局静态区,仅会初始化一次
这个结果的原因在于,每次a的值是接着上一次函数调用的值继续运算的,并非每次都初始化从5开始计算,这就是static的特性
未使用static:
未使用static,每次都是从 a = 5 开始计算
寄存器变量(register)
为提高效率,C语言允许将局部变量的值存放在CPU的寄存器中,这种变量叫做寄存器变量,用关键字register声明
使用寄存器变量需要注意以下几点:
(1)只有局部自动变量和形式参数可以作为寄存器变量
(2)一个计算机系统中的寄存器数目有限,不能定义任意多个寄存器变量
(3)不能使用取地址运算符“&”求寄存器变量的地址
在C语言发展迭代的今天,当我们尝试用regiter声明一个变量时,编译器很可能会根据情况,把"register"忽略掉,需要大家知晓这一情况
常量:
指在程序运行时其值不变的量,常量不占内存,在程序运行时它作为操作对象直接出现在运算器的各种寄存器中
#include <stdio.h> int mian() { int year; year = 2023; printf("welcome to C's word!\n"); return 0; }
变量:year 常量:2023
标识符:
在程序中使用的变量名、函数名、标号等统称为标识符标识符只能是由字母(A~Z、a~z)、数字(0~9)、下划线(_)组成的字符串
标识符规则:
(1)标准C不限制标识符的长度,但它受各种版本的C语言编译系统限制,同时 也受到具体机器的限制。例如在某版本C中规定标识符前八位有效,当两个标识 符前八位相同时,则被认为是同一个标识符。
(2)在标识符中,大小写是有区别的。例如CLANG和Clang 是两个不同的标识符。
(3)标识符虽然可由程序员随意定义,但标识符是用于标识某个量的符号。因此,命名应尽量有相应的意义,以便阅读理解,做到“顾名思义”。