C语言中的存储空间和变量
一.存储空间
1. 静态储存区
a. bss:未初始化的全局变量和静态变量
b.data:初始化后的全局变量和静态变量
2.动态存储区
a.常量区:用于存放常量和字符串
b.栈:由编译器分配和释放的内存空间,用于存储函数参数和普通变量例:局部变量等。c. 堆:动态内存区,有程序员手动释放;如果程序员不释放,则可能由OS回收;并且,堆里的所有东西都是匿名的,不能有名字取查找,只能由指针去指向。
栈:栈是先进后出的;但注意一下满栈和空栈的情况:a.满栈:入栈,先移动指针后存入数据;出栈是先出数据在移动指针;(因为满栈下指针指向的位置是已经用的位置)b.空栈:入栈,先出数据后后移动指针;出栈是先移动指针后出数据。
#include<stdio.h>
struct student
{
int num;
int name;
};
int main()
{
struct student*p;
p=(struct student*)malloc(sizeof(struct student));
/*如果改为
struct student p;
p=(struct student)malloc(sizeof(struct student));
则错了
*/
}
二. 变量
2.局部变量(动态变量):
定义在函数体内的变量(形参也是局部变量),离开该函数再调用则无效;每次调用时都从零开始,不保存原有数据。
3.全局变量(静态变量):
定义在所以函数外部的变量(一般写在开头,因为程序是依次执行的),作用域是整个程序,包过.c和.h文件。 插入链表的三种方法 插入链表的三种方法
#include<stdio.h>
int a=100;//全局变量
void fun1()
{
int n,m,q;//局部变量
printf("请输入m的值");
scanf("%d,%d",&m,&q);//注意:如果是在gc++编译器里编译的话,输入格式必须为%d,%d的格式,不然会出错。
n=m+a*q;
printf("n=%d",n);
printf("b is %d",b);//这里的b在下边才被执行到,所以这里不能输出的
}
int b=99;//全局变量
void fun2()
{
printf("b is %d",b);
}
二.插入链表的三种方法
什么是链表?
1.是动态的进行储存分配的一种结构,和数组相比,它不用事先去确定存储空间,而是根据需要开辟单元,也就是说链表其实是一个功能极为强大的数组,它可以在节点中定义多种类型,也可以根据需要随意增添和删除,插入节点。
2.单向链表:一环扣一环的(利用指针);节点分为数据域(用于存放各种数据)和指针域(用于存放下一个节点的位置);头节点只有指针区域没有数据区域,是一个指针变量;二尾节点的指针是空指针(代表没有下一个节点了)。
3.这样看来,就清晰了,链表就像车链子一样,第一个元素指向第二个,第二个指向第三个....
1.头插入
顾名思义,就是将要节点插入到链表的第一个;
void student(student*(&L))//传过来的是链表
{
student*s;//定义一个节点
L->next=NULL;//将头指针置零
s->next=L-next//将L的后继节点赋值给s的后继节点
L-next=s//将s的值赋值给L的后继节点
}
2.尾插入
void W(student*(&L),int n, DataType)//链表和节点数和数据
{
int j=0;
student*s;
student*r;
r=L;//r指向头节点
s=Locate_student(L,n)//找到尾指针
r-next=s;
s=r;
}
3. 中间插入
利用之间值代换
void ZJ(student*(&L),int n,DataType x)
{
struct student *p,*q;
p=Locate_student(L,n-1)//找到第n-1个节点
if(!p)
{
printf("n有误");
return 0;
}
q=(student*)malloc(sizeof(student));
if(!q)
{
printf("申请空间失败");
return 0;
}
q->data=x;
q-next=p->next;
p->next=q;
return (1);
}
本文内容转载至: http://blog.qmgua.com/?id=154
原文链接:http://blog.qmgua.com/?id=154