《动态分配内存》ppt课件_第1页
《动态分配内存》ppt课件_第2页
《动态分配内存》ppt课件_第3页
《动态分配内存》ppt课件_第4页
《动态分配内存》ppt课件_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1第7讲 动态分配内存本讲内容:本讲内容:(1)前往指针值的函数前往指针值的函数(2)动态内存分配函数动态内存分配函数(3)动态数组的实现动态数组的实现26.2.2 前往指针值的函数l函数的前往值可以是一个指针类型的数据函数的前往值可以是一个指针类型的数据( (即地址即地址) )前往指针值函数的定义格式前往指针值函数的定义格式: : 函数类型函数类型 * * 函数名函数名( ( 形参列表形参列表 ) ) 函数体函数体; ; 阐明阐明: :定义一个前往指针值的函数与定义普通函数的格式根本定义一个前往指针值的函数与定义普通函数的格式根本 类似类似, ,只是在函数名前加只是在函数名前加 * * ,

2、, 阐明该函数前往一个指针值阐明该函数前往一个指针值例例: int * fun ( int a , int b ) 函数体函数体 ; 3例例2 2 求某班成果的平均分求某班成果的平均分要求用前往指针值的函数实现要求用前往指针值的函数实现分析分析: :经过函数经过函数averageaverage的前往值的前往值得到保管平均分变量的地址得到保管平均分变量的地址, , 进而得到平均分进而得到平均分, , 函数中将函数中将平均分变量定义成静态的平均分变量定义成静态的, , 这样函数终了后该变量依然这样函数终了后该变量依然存在。存在。mainpaverageaver1静态静态aver&aver1

3、&aver1816.2.2 前往指针值的函数4void 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); s

4、um=sum+s; aver1=sum/n; return(aver);56.6 指针与动态内存分配动态内存分配动态内存分配(Dynamic Memory Allocation)(Dynamic Memory Allocation)在程序运转时为程序分配内存的一种方法在程序运转时为程序分配内存的一种方法 什么时候需求运用动态内存分配?什么时候需求运用动态内存分配?例例: : 计算某班英语成果的平均分计算某班英语成果的平均分, ,要求保管每个学生的成果要求保管每个学生的成果, ,而学而学生人数由键盘输入生人数由键盘输入int a60;int n, i;scanf(%d, &n);for(

5、i=0; in; i+) scanf(%d, &ai);必需将数组定义的足够大!必需将数组定义的足够大!假设输入的假设输入的n较小较小(15),那么数组,那么数组有多数以上的存储空间被浪费了有多数以上的存储空间被浪费了我们希望在输入我们希望在输入n n后后, ,根据实践根据实践的人数定义一个动态数组的人数定义一个动态数组, ,这样这样不会浪费存储空间不会浪费存储空间66.6.2 动态内存分配和释放函数ANSI C规范定义了规范定义了3个动态内存分配函数个动态内存分配函数1. malloc( )函数函数函数原型:函数原型:void *malloc( unsigned int size);

6、作用作用: 在内存开辟一个长度为在内存开辟一个长度为 size 个字节的延续的存储空间个字节的延续的存储空间, 前往一个指向该存储区首地址的指针,假设系统不能提供足前往一个指向该存储区首地址的指针,假设系统不能提供足够的内存单元够的内存单元(分配失败分配失败), 函数将前往空指针函数将前往空指针NULL阐明:阐明:void * 是一种指针类型是一种指针类型, 称为无类型指针称为无类型指针, 常用来阐明其基类常用来阐明其基类型未知的指针型未知的指针, 即声明一个指针变量即声明一个指针变量, 但不指定它指向哪一种但不指定它指向哪一种详细类型的数据详细类型的数据需求需求#include stdlib

7、.h7int *p=NULL;double *q=NULL;p= (int *) malloc (4);q= (double *) malloc ( sizeof(double) );*p=36;*q=45.8;运用运用malloc函数时函数时, 必需用强迫类型转换将必需用强迫类型转换将前往的指针值转换回所需求的数据类型前往的指针值转换回所需求的数据类型, 然后然后再进展赋值操作再进展赋值操作定义指针变量通常将定义指针变量通常将其初始化为空指针其初始化为空指针恳求一个长度为恳求一个长度为4个字节的存储空间个字节的存储空间, 并将其首地址赋给并将其首地址赋给int型的指针变量型的指针变量, 那么

8、该空间可存放那么该空间可存放int型数据型数据强迫类型转换强迫类型转换假设不知道某种类型数据假设不知道某种类型数据所占内存空间的字节数所占内存空间的字节数, 可用可用sizeof( )进展计算进展计算6.6.2 动态内存分配和释放函数8int *p=NULL;double *q=NULL;p= (int *) malloc (4);q= (double *) malloc ( sizeof(double) );*p=36;*q=45.8;360 x00371000NULLq45.80 x00371048NULLp0 x003710480 x003710006.6.2 动态内存分配和释放函数92

9、. calloc( )函数函数函数原型:函数原型:void *calloc(unsigned int num,unsigned int size);作用作用: 给假设干同一类型的数据项分配延续的存储空间给假设干同一类型的数据项分配延续的存储空间, 其中其中每个数据项的长度单位为字节每个数据项的长度单位为字节, 假设函数调用胜利假设函数调用胜利, 前往一个前往一个指向该存储区的首地址指向该存储区的首地址, 假设函数调用失败前往空指针假设函数调用失败前往空指针NULL阐明:阐明:参数参数num表示向系统恳求的存储空间的数量表示向系统恳求的存储空间的数量参数参数size表示每个存储空间所占的字节数表

10、示每个存储空间所占的字节数6.6.2 动态内存分配和释放函数10例:例:float *p=NULL;p=(float *) calloc (10, sizeof(float);恳求恳求10个延续的个延续的float型的存储单元型的存储单元, 并将其首地址赋给并将其首地址赋给float型型的指针变量的指针变量, 该存储空间总的字节数为该存储空间总的字节数为10sizeof(float)显然,用显然,用calloc( )函数开辟的存储空间相当于一个一维数组函数开辟的存储空间相当于一个一维数组, 第第1个参数决议了一维数组的大小个参数决议了一维数组的大小, 第第2个参数决议了数组元素个参数决议了数组

11、元素的类型的类型, 函数的前往值就是数组的首地址函数的前往值就是数组的首地址2. calloc( )函数函数6.6.2 动态内存分配和释放函数11函数原型函数原型 : void free( void *p );作用作用: 释放动态恳求的由指针变量释放动态恳求的由指针变量p所指向的存储空间,所指向的存储空间,该函数无前往值该函数无前往值 3. free( )函数函数阐明:阐明:参数参数p的值不是恣意的地址的值不是恣意的地址, 必需是程序中执行必需是程序中执行malloc或或calloc函数所前往的地址函数所前往的地址 p是普通指针是普通指针(void *), 但调用但调用free函数时不需求进展

12、强迫函数时不需求进展强迫类型转换类型转换, 计算机系统会自动转换计算机系统会自动转换 该函数执行后该函数执行后, 将指针将指针p所指向的存储空间交还给系统所指向的存储空间交还给系统,系统可再重新分配系统可再重新分配6.6.2 动态内存分配和释放函数121233. free( )函数函数例:例:int i, *p=NULL;p=(int *) calloc (3, sizeof(int) );for(i=0; i3; i+) *(p+i)=i+1;free(p); NULLp2021202120212021留意:留意:free函数释放的是函数释放的是p所指向的所指向的动态存储空间动态存储空间,

13、变量变量p并没有被释放并没有被释放for(i=0; i3; i+) printf(%d, *(p+i);能否有输能否有输出?出?6.6.2 动态内存分配和释放函数13动态数组的实现例例3: 计算某班英语成果平均分计算某班英语成果平均分(用一维动态数组实现用一维动态数组实现)#include#includevoid main( ) int n, i, *p=NULL; float sum=0, ave; scanf(%d, &n); p=(int *)calloc(n, sizeof(int); if (p=NULL) printf(n Not enough memory!n); exit(0); for( i=0

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论