堆栈概述
在计算机领域,堆栈是一个不容忽视的概念,堆栈是两种数据结构。堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除。在单片机应用中,堆栈是个特殊的存储区,主要功能是暂时存放数据和地址,通常用来保护断点和现场。
要点:
堆,优先队列(priority queue);普通的队列是一种先进先出的数据结构(FIFO—First-In/First-Out),元素在队列尾追加,而从队列头删除,(例如:乘车排队,先来的排在前面先上车,后来的就要排的后面后上车; 哎,哎,你怎么插队呢,学没学过队列);在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先取出。优先队列具有最高级先出 (largest-in,first-out)的行为特征。
栈,先进后出(FILO—First-In/Last-Out)(例如:超市排队结账,大一点的超市收银台都是一段狭长的过道,本来下一个是你了,突然这个收银台说不结了,OK,栈形成了,排在前面的要后出去了)。
一、程序的内存分配
1、一个由C/C++编译的程序占用的内存分为以下几个部分
1)、栈区(stack)
由编译器自动分配释放,存放函数的参数值,局部变量的值等。其
操作方式类似于数据结构中的栈。
2)、堆区(heap)
一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回
收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。
3)、全局区(静态区)(static)
全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 程序结束后由系统释放。
4)、文字常量区
常量字符串就是放在这里的,程序结束后由系统释放 。
5)、程序代码区
存放函数体的二进制代码。
2、变量的存储方式
首先,定义静态变量时如果没有初始化编译器会自动初始化为0.。接下来,如果是使用常量表达式初始化了变量,则编译器仅根据文件内容(包括被包含的头文件)就可以计算表达式,编译器将执行常量表达式初始化。必要时,编译器将执行简单计算。如果没有足够的信息,变量将被动态初始化。请看一下代码:
int global_1=1000;//静态变量外部链接性常量表达式初始化
int global_2;//静态变量外部链接性零初始化
static int one_file_1=1000;//静态变量内部链接性常量表达式初始化
static int one_file_2;//静态变量内部链接性零初始化
int main()
{
static int count_1=1000;//静态变量无链接性常量表达式初始化
static int count_2;//静态变量无链接性零初始化
return 0;
}
所有的静态持续变量都有下述初始化特征:未被初始化的静态变量的所有位都被设为0。这种变量被称为零初始化。以上代码说明关键字static的两种用法,但含义有些不同:用于局部声明,以指出变量是无链接性的静态变量时,static表示的是存储持续性;而用于代码块外声明时,static表示内部链接性,而变量已经是静态持续性了。有人称之为关键字重载,即关键字的含义取决于上下文。
二、C/C++堆和栈的区别
1.管理方式不同
栈,由编译器自动管理,无需程序员手工控制;堆:产生和释放由程序员控制。