第十二章(1)——存储类别、链接

本文部分参考https://blog.csdn.net/jsr_123/article/details/78820236

作用域

在C语言中,变量的作用域可以是块作用域、函数作用域、函数原型作用域或文件作用域

块作用域
块是指用一堆花括号括起来的代码区域,定义在块中的变量具有块作用域,块作用域变量的可见范围是从定义处到包含该定义的块的模块结束。(c99扩展到了for \while \do while \ if循环,这些代码即使没有用花括号括起来,也是块的一部分)

函数作用域
可见范围是整个函数。

函数原型作用域
用于函数原型中的形参名,其作用范围是从形参定义处到原型声明结束,这也解释了为什么在定义函数的时候可以没有形参名,只需要有它的类型定义就行。

文件作用域
当变量定义在函数的外面时,具有文件作用域,其作用域是从它的定义处到该定义所在文件的末尾均可见,另外文件作用域变量也称为全局变量。

链接

C变量有三种链接属性:外部链接,内部链接或无链接

具有块作用域、函数原型作用域、函数作用域的变量都是无链接变量,这些变量只属于定义他们的块,函数或原型私有。

具有文件作用域的变量可以是外部链接或内部链接,外部链接变量可以在多文件程序中使用,内部链接变量只能在一个翻译单元中使用。外部链接的文件作用域一般简称为“全局作用域”

int a=0;
static int b=0;//由static关键字判断是内部链接还是外部链接
int main()
{
……
}

b使用了static标识符,即为内部链接,a为外部链接

存储期

c对象有四种存储期:静态存储期、线程存储期、自动存储期、动态分配存储期

静态存储期
如果变量具有静态存储期,那么它在程序的执行期间一直存在,文件作用域变量具有静态存储期,关键字static表明了其链接属性,而非存储期,static表示其具有静态存储期。

自动存储期
块作用域的变量具有自动存储期,当程序进入定义这些变量的块时,为这些变量分配内存,当退出这个块时,释放刚才为变量分配的内存,变长数组稍有不同,它们的存储期从声明处到块的末尾,而不是从块的开始到块的末尾
块作用域变量也能具有静态存储期,只需要在声明变量的时候,在声明前加上关键字static,但是依然属于块作用域(即只有在块中才能使用a访问该对象),但是该函数可以给其他函数提供该存储区的地址以便间接访问该对象,例如通过指针形参或返回值

介绍五种存储类别

1.自动:

默认的存储类型,最早接触,通常不用关键字,在需要与其他类型做区分时,可以加上auto关键词(注意这里auto在c中表示存储类别说明符,而在c++中代表的是自动匹配变量类型).在块作用域中声明,具有自动存储期,即程序进入该块时变量存在,退出该块时变量被销毁.
自动变量不会初始化,除非显示初始化它

int main(void)
{
	int repid;//别指望这个值是0
	int tents=5;
	int rance=5*tents;//可以使用非常量表达式初始化自动变量,
	//但是这个变量要在前面已经定义过了
}

2.寄存器:
关键字为register //register int quick;
其性质与自动变量很相似,块作用域,自动存储期、无链接
但是因为它被存储在寄存器中而不是内存中,所以无法获取它的地址.同时要注意的是,声明寄存器变量只是一种请求,最终是否将该变量存在寄存器中则是由编译器来决定.但无论是否被存入寄存器,该变量都无法获取地址.

3.静态无链接:

在块内用关键字static声明变量
块作用域,静态存储期、无链接
也就是说,在该变量被创建后,程序停止运行才会释放该变量.在循环中,当程序再一次运行到该声明时,会跳过去
自动初始化为0.

4.静态外部链接:

关键字:extern
静态存储期、文件作用域、外部链接
这种变量在所有块外面声明,可以在同一个程序不同翻译单元中作用.如果要在一个文件中使用另一个文件的全局变量,要用关键字extern
自动初始化为0.且初始化时只能使用常量表达式初始化

5.静态内部链接:
静态存储期、文件作用域、内部链接
这个与全局变量的区别在于声明时需要加上static关键字,同时无法被其他文件使用.自动初始化为0.

这里static的含义并不相同,第三种意为存储期是静态的,而第五中意为不能在文件之间共享.

随意使用外部存储类别的变量导致的后果远远超过了它所带来的便利!

你可能感兴趣的:(c语言编程相关)