内容正文:
项目八 指针
1
C语言程序设计基础
知识目标
掌握指针变量的定义与使用
掌握通过指针变量来引用数组
掌握通过指针变量来引用字符串
掌握指针数组
了解函数指针与指针函数
了解动态内存分配与指向它的指针变量
技能目标
学会指针变量的定义与使用
学会通过指针变量来引用数组
学会通过指针变量来引用字符串
学会指针数组的定义与使用
思政目标
培养全局观,大局意识
培养沟通能力与协调能力
2
任务6
——动态内存分配与指向它的指针变量
3
C语言允许建立内存动态分配区域,以存放一些临时用的数据,这些数据不必在程序的声明部分定义,也不必等到函数结束时才释放,而是需要时随时开辟,不需要时随时释放。这些数据是临时存放在一个特别的自由存储区,称为堆(heap)区。可以根据需要,向系统申请所需大小的空间。由于未在声明部分定义它们为变量或数组,因此不能通过变量名或数组名去引用这些数据,只能通过指针来引用。
指针——进阶篇
6.1什么是内存的动态分配
4
对内存的动态分配是通过系统提供的库函数来实现的,主要有malloc , calloc, free,realloc这4个函数。
1. 用malloc函数开辟动态存储区
其函数原型为
void *malloc(unsigned int size) ;
其作用是在内存的动态存储区中分配一个长度为size的连续空间。形参size的类型定为无符号整型(不允许为负数)。此函数的值(即“返回值”)是所分配区域的第一个字节的地址,或者说,此函数是一个指针型函数,返回的指针指向该分配域的第一个字节。
指针——进阶篇
6.1怎么建立内存的动态分配
5
2.用calloc函数开辟动态存储区
其函数原型为
void * calloc(unsigned n,unsigned size) ;
其作用是在内存的动态存储区中分配n个长度为size的连续空间,这个空间一般比较大,足以保存一个数组。
指针——进阶篇
6
3.用realloc函数重新分配动态存储区
其函数原型为
void *realloc(void * p,unsigned int size);
如果已经通过malloc函数或calloc函数获得了动态空间,想改变其大小,可以用recalloc函数重新分配。
用realloc函数将p所指向的动态空间的大小改变为size。p的值不变。如果重分配不成功,返回NULL。
指针——进阶篇
7
4.用free函数释放动态存储区
其函数原型为
void free(void * p) ;
其作用是释放指针变量p所指向的动态空间,使这部分空间能重新被其他变量使用。p应是最近一次调用calloc 或malloc函数时得到的函数返回值。
以上4个函数的声明在stdlib.h头文件中,在用到这些函数时应当用“#include <stdlib. h>"指令把stdlib.h头文件包含到程序文件中。
指针——进阶篇
8
【例8-17】建立动态数组,输入5个学生的成绩,另外用一个函数检查其中有无不及格分数的,输出不合格的成绩。
【解题思路】用malloc函数开辟一个动态自由区域,用来存5个学生的成绩,会得到这个动态域第1个字节的地址,它的基类型是void型。用一个基类型为float的指针变量score来指向动态数组的各元素,并输出它们的值。但必须先把malloc函数返回的void指针转换为单精度实型指针,然后赋给score。
指针——进阶篇
9
【程序代码】
指针——进阶篇
10
【运行结果】
指针——进阶篇
11
任务7
——学生信息管理系统
提高篇
12
【管理系统7-1】修改管理系统6-1,使inputScore()函数不返回值,直接可以更新学生成绩。
指针——提高篇
13
【程序代码】
utils.h:
指针——提高篇
14
studentInfo.h:
15
【运行结果】
指针——提高篇
16
【管理系统7-2】定义queryByName()函数,接收主函数传递过来的姓名字符数组,由用户输入姓名,查询学生信息是否存在。
指针——提高篇
17
【程序代码】
指针——提高篇
18
19
【运行结果】
指针——提高篇
20
$$