您的位置:首页 > 职场人生

《程序员面试宝典》--栈和堆,局部变量和全局变量

2015-08-04 16:06 274 查看
在队列,栈,链表中都存在:顺序结构和链式结构

栈:仅在表尾进行插入删除的线性表

栈是向下生长的,所谓向下生长是指从内存高地址->低地址的路径延伸。使用函数先进行参数压栈,顺序从右向左。(P189)

堆:由程序员分配和释放,如 malloc。栈:由编译器自动分配和释放。

全局变量和静态全局变量,局部变量和静态局部变量
全局变量和静态全局变量: 都储存在静态存储区;声明在函数块之外;作用域有区别,全局变量在一个源文件声明之后,所有源文件都能使用,只是其他源文件需要加extern关键字,而静态全局变量的作用域只能在产生定义的源文件内,使用静态全局变量可以避免文件间的耦合。二者都有全局作用域,对所有函数可见。

局部变量和静态局部变量:局部变量在栈中分配空间,静态局部变量在静态存储区内分配空间。作用域都是函数执行期间,仅对声明该变量的函数内可见。

局部变量加上static,改变生命周期,从函数活动期间延长到整个程序运行期间。全局变量加上static改变了作用域,从所有源文件可见到仅声明的源文件可见。

栈的POP 和 PUSH

#include<stdio.h>
#include<stdlib.h>

typedef struct Node
{
int data;
struct Node *next;
}Node,*pNode;

typedef struct Stack
{
int count;
pNode top;//注意:非 pNode *top
}LinkStack;

int Push(LinkStack *S,int e)
{
pNode s = (pNode)malloc(sizeof(Node)); //结构分为Node和pNode的用处
s->data = e;
s->next = S->top;
S->top = s;
S->count++;
return 0;
}

int Pop(LinkStack *S,int *e)
{
//注意:先判断栈是否为空
pNode p;
if(S->count == 0)
return 0;
*e = S->top->data;
p = S->top;
S->top=S->top->next;
free(p);//pop必须要释放节点
S->count--;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: