c语言课件第8章_第1页
c语言课件第8章_第2页
c语言课件第8章_第3页
c语言课件第8章_第4页
c语言课件第8章_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

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

文档简介

1、Question Time2022/9/271#include #include #include #include int main() int n, sel; unsigned seed = time(NULL);/获得当前系统时间,作为种子 srand(seed); /调用种子函数,为rand()设置生成伪随机数的种子 printf(随机提问程序准备就绪!nn请问需要几位同学回答问题?n=); scanf(%d, &n); while (n0) n-; while (sel=rand()%71 )=4006);/学号从3888开始 printf(n这次要回答提问的同学是: 2332012

2、220%4dn, sel); if (n0) printf(n还有%d位同学,按任意键继续n, n); getch(); /接受输入但不回显 printf(n提问完毕!n); return 0;作业 1下列代码的运行结果是什么?int fun(int a, int b) static int n=0,i=2; i=n+1; n=i+a-b; return n;void main() int x=5,y=3,s,j; for(j=0;j3;j+) s=fun(x , y ); printf(“%d”,s); 作业 2下列代码的运行结果是什么?#includeint main() int i,a5

3、;for(i=0;i2)%5;for(i=4;i=0;i-)printf(%d,ai);作业 3下列代码的运行结果是什么?用语句scanf(“%c%c%c”,&c1,&c2,&c3)输入abc时,变量c1,c2,c3的值分别为_,_,_。输入abc时,变量c1,c2,c3的值又分别为_,_,_。作业 4下列代码的运行结果是什么?输入12345ab,表示回车#includeint main()int x;float y;scanf(%3d%f,&x,&y);printf(%d,%f,x,y);作业 5下列代码的运行结果是什么?#includeint main() unsigned int a=6

4、;int b=-20;(a+b6)?puts(“6):puts(“6”);8.8 动态内存分配与指向它的指针变量8.8.1 什么是内存的动态分配8.8.2 怎样建立内存的动态分配8.8.3 void指针类型8.8.1静态内存分配的弊端为数组分配固定大小的内存称为静态数组无法预先确定要使用多大的数组?那就定义一个足够大的!例如一个存储人名的字符数组,能存4个汉字张飞 Accept, 刘玄德 Accept, 诸葛孔明 Accept乔伊亚历山大比基卡利斯勒达夫埃利奥特福克斯伊维鲁莫马尔尼梅尔斯帕特森汤普森华莱士普雷斯顿,Runtime Error!定长很可能意味着(1)浪费空间(2)空间不足2022

5、/9/27第八章 善于利用指针8所谓动态内存分配就是指在程序执行的过程中根据需要动态地分配或者回收存储空间的分配内存的方法由于动态分配不需要预先分配存储空间,而且分配的空间还可以根据程序的需要扩大或缩小,因此可以解决静态内存分配所带来的种种弊端8.8.1什么是内存的动态分配2022/9/279第八章 善于利用指针内存的动态存储区内存的动态存储区分为两个部分:堆、栈堆(动态分配):由malloc系列函数分配的内存,生命周期由free函数决定。在没有free之前一直存在,直到程序结束。栈:保存局部变量。栈上的内容只在函数的范围内存在;当函数运行结束,自动被销毁2022/9/2710如何实现动态内存

6、管理C语言编译系统的库函数提供一系列用于实现动态内存管理的库函数ANSI标准建议的4个相关函数malloc:memory allocationcalloc:contiguous memory allocationrealloc:re-allocationfree2022/9/2711以上4个函数的声明在stdlib.h头文件中,在用到这些函数时应当用 “#include ” 指令把stdlib.h头文件包含到程序文件中stdlib.h头文件2022/9/2712第八章 善于利用指针8.8.2 怎样建立内存的动态分配malloc函数其函数原型为 void *malloc(unsigned int

7、 size); 其作用是在内存的动态存储区中分配一个长度为size的连续空间函数的值是所分配区域的第一个字节的地址,或者说,此函数是一个指针型函数,返回的指针指向该分配域的开头位置8.8.2 怎样建立内存的动态分配 malloc(100);开辟100字节的临时分配域,函数值为其第1个字节的地址 注意指针的基类型为void,即不指向任何类型的数据,只提供一个地址如果此函数未能成功地执行(例如内存空间不足),则返回空指针(NULL)8.8.2 怎样建立内存的动态分配2calloc函数其函数原型为 void *calloc(unsigned n,unsigned size); 其作用是在内存的动态存

8、储区中分配n个长度为size的连续空间,这个空间一般比较大,足以保存一个数组。8.8.2 怎样建立内存的动态分配用calloc函数可以为一维数组开辟动态存储空间,n为数组元素个数,每个元素长度为size。这就是动态数组。函数返回指向所分配域的起始位置的指针;如果分配不成功,返回NULL。如: p=calloc(50,4); 开辟504个字节的临时分配域,把起始地址赋给指针变量p 8.8.2 怎样建立内存的动态分配3free函数其函数原型为 void free(void *p); 其作用是释放指针变量所指向的动态空间,使这部分空间能重新被其他变量使用。p应是最近一次调用calloc或malloc

9、函数时得到的函数返回值。8.8.2 怎样建立内存的动态分配 free(p);释放指针变量所指向的已分配的动态空间 free函数无返回值8.8.2 怎样建立内存的动态分配4. realloc函数其函数原型为void *realloc(void *p,unsigned int size);如果已经通过malloc函数或calloc函数获得了动态空间,想改变其大小,可以用recalloc函数重新分配。8.8.2 怎样建立内存的动态分配用realloc函数将p所指向的动态空间的大小改变为size。p的值不变。如果重分配不成功,返回NULL。如 realloc(p,50); 将p所指向的已分配的动态空间

10、改为50字节 8.8.3 void指针类型 例8.30 建立动态数组,输入5个学生的成绩,另外用一个函数检查其中有无低于60分的,输出不合格的成绩。8.8.3 void指针类型 解题思路:用malloc函数开辟一个动态自由区域,用来存5个学生的成绩,会得到这个动态域第一个字节的地址,它的基类型是void型。用一个基类型为int的指针变量p来指向动态数组的各元素,并输出它们的值。但必须先把malloc函数返回的void指针转换为整型指针,然后赋给p1#include #include int main() void check(int *); int *p1,i; p1=(int *)mallo

11、c(5*sizeof(int); for(i=0;i5;i+) scanf(%d,p1+i); check(p1); return 0;void check(int *p) int i; printf(They are fail:); for(i=0;i5;i+) if (pi60) printf(%d ,pi); printf(n); 8.9有关指针的小结 1.首先要准确地弄清楚指针的含义。指针就是地址,凡是出现“指针”的地方,都可以用“地址”代替,例如,变量的指针就是变量的地址,指针变量就是地址变量要区别指针和指针变量。指针就是地址本身,而指针变量是用来存放地址的变量。8.9有关指针的小结

12、 2. 什么叫“指向”?地址就意味着指向,因为通过地址能找到具有该地址的对象。对于指针变量来说,把谁的地址存放在指针变量中,就说此指针变量指向谁。但应注意:只有与指针变量的基类型相同的数据的地址才能存放在相应的指针变量中。8.9有关指针的小结 void *指针是一种特殊的指针,不指向任何类型的数据,如果需要用此地址指向某类型的数据,应先对地址进行类型转换。可以在程序中进行显式的类型转换,也可以由编译系统自动进行隐式转换。无论用哪种转换,读者必须了解要进行类型转换8.9有关指针的小结 3. 要深入掌握在对数组的操作中怎样正确地使用指针,搞清楚指针的指向。一维数组名代表数组首元素的地址8.9有关指

13、针的小结 int *p,a10; p=a;p是指向int类型的指针变量,p只能指向数组中的元素,而不是指向整个数组。在进行赋值时一定要先确定赋值号两侧的类型是否相同,是否允许赋值。对“p=a;”,准确地说应该是:p指向a数组的首元素8.9有关指针的小结 4.有关指针变量的定义形式的归纳比较,见教材表8.4。8.9有关指针的小结5.指针运算指针变量加(减)一个整数例如:p+,p-,p+i,p-i,p+=i,-=i等均是指针变量加(减)一个整数。将该指针变量的原值(是一个地址)和它指向的变量所占用的存储单元的字节数相加(减)。 8.9有关指针的小结5.指针运算(2)指针变量赋值将一个变量地址赋给一

14、个指针变量不应把一个整数赋给指针变量8.9有关指针的小结5.指针运算(3) 两个指针变量可以相减如果两个指针变量都指向同一个数组中的元素,则两个指针变量值之差是两个指针之间的元素个数 8.9有关指针的小结5.指针运算(4) 两个指针变量比较若两个指针指向同一个数组的元素,则可以进行比较指向前面的元素的指针变量“小于”指向后面元素的指针变量如果p1和p2不指向同一数组则比较无意义8.9有关指针的小结6. 指针变量可以有空值,即该指针变量不指向任何变量,可以这样表示: p=NULL; 杜绝“野指针”理解野指针的“野”野孩子:没人要,没人管,调皮捣蛋野狗:没主人,没有链子拴着,喜欢四处咬人野指针:指向一块不可用内存的指针如何杜绝野指针p?很简单,却很容易被忽略:p=NULL;2022/9/27习题1下列代码有什么问题?该如何修改?2022/9/2737#include #include int main() char string10, str10; int i; for (i=0;

温馨提示

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

最新文档

评论

0/150

提交评论