C语言
中不允许动态数组类型。
例如:
int n;
scanf("%d",&n);
int a[n];
用变量表示长度,想对数组的大小作动态说明,这是错误的。但是在实际的编程中,往
往会发生这种情况,即所需的内存空间取决于实际输入的数据,而无法预先确定。对于这种
问题,用数组的办法很难解决。为了解决上述问题,C语言提供了一些内存管理函数,这些
内存管理函数可以按需要动态地分配内存空间,也可把不再使用的空间回收待用,为有效地
利用内存资源提供了手段。
常用的内存管理函数有以下三个:
1. 分配内存空间函数 malloc
调用形式:
(类型说明符*)malloc(size)
功能:在内存的动态存储区中分配一块长度为"size"字节的连续区域。函数的返回值为
该区域的首地址。
“类型说明符”表示把该区域用于何种数据类型。
(类型说明符*)表示把返回值强制转换为该类型指针。
“size”是一个无符号数。
例如:
pc=(char *)malloc(100);
表示分配 100 个字节的内存空间,并强制转换为字符数组类型,函数的返回值为指向该
字符数组的指针,把该指针赋予指针变量 pc。
2. 分配内存空间函数 calloc
calloc 也用于分配内存空间。
调用形式:
(类型说明符*)calloc(n,size)
功能:在内存动态存储区中分配 n 块长度为“size”字节的连续区域。函数的返回值
为该区域的首地址。
(类型说明符*)用于强制类型转换。
calloc 函数与 malloc 函数的区别仅在于一次可以分配 n 块区域。
例如:
ps=(struet stu*)calloc(2,sizeof(struct stu));
其中的 sizeof(struct stu)是求 stu 的结构长度。因此该语句的意思是:按 stu 的长度
分配 2 块连续区域,强制转换为 stu 类型,并把其首地址赋予指针变量 ps。
2. 释放内存空间函数 free
调用形式:
free(void*ptr);
功能:释放 ptr 所指向的一块内存空间,ptr 是一个任意类型的指针变量,它指向被释
放区域的首地址。被释放区应是由 malloc 或 calloc 函数所分配的区域。
【例 11.8】分配一块区域,输入一个学生数据。
main()
{
struct stu
{
int num;
char *name;
char sex;
float score;
} *ps;
ps=(struct stu*)malloc(sizeof(struct stu));
ps->num=102;
ps->name="Zhang ping";
ps->sex="M";
ps->score=62.5;
printf("Number=%d
Name=%s
",ps->num,ps->name);
printf("Sex=%c
Score=%f
",ps->sex,ps->score);
free(ps);
}
本例中,定义了结构 stu,定义了 stu 类型指针变量 ps。然后分配一块 stu 大内存区,
并把首地址赋予 ps,使 ps 指向该区域。再以 ps 为指向结构的指针变量对各成员赋值,并用
printf 输出各成员值。最后用 free 函数释放 ps 指向的内存空间。整个程序包含了申请内存
空间、使用内存空间、释放内存空间三个步骤,实现存储空间的动态分配。
11.9 链表的概念
在例 7.8 中采用了动态分配的办法为一个结构分配内存空间。每一次分配一块空间可用
来存放一个学生的数据,我们可称之为一个结点。有多少个学生就应该申请分配多少块内存
空间,也就是说要建立多少个结点。当然用结构数组也可以完成上述工作,但如果预先不能
准确把握学生人数,也就无法确定数组大小。而且当学生留级、退学之后也不能把该元素占
用的空间从数组中释放出来。
用动态存储的方法可以很好地解决这些问题。有一个学生就分配一个结点,无须预先确
定学生的准确人数,某学生退学,可删去该结点,并释放该结点占用的存储空间。从而节约
了宝贵的内存资源。另一方面,用数组的方法必须占用一块连续的内存区域。而使用动态分
配时,每个结点之间可以是不连续的(结点内是连续的)。结点之间的联系可以用指针实现。 即
在结点结构中定义一个成员项用来存放下一结点的首地址,这个用于存放地址的成员,常把
它称为指针域。
可在第一个结点的指针域内存入第二个结点的首地址,在第二个结点的指针域内又存放
第三个结点的首地址,如此串连下去直到最后一个结点。最后一个结点因无后续结点连接,
其指针域可赋为 0。这样一种连接方式,在数据结构中称为“链表”。
下图为最一简单链表的示意图。
图中,第 0 个结点称为头结点,它存放有第一个结点的首地址,它没有数据,只是一个
指针变量。以下的每个结点都分为两个域,一个是数据域,存放各种实际的数据,如学号 num,
姓名 name,性别 sex 和成绩 score 等。另一个域为指针域,存放下一结点的首地址。链表中
的每一个结点都是同一种结构类型。
例如,一个存放学生学号和成绩的结点应为以下结构:
struct stu
{ int num;
int score;
struct stu *next;
}
前两个成员项组成数据域,后一个成员项 next 构成指针域,它是一个指向 stu 类型结构
的指针变量。
链表的基本操作对链表的主要操作有以下几种:
1. 建立链表;
2. 结构的查找与输出;
3. 插入一个结点;
4. 删除一个结点;
下面通过例题来说明这些操作。
【例 11.9】建立一个三个结点的链表,存放学生数据。为简单起见, 我们假定学生数据结
构中只有学号和年龄两项。可编写一个建立链表的函数 creat。程序如下:
#define NULL 0
#define TYPE struct stu
#define LEN sizeof (struct stu)
struct stu
{
int num;
int age;
struct stu *next;
};
TYPE *creat(int n)
{
struct stu *head,*pf,*pb;
int i;
for(i=0;inum,&pb->age);
if(i==0)
pf=head=pb;
else pf->next=pb;
pb->next=NULL;
pf=pb;
}
return(head);
}
在函数外首先用宏定义对三个符号常量作了定义。这里用 TYPE 表示 struct stu,用 LEN
表示 sizeof(struct stu)主要的目的是为了在以下程序内减少书写并使阅读更加方便。结构
stu 定义为外部类型,程序中的各个函数均可使用该定义。
creat 函数用于建立一个有 n 个结点的链表,它是一个指针函数,它返回的指针指向 stu
结构。在 creat 函数内定义了三个 stu 结构的指针变量。head 为头指针,pf 为指向两相邻结
点的前一结点的指针变量。pb 为后一结点的指针变量。
11.10 枚举类型
在实际问题中,有些变量的取值被限定在一个有限的范围内。
小说推荐
- 星卡设计师:开局设计火伊布
- 苏洛花8700万拍下了限量青眼白龙卡牌,遭到了全网嘲讽,没想到,竟然真的召唤出了青眼白龙 这是个类似女武神的世界观,神族以圣战的方式,决定人族的去留 所谓圣战,便是在人类中挑选出九名最强星卡师,与诸神中的九位主神展开对决,若是人类能赢五场,便让人族延续千年 于是青眼白龙从各个星球中挑选有天赋的星卡师
- 玄幻小说箫锦鲤连载中
- 最新章:新书发了
- 亲爱的,你被我设计了!
- 作者所写的《亲爱的,你被我设计了》无弹窗免费全文阅读为转载作品,章节由网友发布
- 都市言情未知连载中
- 最新章:page 32
- 乌龙设计师
- 因为身边没有亲人,袁婉绿早就学会独立自主,也养成了凡事自己来、从不依靠别人的习惯!没想到这个才见第二次面的室内设计师,居然会这么关心她,不但陪着她到医院就诊,而且还因为担心她会发烧、家里没人照料,主动表示愿意让她到他家借住…天底下怎么会有这么好心的人啊?真是令人感动—见鬼了!她只是在向他道谢而已,他
- 都市言情未知连载中
- 最新章:第18章
- 亲爱的你被我设计了
- 原来我被他们联合起来设计了,正在我似梦非梦无法从惊奇中清醒过来时,只听到罗斌在耳边悄悄问:亲爱的,你喜不喜欢我的设计 作者:雨醉霜浓所写的《亲爱的你被我设计了》无弹窗免费全文阅读为转载作品,章节由网友发布
- 都市言情雨醉霜浓完本
- 最新章:尾声
- 人生设计在童年
- 人生设计在童年作者[美]高燕定广西师范大学出版社出版 序言 新东方教育集团文化研究院院长徐小平 我是在2003年5月底在美国休斯敦见到高燕定先生的。我去休斯敦看望一个多年不见的老友。朋友说有一个高燕定先生,在教育方面很有见地,希望我们能够见面认识 见到高燕定先生,真使我有相见恨晚之感。高先生在20世
- 现代文学未知连载中
- 最新章:第67章
- 冒牌设计师
- 新书《傲临都市》已经上传,望新老朋友多多支持,新书要冲个小榜,求收藏,求推荐 拜谢!新书书号3127811 作者:吾爱杨所写的《冒牌设计师》无弹窗免费全文阅读为转载作品,章节由网友发布
- 穿越架空吾爱杨完本
- 最新章:第二六零章 成就!黄粱一梦?(大结局)
- 王牌设计师
- 新书:神灵纪。书号:1365414【起点第二编辑组荣誉出品】他,天资平庸,然而一夜之间拥有王牌设计师的头脑,任何设计都难不倒他.建筑设计 服装设计?广告设计?这些通通都是小菜!但是他却有着一个改不过来的毛病,那就是一旦扯上和女人沾边的事儿,就会犯傻.比如说,有美女脱光衣服送上门来,他也不知道下手…群
- 都市言情爱上云的风完本
- 最新章:想说的话以及关于新书
- 超人气设计
- 《超人气设计》作者:沈娆(VIP手打完结)_TXT下载她只是个小裁缝的女儿,异能不多不少,刚够实现她的梦想,偶然的机遇让她闯进了光怪陆离五彩斑斓的时尚圈,成为一名新晋时装设计师。生存在白天鹅群中,她如何才能破茧成蝶,一飞冲天 作者:所写的《超人气设计》无弹窗免费全文阅读为转载作品,章节由网友发布
- 都市言情未知连载中
- 最新章:第125章
- 命运设计师
- [都市异能《命运设计师》作者:独爱金秋【第一部完结】一个想救出父母的少年,无意间拯救了世界~一面魂镜,控制无数人的命运。一位总师,设计着所有人的蓝图。你的命运其实早就被安排好了,不管你如何改变,都是我想让你改变的,某设计师如是说。第一卷:幻境奇缘第一章:魂镜之母上 公元前221年,秦始皇率军占领齐国
- 玄幻小说未知连载中
- 最新章:第141章