1.关键字static的作用是什么
我:
(1),修饰全局变量,改变其作用域,只能在本文件使用。
(2),修饰函数,改变其作用域,只能在本文件中调用。
(3),修饰局部变量,改变变量的生命周期,直至程序结束才会释放。
书:
简单来说static修饰变量,就是指该变量空间独立于函数中的auto变量(auto被解释为一个自动存储变量的关键字,也就是申明一块临时的变量内存。)或者栈变量,static变量空间在内存中的静态区(全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后由系统释放)内分配。
一般情况下,局部变量是放在栈区的,并且局部变量的生命周期在该语句块执行结束时便结束了。但是如果用static进行修饰的话,该变量便存放在静态数据区,其生命周期一直持续到整个程序执行结束为止。但在这里要注意的是,虽然用static对局部变量进行修饰过后,其生命周期和存储空间发生了变化,但其作用域并没有改变,其仍然是一个局部变量,作用域仅限于该语句块。
对于一个全局变量,它既可以在本源文件中被访问,也可以在同一个工程的其他源文件中被访问(只需用extern进行声明即可)
用static修饰函数的话,情况与修饰全局变量大同小异,就是改变了函数的作用域。
网:
(1)设置变量的存储域,函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其在下次调用时仍维持上次的值;
(2)限制变量的作用域,在模块内的static全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问;
(3)限制函数的作用域,在模块内的static函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明它的模块内;
(4)在类中的static成员变量意味着它为该类的所有实例所共享,也就是说当某个类的实例修改了该静态成员变量,其修改值为该类的其它所有实例所见;
(5)在类中的static成员函数属于整个类所拥有,这个函数不接收this指针,因而只能访问类的static成员变量。
2.局部变量能否和全局变量重名
函数的形参变量只有在被调用期间才能分配内存单元,调用结束立即释放。这一点表明形参变量只有在函数内才是有效的,离开该函数就不能在使用了。这种变量有效性的范围称为变量的作用域。不仅对于形参变量,C语言中所有的量都有自己的作用域。变量说明的方式不同,其作用域也不同。C语言中的变量,按作用域范围可分为两种,即局部变量和全局变量。
局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内。
3.static全局变量、局部变量、函数与普通变量、局部变量、函数有什么区别
static全局变量和函数,改变了他们的作用域,只能对本文件使用,即使用extern的外部声明也不行
static局部变量:延长了局部变量的生命周期,直至程序结束
普通变量:只执行一次
4.程序的内存分配,即由C/C++编译的程序占用的内存分为几个部分
内存分配方式有三种
(1)从静态存储区分配。
内存在程序编译时就已经分配好,这块内存在程序的整个运行期间都存在,如全局变量,static变量等。
(2)在栈上创建。
在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算使用内置于处理器的指令集,效率很高,但分配的内存容量有限。
(3)从堆上分配,亦称为动态内存分配。
程序在运行时使用malloc或new申请所需要内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存空间由程序员决定,使用非常灵活,但问题也最多。
全局变量和static变量是程序整个程序所需要用到的,单独分出一块存储区保存,在程序的整个运行程序期间该存储区存储的数据不清空;局部变量在函数退出时自动清空,放在栈里进行临时存储。用指令new和malloc分配的内存需要自己在堆中手动申请并用free和delete指令手动释放。
1、栈区(stack)由编译器自动分配释放,在不需要的时候自动清除。用于存放函数的参数、局部变量等。操作方式类似数据结构中的栈2、堆区(heap)一般由程序员分配释放,若程序员分配后不释放,程序结束后可能由OS回收。不同于数据结构中的堆,分配方式有些类似链表。3、全局区(静态区)——全局变量和静态变量存储在这里。程序结束后由系统释放。在以前到C语言中,全局变量又细分为初始化的(DATA段)和未初始化到(BSS段),在C++里已经没有这个区分了,它们共同占用同一块内存区。4、常量存储区——常量字符串就存放在这里。一般不允许修改。程序结束后由系统释放。5、代码区——存放函数体的二进制代码。
2、堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。
二、堆栈缓存方式区别:
1、栈使用的是一级缓存, 他们通常都是被调用时处于存储空间中,调用完毕立即释放;
2、堆是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。
三、堆栈数据结构区别:
堆(数据结构):堆可以被看成是一棵树,如:堆排序;
栈(数据结构):一种先进后出的数据结构。