第7讲 动态分配内存.pptVIP

  • 2
  • 0
  • 约 14页
  • 2017-08-12 发布于河南
  • 举报
6.2.2 返回指针值的函数 6.2.2 返回指针值的函数 6.6 指针与动态内存分配 动态数组的实现 * * * 第7讲 动态分配内存 本讲内容: (1)返回指针值的函数 (2)动态内存分配函数 (3)动态数组的实现 函数的返回值可以是一个指针类型的数据(即地址) 返回指针值函数的定义格式: 函数类型 * 函数名( 形参列表 ) { 函数体; } 说明:定义一个返回指针值的函数与定义普通函数的格式基本 类似,只是在函数名前加 * , 表明该函数返回一个指针值 例: int * fun ( int a , int b ) { 函数体 ; } 例2 求某班成绩的平均分 要求用返回指针值的函数实现 分析: 通过函数average的返回值得到保存平均分变量的地址, 进而得到平均分, 函数中将平均分变量定义成静态的, 这样函数结束后该变量仍然存在。 main p average aver1静态 aver aver1 aver1 81 void main( ) { int n; float *p; printf(input n:); scanf(%d,n); p=average(n); printf(ave=%6.2f, , *p); } 例2 程序代码 静态局部变量 float *average(int n) { int i; float s, *aver, sum=0; static float aver1; aver=aver1; for(i=1; i=n; i++) { printf(input s:); scanf(%f, s); sum=sum+s; } aver1=sum/n; return(aver); } 动态内存分配(Dynamic Memory Allocation) 在程序运行时为程序分配内存的一种方法 什么时候需要使用动态内存分配? 例: 计算某班英语成绩的平均分,要求保存每个学生的成绩,而学生人数由键盘输入 int a[60]; int n, i; scanf(%d, n); for(i=0; in; i++) scanf(%d, a[i]); 必须将数组定义的足够大! 如果输入的n较小(15),那么数组有多数以上的存储空间被浪费了 我们希望在输入n后,根据实际 的人数定义一个动态数组,这样 不会浪费存储空间 6.6.2 动态内存分配和释放函数 ANSI C标准定义了3个动态内存分配函数 1. malloc( )函数 函数原型:void *malloc( unsigned int size); 作用: 在内存开辟一个长度为 size 个字节的连续的存储空间, 返回一个指向该存储区首地址的指针,若系统不能提供足够的内存单元(分配失败), 函数将返回空指针NULL 说明: void * 是一种指针类型, 称为无类型指针, 常用来说明其基类型未知的指针, 即声明一个指针变量, 但不指定它指向哪一种具体类型的数据 需要#include stdlib.h int *p=NULL; double *q=NULL; p= (int *) malloc (4); q= (double *) malloc ( sizeof(double) ); *p=36; *q=45.8; 使用malloc函数时, 必须用强制类型转换将返回的指针值转换回所需要的数据类型, 然后再进行赋值操作 定义指针变量通常将其初始化为空指针 申请一个长度为4个字节的存储空间, 并将其首地址赋给int型的指针变量, 则该空间可存放int型数据 强制类型转换 如果不知道某种类型数据所占内存空间的字节数, 可用sizeof( )进行计算 6.6.2 动态内存分配和释放函数 int *p=NULL; double *q=NULL; p= (int *) malloc (4); q= (double *) malloc ( sizeof(double) ); *p=36; *q=45.8; 36 0NULL q 45.8 0NULL p 006.6.2 动态内存分配和释放函数 2. calloc( )函数 函数原型: void *calloc(unsigned int num,unsigned int size); 作用: 给若干同一类型的数据项分配连续的存储空间, 其中每个数据项的长度单位为字节, 若函数调用成功, 返回一个指向该存储区的首地址

文档评论(0)

1亿VIP精品文档

相关文档