先来看一个赋值语句:int num=5;
如果让你解释一下这个语句你能说出多少呢?
如果仅仅解释成定义了一个变量num赋值为5,未免显得太单薄了。如果将变量的占用空间内存大小,作用域以及存储区域都描述一遍,就是一个比较去全面的解释了。
一个整型变量占4个字节,我们已经知道了。
由于不知道这个定义的变量是全局变量还是局部变量,所以分开说为上。
局部变量和全局变量的作用域是不同的,局部变量的作用域为函数调用结束,全局变量作用域为整个程序执行结束。
局部变量和全局变量的区别还在内存分配上有所体现,计算机的三大组成部分为;CPU、内存(内存保存的是动态的数据,硬盘保存的是静态的;程序保存是在硬盘中,执行是在内存中,程序被执行就会变成一个进程;数据保存在内存中会发生掉电丢失,程序在执行中会将内容搬到内存中)、硬盘。而计算机在内存分配上具体体现在抽象出来保存数据用的进程虚拟地址空间。
划分地址空间是为了使数据之间不受影响,并且对数据有保护作用。
下面我对虚拟地址空间概念和划分进行简单的阐述:
虚拟地址空间是内存分配给每个进程分配的4个G的存储区域。
其中1个G分配给了内核,另外3个G分配给用户空间。
用户空间分为4个部分:栈空间、堆空间、数据区、代码段。
栈空间主要用用来保存局部变量、函数形参、自动变量。特点是先进后出,由系统进行管理。
堆空间主要用来存放malloc,relloc,calloc函数。
数据区分为3个段;bss段用来保存为初始化的全局变量;or(only read)区保存常量,常来那个不能被修改;静态变量区保存的是static修饰的变量和初始化的全局变量。
代码段存放代码。特点是用户管理,先进先出。
分配内存的三种方式为栈空间,堆空间,数据区。
综上:全局变量和局部变量的区别主要有以下四点:
1、从内存的分配来讲,全局变量分配在数据区,局部变量分配在栈空间。
2、从作用域上来说,局部变量的作用域为函数调用结束,全局变量作用域为整个程序执行结束。
3、从初始化来讲,局部变量未初始化系统会初始化成一个随机值,也就是一个垃圾值,全局变量未初始化,系统会初始化成零。
4、全局变量和局部变量重名时,局部变量起作用。
PS:声明和定义的区别;定义是要分配内存空间的,声明不用分配内存空间;定义只可以定义一次,声明可以声明很多次。
定义性声明既分配了空间又定义了变量。
extern int count中extern是外部声明可以引用。
声明是为了编译器解决麻烦,提高了编译效率。
(哈哈)