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

  • 在队列,栈,链表中都存在:顺序结构和链式结构
  • 栈:仅在表尾进行插入删除的线性表
  • 栈是向下生长的,所谓向下生长是指从内存高地址->低地址的路径延伸。使用函数先进行参数压栈,顺序从右向左。(P189)
  • 堆:由程序员分配和释放,如 malloc。栈:由编译器自动分配和释放。
  • 全局变量和静态全局变量,局部变量和静态局部变量
    1. 全局变量和静态全局变量:  都储存在静态存储区;声明在函数块之外;作用域有区别,全局变量在一个源文件声明之后,所有源文件都能使用,只是其他源文件需要加extern关键字,而静态全局变量的作用域只能在产生定义的源文件内,使用静态全局变量可以避免文件间的耦合。二者都有全局作用域,对所有函数可见。
    2. 局部变量和静态局部变量:局部变量在栈中分配空间,静态局部变量在静态存储区内分配空间。作用域都是函数执行期间,仅对声明该变量的函数内可见。
    3. 局部变量加上static,改变生命周期,从函数活动期间延长到整个程序运行期间。全局变量加上static改变了作用域,从所有源文件可见到仅声明的源文件可见。
  • 栈的POP 和 PUSH
     1 #include
     2 #include
     3 
     4 typedef struct Node
     5 {
     6     int data;
     7     struct Node *next;
     8 }Node,*pNode;
     9 
    10 typedef struct Stack
    11 {
    12     int count;
    13     pNode top;//注意:非 pNode *top
    14 }LinkStack;
    15 
    16 int Push(LinkStack *S,int e)
    17 {
    18     pNode s = (pNode)malloc(sizeof(Node)); //结构分为Node和pNode的用处
    19     s->data = e;
    20     s->next = S->top;
    21     S->top = s;
    22     S->count++;
    23     return 0;
    24 }
    25 
    26 int Pop(LinkStack *S,int *e)
    27 {
    28     //注意:先判断栈是否为空
    29     pNode p;
    30     if(S->count == 0)
    31             return 0;
    32      *e = S->top->data;
    33     p = S->top;
    34     S->top=S->top->next;
    35     free(p);//pop必须要释放节点
    36     S->count--;
    37     return 0;
    38 }

     

转载于:https://www.cnblogs.com/richard-meng/p/4702298.html

你可能感兴趣的:(《程序员面试宝典》--栈和堆,局部变量和全局变量)