1---C语言|笔记【C语言中的变量总结】

来源:互联网 发布:文档管理方法.知乎 编辑:程序博客网 时间:2024/06/08 01:17

外部变量
局部变量
全局变量
自动变量
寄存器变量
静态变量

以下内容是一个初学者的整理,仅供参考
参考资料《C程序设计语言(第二版)》

1. 外部变量

《C程序设计语言》中的定义:如果变量定义在任何函数外部,则是外部变量。
说明:
1)外部变量可以在全局范围内访问,因此函数间可以通过外部变量交换数据,而不必使用参数表;
2)外部变量在程序执行期间一直存在;
3)外部变量必须定义在所有函数之外,且只能定义一次,定义后编译程序将为它分配存储单元;
4)在每个需要访问外部变量的函数中,必须声明相应的外部变量,说明其类型。声明是可以用extern语句显示声明,也可以通过上下文隐式声明
5)某些情况下可以省略extern声明。在源文件中,如果外部变量的定义出现在使用它的函数之前,那么在那个函数中就没有必要使用extern声明。在通常的做法中,所有外部变量的定义都放置在源文件的开始处,这样就可以省略extern声明;
6)如果程序包含在多个源文件中,而某个变量在file1文件中定义、在file2和file3文件中使用,那么在文件file2和file3中就需要使用extern声明来建立变量与其定义之间的联系。通常把变量和函数的extern声明放在一个单独的文件中(头文件)。
补充说明:
外部变量的用途还表现在他们与内部变量相比具有更大的作用域和更长的生存期。自动变量只能在函数内部使用,从其所在的函数被调用时变量开始存在,在函数退出时变量也将消失。而外部变量时永久存在的,它们的值在一次函数调用到下一次函数调用之间保持不变。因此,如果两个函数必须共享某些数据,而这两个函数互不调用对方,这种情况下最方便的方式便是把这些共享数据定义为外部变量,而不是作为函数参数传递。
过分依赖外部变量会导致一定的风险,因为它会使程序中的数据关系模糊不清——外部变量的值可能会被意外的或不经意的修改。

2. 自动变量

什么是自动变量:定义在函数体内部的变量,也叫私有变量或者局部变量
作用域:仅限于定义它的函数体内部,函数中的每个局部变量只在函数被调用时存在,在函数执行完毕退出时消失。
补充说明:自动变量定义在函数体内部,如不做专门声明为静态变量,都是动态分配存储空间,存储在动态存储区中。这种变量只在定义它们的时候才创建,在定义它们的函数返回时系统回收变量所占的存储空间。对这种变量的存储空间的分配和回收是自动完成的,所以叫它自动变量

3. 静态变量

定义:以static存储类声明的变量。
static的两种声明:
1)用static声明限定外部变量函数,可以将其后声明的对象的作用域限定为被编译源文件的剩余部分。通过static限定外部对象,可以达到隐藏外部对象的目的。
2)用static声明自动变量,声明后的对象的存储方式变为静态存储方式,它与自动变量的不同是,不管其所在的函数是否被调用,它一直存在,而不像自动变量那样,随着所在函数的被调用和退出而存在和消失。

4. 寄存器变量

register int x;register char c;

以上就声明了两个寄存器变量,register告诉编译器,它所声明的变量使用频率较高。其思想是将register声明的变量放到机器的寄存器中,这样可以使程序更小、执行速度更快,但编译器可以忽略此选项。
注意:
1)register声明只适用于自动变量函数的形式参数
2)过量的register声明并没有什么坏处,因为编译器可以自动忽略过量或者不支持的寄存器变量声明;
3)无论寄存器变量最终是否放到了寄存器中,它的地址都是不可以访问的。

5. 全局变量和局部变量

在某些地方我们会看到全局变量局部变量的定义,其实它们对应的就是外部变量和自动变量。
全局变量与外部变量的区别是全局变量是作用于程序中的所有地方,它是不加static的外部变量。
局部变量则与自动变量的定义完全一样。

#include <stdio.h>int i;             //外部变量static int j;      //静态变量int main(){    int i;         //自动变量,该变量会屏蔽外部变量i    static int k;  //静态变量    register int x;//寄存器变量    return 0;}
原创粉丝点击