C语言变量和函数的存储类型
C变量和函数的存储类型
C语言中变量的声明/定义格式如下:
存储类型 类型修饰符 数据类型 变量名;
存储类型:用来指明变量的存储位置,即运行该变量在哪一段分配内存空间,常见的存储位置有auto、extern、register、static,在一段执行程序中,可以为变量分配存储空间的有BSS、数据区、栈区、堆区。
类型修饰符:用来修饰变量的存储和表现方式。包括long、short、signed、unsigned、void、const、volatile等。
数据类型:用来指明该变量的存储大小,即一个该类型的变量要占用多少内存空间。基本数据类型有(char、int、float、指针类型)和由基本数据类型组成的用户自定义类型(struct、enum、typedef、union)
C语言中函数的声明格式如下:
存储类型 返回数据类型 函数名(参数列表)
存储类型:用来标识该函数的作用域,而不是存储位置,主要有extern、static两个,auto和register不用来表示程序的存储类型。
返回数据类型:函数退出时返回给调用者的数据类型。
1、关于auto存储类型
auto只能用来表示变量的存储类型,意味自动类型,表示该局部变量存储在运行时进程的栈区域,一般而言,对于局部变量、auto为默认的存储类型。所以可以省略不写。注意,局部变量如果没有初始化就直接拿来使用,那么系统会随机的分配一个值给它,这是不安全的。auto类型的变量每一次调用都会被初始化一次。
2、关于全局变量和extern声明的数据
extern既可以声明变量也可以标识函数。对于用来声明变量,extern声明在当前文件中引用的定义在其它文件中的全局变量。已经初始化的全局变量被存储在数据区中,所以声明其他文件中的全局变量将不会在为其分配内存空间。
声明一个变量和定义一个变量的区别:
定义一个变量:告诉编译器需要为该变量分配多少空间。
声明一个变量:告诉编译器需要使用该变量,但该变量在其他位置被定义。
对于一个函数,存储类型仅仅标识函数的作用域,默认的存储类型是extern。
声明全局变量的两种方式:
1、在头文件中定义,然后引用头文件
2、在其他文件中定义,然后使用extern引用变量。
3、register存储类型
register关键字只能定义局部变量,只能修饰整形或者字符型,主要表示长期被使用的变量。被register定义的局部变量长期存在于寄存器中,寄存器变量被用于循环控制是比较理想的。和auto一样,如果未初始化就直接使用register变量,那么系统讲随机分配一个变量。
4、static存储类型
static既可以标识变量也可以标识函数。被定义为静态类型的变量(无论是全局的变量、还是局部变量)都存储在数据区域,其生命周期为整个程序。如果是静态的局部变量,其作用域为自身所处的{ }内,如果是静态全局变量,其作用域为整个当前文件。
静态变量如果没有被初始化,系统讲自动初始化为0值,只会被初始化一次。
static定义的函数的作用域只能是当前文件,因此不能在其他文件中被调用。对于不需要在其他文件中被调用的函数,声明为static是必要的,这样也在一定程度上避免函数名称的冲突。
5、常量数据
常量数据存储在代码段,其生存期为整个程序的运行时间,但是其作用域为当前文件。