C程序设计第6章.ppt

上传人:小飞机 文档编号:5426170 上传时间:2023-07-05 格式:PPT 页数:68 大小:561KB
返回 下载 相关 举报
C程序设计第6章.ppt_第1页
第1页 / 共68页
C程序设计第6章.ppt_第2页
第2页 / 共68页
C程序设计第6章.ppt_第3页
第3页 / 共68页
C程序设计第6章.ppt_第4页
第4页 / 共68页
C程序设计第6章.ppt_第5页
第5页 / 共68页
点击查看更多>>
资源描述

《C程序设计第6章.ppt》由会员分享,可在线阅读,更多相关《C程序设计第6章.ppt(68页珍藏版)》请在三一办公上搜索。

1、,C语言程序设计,第6章 指针,第1章 C语言概述,第2章 基本数据类型和运算,第3章 结构化程序设计,第5章 函数,第6章 指针,第7章 复合结构类型,第8章 编译预处理,第4章 数组及字符串,课程概述,附录,6.1 指针的基本概念6.2 指针变量的运算6.3 指向数组元素的指针6.4 指向多维数组的指针变量6.5 指向字符串的指针变量6.6指针型函数6.7指针数组6.8二级指针6.9程序举例6.10用指针进行内存动态分配6.11指针数据类型的总结,第9章 位运算,第10章 文件,指针,第6章,教学目标掌握指针的概念和运算规则掌握用指针访问变量、一维数组和二维数组用指针处理字符串的方法,6.

2、1.1 指针和指针变量,6.1 指针的基本概念,1.指针的概念,2.指针变量,内存单元的编号叫做地址,通常也把这个地址称为“指针”。,6.1.1 指针和指针变量,6.1 指针的基本概念,1.指针的概念,2.指针变量,在语言中,允许用一个变量来存放指针,这种变量称为“指针变量”。,6.1.2 指针变量的定义,1.定义的一般格式,2.举例说明,6.1 指针的基本概念,存储类型 类型说明符*变量名;其中,“*”表示这是一个指针变量,变量名即为定义的指针变量名,类型说明符表示本指针变量所指向的变量的数据类型。一个指针变量只能指向同一种类型的变量,也就是说,不能定义一个既指向一个整型变量又指向一个双精度

3、型变量的指针变量。,6.1.2 指针变量的定义,1.定义的一般格式,2.举例说明,6.1 指针的基本概念,例如:int*m1;表示m1是一个指针变量,它的值是某个整型变量的地址;或者说m1指向一个整型变量。至于m1究竟指向哪一个整型变量,应该由指向m1赋予的地址来决定。再例如:static int*m2;/*m2是指向静态整型变量的指针变量*/float*m3;/*m3是指向浮点型变量的指针变量*/char*m4;/*m4是指向字符型变量的指针变量*/,6.1.3 指针变量赋值,1.变量地址表示方法,2.给指针变量赋地址的方法,语言提供了地址运算符“如:&a表示变量a的地址,&b表示变量b的地

4、址。,6.1 指针的基本概念,3.例6.1,6.1.3 指针变量赋值,1.变量地址表示方法,(1)指针变量初始化的方法。int a;/*定义整型变量a*/int*p=/*将变量a的地址赋给指针p*/,6.1 指针的基本概念,2.给指针变量赋地址的方法,3.例6.1,6.1.3 指针变量赋值,1.变量地址表示方法,【例6.1】用指针变量访问变量中的数据。#includemain()int a,*p;/*定义整型变量a和整型变量指针p*/p=/*输出指针p所指的存储单元的内容*/,6.1 指针的基本概念,2.给指针变量赋地址的方法,3.例6.1,2.取内容运算符*,3.注意事项,取地址运算符“&”

5、是单目运算符,其结合性为自右至左,功能是取变量的地址。在scanf函数中,我们已经认识并使用了&运算符。,1.取地址运算符&,6.2.1 指针运算符,6.2 指针变量的运算,2.取内容运算符*,3.注意事项,取内容运算符“*”是单目运算符,其结合性为自右至左,通过“*”可以存取指针所指的存储单元的内容。在“*”运算符之后跟的变量必须是指针变量。需要注意的是指针运算符“*”和指针变量说明中的指针说明符“*”不是一回事。在指针变量说明中,“*”是类型说明符,表示其后的变量是指针类型。而表达式中出现的“*”则是一个运算符,用以表示指针变量所指的内容。,1.取地址运算符&,6.2.1 指针运算符,6.

6、2 指针变量的运算,2.取内容运算符*,3.注意事项,【例6.2】分析下面程序的运行结果。#includemain()int d,x,*p;/*定义整型变量d、x和整型指针p*/d=10;x=19;p=,1.取地址运算符&,6.2.1 指针运算符,6.2 指针变量的运算,程序的运行结果如下:d=19,2.取内容运算符*,3.注意事项,(1)取地址运算符&表示变量的地址;而取内容运算符*表示指针所指的内容。(2)运算符&只能用于变量和数组元素。(3)*和&都是单目运算符,两者的优先级相同,结合性均是从右到左。(4)&x不能出现在赋值号的左边。(5),因此不能用&取寄存器变量的地址。(6)被赋值的

7、指针变量前不能再加“*”说明符,如写为*p=&a 也是错误的。,1.取地址运算符&,6.2.1 指针运算符,6.2 指针变量的运算,2.取内容运算符*,3.注意事项,【例6.3】通过指针变量访问字符型变量。#includemain()char ch1,ch2;/*定义字符型变量ch1和ch2*/char*p1,*p2;/*定义字符型指针p1和p2*/ch1=A;ch2=B;p1=/*输出指针p1和p2所指的存储单元的内容*/,1.取地址运算符&,6.2.1 指针运算符,6.2 指针变量的运算,程序的运行结果为:A,BA,B,2.指针中加减运算,3.指针变量的关系运算,(1)指针变量初始化赋值时

8、,不要将一个内存地址常量赋给一指针变量。例如:int i=100,x;int*m;:m=,1.赋值运算,6.2.2 指针变量的运算,6.2 指针变量的运算,4.两指针变量相减,2.指针中加减运算,3.指针变量的关系运算,(2)指针变量和一般变量一样,存放在其中的值是可以改变的,也就是说可以改变指针变量的指向,例如:int i,j;int*p1;int*p2;i=c;j=d;p1=上面的程序语句也可以用下面的图来说明。,1.赋值运算,6.2.2 指针变量的运算,6.2 指针变量的运算,赋值运算结果,4.两指针变量相减,2.指针中加减运算,3.指针变量的关系运算,如果此时有如下的赋值表达式:p2=

9、p1;则指针变量p2与p1就指向了同一个对象i,此时的*p2就等价于i,而不再是j了,这种情况可以用如下的图来说明。,1.赋值运算,6.2.2 指针变量的运算,6.2 指针变量的运算,4.两指针变量相减,2.指针中加减运算,3.指针变量的关系运算,再例如,如果执行如下的表达式:*p2=*p1;则此时表示把p1指向的内容赋给p2所指的区域,此时可用下图来表示情形。,1.赋值运算,6.2.2 指针变量的运算,6.2 指针变量的运算,4.两指针变量相减,2.指针中加减运算,3.指针变量的关系运算,(3)如果需要,也可以把数组的首地址赋予指向数组的指针变量。例如:int a8,*pa;pa=a;也可写

10、为:pa=,1.赋值运算,6.2.2 指针变量的运算,6.2 指针变量的运算,4.两指针变量相减,2.指针中加减运算,3.指针变量的关系运算,(4)可以把字符串的首地址赋给指向字符类型的指针变量。例如,把字符串“Hello human”赋给指针变量p,方法如下:char*p;p=Hello human;或用初始化赋值的方法写为:char*p=Hello human;,1.赋值运算,6.2.2 指针变量的运算,6.2 指针变量的运算,4.两指针变量相减,2.指针中加减运算,3.指针变量的关系运算,对于指向数组的指针变量,可以给其加上或减去一个整数n。例如,设p是指向数组m的指针变量,则p+n,p

11、-n,p+,+p,p-,-p都是合法的运算表达式。给指针变量加上或减去一个整数n表示把指针指向的当前位置(指向某数组元素)向前或向后移动n个位置。,1.赋值运算,6.2.2 指针变量的运算,6.2 指针变量的运算,4.两指针变量相减,2.指针中加减运算,3.指针变量的关系运算,指向同一数组的两个指针变量进行关系运算可表示它们所指数组元素之间的关系。例如:p1=p2;/*表示p1和p2指向同一数组元素*/p1p2;/*表示p1处于高地址位置*/p1p2;/*表示p2处于高地址位置*/,1.赋值运算,6.2.2 指针变量的运算,6.2 指针变量的运算,4.两指针变量相减,2.指针中加减运算,3.指

12、针变量的关系运算,4.两指针变量相减,【例6.4】一个关于指针变量关系运算的例子。main()int x,y,z,*max,*min;printf(please input three numbers:n);scanf(%d,%d,%d,1.赋值运算,6.2.2 指针变量的运算,6.2 指针变量的运算,该程序的运行结果如下:please input three numbers:23 34 65the max is:65the min is:23,2.指针中加减运算,4.两指针变量相减,两指针变量也可以进行相减运算,其所得之差是:两个指针所指的数组元素之间相差的元素个数,实际上是两个指针值(地址

13、)相减之差再除以该数组元素的长度(字节数)。例如:p1和p2 是指向同一整型数组的两个指针变量,设p1的值为1100H,p2的值为1050H,由于整型数组每个元素占2个字节,所以p1-p2的结果为(1100H-1050H)/2=25,因此“p1-p2”表示p1和 p2之间相差25个元素。但是,p1和p2不能进行加法运算,因为指针变量相加是毫无意义的。,1.赋值运算,6.2.2 指针变量的运算,6.2 指针变量的运算,3.指针变量的关系运算,2.数组指针变量的说明,3.数组名和数组指针变量作函数参数,第一,一个数组是由连续的一块内存单元组成的。其中的数组名就是这块连续内存单元的首地址。第二,一个

14、数组也是由各个数组元素组成的。第三,数组元素的首地址也是指它所占有的几个内存单元的首地址。,1.几个数组指针变量的关系,6.3 指向数组元素的指针,2.数组指针变量的说明,3.数组名和数组指针变量作函数参数,数组指针变量说明的一般形式为:类型说明符*指针变量名;其中,“类型说明符”表示指针变量所指数组的类型;“*”表示其后的变量是指针变量。用数组指针变量访问数组元素有两种方法:第一种方法为下标法,即用mi形式访问数组元素。第二种方法为指针法,即采用*(pm+i)形式,该方法是用间接访问的方法来访问数组元素。,1.几个数组指针变量的关系,6.3 指向数组元素的指针,2.数组指针变量的说明,3.数

15、组名和数组指针变量作函数参数,【例6.6】采用指针法访问数组元素。#includemain()int m5,i,*pm;pm=m;for(i=0;i5;i+)*pm=i;pm+;pm=m;for(i=0;i5;i+)printf(m%d=%dn,i,*pm);pm+;,1.几个数组指针变量的关系,6.3 指向数组元素的指针,该程序的运行结果如下:m0=0m1=1m2=2m3=3m4=4,2.数组指针变量的说明,3.数组名和数组指针变量作函数参数,【例6.7】与例6.6的本意相同,但是其实现方式不同。#includemain()int m5,i,*pm=m;for(i=0;i5;)*pm=i;p

16、rintf(m%d=%dn,i+,*pm+);,1.几个数组指针变量的关系,6.3 指向数组元素的指针,该程序的运行结果如下:m0=0m1=1m2=2m3=3m4=4,2.数组指针变量的说明,3.数组名和数组指针变量作函数参数,数组名是数组的首地址,实参向形参传送数组名实际上就是传送数组的地址,形参得到该地址后也指向同一数组。指针变量的值也是地址,数组指针变量的值即为数组的首地址,也可作为函数的参数使用。,1.几个数组指针变量的关系,6.3 指向数组元素的指针,2.数组指针变量的说明,3.数组名和数组指针变量作函数参数,【例6.8】编写求五门课程平均成绩的函数,并编写主函数调用该函数。下图所示

17、为对应的N-S流程图。,1.几个数组指针变量的关系,6.3 指向数组元素的指针,2.数组指针变量的说明,3.数组名和数组指针变量作函数参数,程序代码如下:#includefloat aver(float*pm);main()float sco5,av,*sp;int i;sp=sco;printf(n please input 5 scores:n);for(i=0;i5;i+)scanf(%f,1.几个数组指针变量的关系,6.3 指向数组元素的指针,程序的运行结果如下:please input 5 scores:90 45 56 80 100average score is 74.20,6.

18、4 指向二维数组的指针变量,1.二维数组地址的表示方法,2.二维数组的指针变量,语言允许把一个二维数组分解为多个一维数组来处理。因此二维数组m可分解为三个一维数组,即m0、m1、m2。每个一维数组又含有四个元素。例如m0数组,含有m00、m01、m02、m03四个元素。,6.4 指向二维数组的指针变量,1.二维数组地址的表示方法,2.二维数组的指针变量,【例6.9】用不同的方式输出同一数组元素的数据值的应用举例。#includemain()int m34=0,1,2,3,4,5,6,7,8,9,10,11;printf(%d,%d,%d,%d,%d,n,m,*m,m0,其运行结果如下:404,

19、404,404,404,404412,412,412,412,412420,420,420,420,420414,4145,5,6.4 指向二维数组的指针变量,1.二维数组地址的表示方法,2.二维数组的指针变量,二维数组指针变量说明的一般形式为:类型说明符(*指针变量名)长度;其中“类型说明符”为所指数组的数据类型。“*”表示其后的变量是指针类型。“长度”表示二维数组分解为多个一维数组时,一维数组的长度,也就是二维数组的列数。“*(p+i)+j”是二维数组i行j 列的元素的地址,而“*(*(p+i)+j)”则是i行j列元素的值。,6.4 指向二维数组的指针变量,1.二维数组地址的表示方法,2.

20、二维数组的指针变量,【例6.10】二维数组指针变量的应用举例。main()static int m34=0,1,2,3,4,5,6,7,8,9,10,11;int(*p)4;int i,j;p=m;for(i=0;i3;Ifor(j=0;j4;j+)printf(%3d,*(*(p+i)+j);,该程序的运行结果为:0 1 2 3 4 5 6 7 8 9 10 11,6.5 指向字符串的指针变量,1.字符串的表示形式,2.字符串指针变量与字符数组的区别,在C语言中,可以用两种方法访问一个字符串。(1)第一种:用字符串指针指向一个字符串。(2)第二种:用字符数组存放一个字符串,然后输出该字符串。

21、,6.5 指向字符串的指针变量,1.字符串的表示形式,2.字符串指针变量与字符数组的区别,【例6.11】编程实现:把一个字符串的内容复制到另一个字符串中,要求不能使用strcpy函数。函数cprstr的形参为两个字符指针变量pm和pn。其中,pm指向源字符串,pn指向目标字符串。这里要注意表达式“(*pn=*pm)!=0”的用法。程序代码如下:#includecprstr(char*pm,char*pn)/*定义字符串复制函数cpystr*/while(*pn=*pm)!=0)pn+;pm+;,6.5 指向字符串的指针变量,1.字符串的表示形式,2.字符串指针变量与字符数组的区别,main()

22、char*pa=Human,b10,*pb;pb=b;cprstr(pa,pb);/*调用字符串复制函数cpystr*/printf(string_a=%snstring_b=%sn,pa,pb);,程序的输出结果为:string_a=Humanstring_b=Human,6.5 指向字符串的指针变量,1.字符串的表示形式,2.字符串指针变量与字符数组的区别,简化后的程序如下所示:#includecprstr(char*pm,char*pn)while(*pn+=*pm+)!=0);main()char*pa=Human,b10,*pb;pb=b;cprstr(pa,pb);printf(s

23、tring_a=%snstring_b=%sn,pa,pb);,程序的输出结果为:string_a=Humanstring_b=Human,6.5 指向字符串的指针变量,1.字符串的表示形式,2.字符串指针变量与字符数组的区别,(1)在对字符数组作初始化赋值时,必须采用外部类型或静态类型。(2)字符串指针变量本身是一个变量,用于存放字符串的首地址。而字符串本身是存放在以该首地址为首的一块连续的内存空间中,并以0作为串的结束。(3)字符串指针方式可以根据需要灵活使用。例如,对字符串指针方式:char*m=Hello Human;可以改写为另一种方式:char*m;m=Hello Human;,6

24、.6.1 指针型函数的定义方法,1.定义的一般形式,2.例6.12,6.6 指针型函数,类型说明符*函数名(形参表)函数体其中函数名之前加了“*”号表明这是一个指针型函数,即返回值将是一个指针。类型说明符表示了返回的指针值所指向的数据类型。,6.6.1 指针型函数的定义方法,1.定义的一般形式,2.例6.12,6.6 指针型函数,【例6.12】使用指针函数编写程序,实现求两个数中的较大者。#includeint*max(int a,int b)int*p;if(ab)p=,6.6.2 函数指针变量,1.一般形式,2.例6.13,6.6 指针型函数,类型说明符(*指针变量名)();上面就是函数指

25、针变量定义的一般形式,其中“类型说明符”表示被指函数的返回值的类型。“(*指针变量名)”表示“*”后面的变量是定义的指针变量。最后的空括号表示指针变量所指的是一个函数。例如:int(*f1)();表示f1是一个指向函数入口的指针变量,该函数的返回值是整型。,3.几点注意事项,6.6.2 函数指针变量,1.一般形式,2.例6.13,6.6 指针型函数,【例6.13】编程实现:求两个整数中的较小者,在程序中使用指针形式实现对函数的调用。#includeint min(int a,int b)if(ab)return a;else return b;main()int min(int a,int b

26、);int(*pmin)();int x,y,z;pmin=min;printf(please input two numbers:n);scanf(%d%d,程序的运行情况为:please input two numbers:3523min_number=23,3.几点注意事项,6.6.2 函数指针变量,1.一般形式,2.例6.13,6.6 指针型函数,(1)函数调用中“(*指针变量名)”两边的括号不可少,其中的“*”不应该理解为求值运算,在此处它只是一种表示符号。(2)不能让函数指针变量参与算术运算,这是与数组指针变量不同的。应该特别注意的是:函数指针变量和指针型函数这两者在写法和意义上是

27、有区别的。例如,float(*p)()和float*p()是两个完全不同的概念,,3.几点注意事项,6.7 指针数组,1.指针数组的定义,2.指针数组中的字符串,指针数组定义的一般形式为:类型说明符*数组名数组长度说明 例如:int*p3;定义了一个有三个元素的指针数组,每个数组元素(指针变量)都可以指向一个整型变量。,6.7 指针数组,1.指针数组的定义,2.指针数组中的字符串,【例6.14】指针数组应用举例。int m33=1,2,3,4,5,6,7,8,9;int*pm3=m0,m1,m2;int*p=m0;main()int i;for(i=0;i3;i+)printf(%d,%d,%

28、dn,mi2-i,*mi,*(*(m+i)+i);for(i=0;i3;i+)printf(%d,%d,%dn,*pmi,pi,*(p+i);,该程序的运行结果如下:3,1,15,4,57,7,91,1,14,2,27,3,3,6.7 指针数组,1.指针数组的定义,2.指针数组中的字符串,指针数组也常用来表示一组字符串,这时指针数组的每个元素被赋予一个字符串的首地址。指向字符串的指针数组的初始化更为简单。例如,采用指针数组来表示一组字符串,其初始化赋值如下:char*p=Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday;完成这个初

29、始化赋值之后,p0即指向字符串“Monday”,p6指向“Sunday”。,6.8.1 一级指针和二级指针的概念,6.8 二级指针,一级指针是直接指向数据对象的指针,即其中存放的是数据对象,如变量或数组元素的地址。二级指针是指向指针的指针,二级指针并不直接指向数据对象,而是指向一级指针的指针,也就是说,二级指针中存放的是一级指针的地址。下图所示是一级指针和二级指针的示意图。,6.8.2 二级指针的定义,6.8 二级指针,二级指针的定义格式为:存储类型 数据类型*指针名;其中,指针名前面有两个*,表示是一个二级指针。例如,有以下定义:int a,*pa,*pb;pa=则指针pa存放变量a的地址,

30、即指向了变量a,指针pb存放一级指针pa的地址,即指向了pa。因此,pa是一级指针,pb是二级指针。,6.8.3 二级指针的使用,6.8 二级指针,一般情况下,二级指针必须与一级指针联合使用才有意义,不能将二级指针直接指向数据对象。【例6.15】用二级指针访问二维数组。如果有如下定义:int a34;int*p3,*pp;p0=a0;p1=a1;p2=a2;pp=p;,6.8 二级指针,可以编制用二级指针访问二维数组的程序如下:#include main()static int a34;static int*p3,*pp;int i,j;p0=a0;p1=a1;p2=a2;p3=a3;pp=p

31、;printf(Please enter the number of a34:n);for(i=0;i3;i+)for(j=0;j4;j+)scanf(%d,ppi+j);for(i=0;i3;i+)for(j=0;j4;j+)printf(%5d,*(*(pp+i)+j);printf(n);,程序的运行情况为:Please enter the number of a34:1 2 3 4 5 6 7 8 9 10 11 121 2 3 45 6 7 89 10 11 12,6.8.3 二级指针的使用,6.9 程序举例,1.实例一,2.实例二,请按水果店里的水果名字(字符的字典顺序)的顺序对水

32、果的名字进行排序,并输出排序后的内容。下图所示为对应的N-S流程图。,6.9 程序举例,1.实例一,2.实例二,请按水果店里的水果名字(字符的字典顺序)的顺序对水果的名字进行排序,并输出排序后的内容。下图所示为对应的N-S流程图。,6.9 程序举例,1.实例一,2.实例二,#include#include#define N 6/*定义水果种类的数目,假设为6种*/void sort(char*name,int);/*排序函数sort的说明*/void print(char*name,int);/*输出函数print的说明*/main()static char nameN80=“orange,b

33、anana,apple,peach,grape,tomato;/*定义二维数组存放水果的名称*/,6.9 程序举例,1.实例一,2.实例二,char*pointN;/*定义指针数组*/int j;for(j=0;jN;j+)pointj=namej;/*指针数组指向二维数组各行的首地址*/printf(The name of fruit before sorted:n);print(point,N);/*输出排序前的水果名*/sort(point,N);/*调用函数sort对水果名按字典的顺序进行排序*/printf(nThe name of fruit after sorted:n);pri

34、nt(point,N);/*输出排序后的水果名*/,6.9 程序举例,1.实例一,2.实例二,void sort(char*name,int n)char*temp;int i,j,k;for(i=0;i0)k=j;if(k!=i)temp=namei;namei=namek;namek=temp;,6.9 程序举例,1.实例一,2.实例二,void print(char*name,int n)/*定义输出函数print*/int i;for(i=0;in;i+)printf(%sn,namei);,程序运行结果为:The name of fruit before sorted:orangeb

35、ananaapplepeachgrapetomatoThe name of fruit after sorted:Applebananagrapeorangepeachtomato,6.9 程序举例,1.实例一,2.实例二,用指针数组求两个矩阵a,b的和,将结果存入a,并按矩阵的形式输出。程序代码如下:#include#define ROW 4/*定义矩阵的行数,假设为4*/#define COL 5/*定义矩阵的列数,假设为5*/main()/*定义二维数组a并赋初值*/int ROWCOL=9,22,76,59,10,80,90,47,35,12,16,81,50,29,23,45,57,

36、89,12,15;,6.9 程序举例,1.实例一,2.实例二,/*定义二维数组b并赋初值*/int bROWCOL=23,10,17,49,0,53,17,75,67,5,69,87,60,21,7,13,25,37,49,50;int*p2;/*定义指针数组*/int i,j;p0=a0;p1=b0;printf(matrix a%d%d is:n,ROW,COL);for(i=0;iROW;i+)for(j=0;jCOL;j+)printf(“%d,*(p0+j+COL*i);printf(n);,6.9 程序举例,1.实例一,2.实例二,printf(matrix b%d%d is:n,

37、ROW,COL);for(i=0;iROW;i+)for(j=0;jCOL;j+)printf(%d,*(p1+j+COL*i);printf(n);printf(The sum of the two matrix is:n);for(i=0;iROW;i+)for(j=0;jCOL;j+)*(p0+j+COL*i)+=*(p1+j+COL*i);printf(%d,*(p0+j+COL*i);printf(n);,程序的输出结果为:matrix a45 is:9 22 76 59 1080 90 47 35 1216 81 50 29 2345 57 89 12 15matrix b45 i

38、s:23 10 17 49 053 17 75 67 569 87 60 21 713 25 37 49 50The sum of the two matrix is:32 32 93 108 10133 107 122 102 17 85 168 110 50 3058 82 126 61 65,6.10.1 内存动态分配的含义,6.10 用指针进行内存动态分配,Turbo C主要用两种方法使用内存:一种是由编译系统分配的内存区;另一种是用内存动态分配方式,留给程序动态分配的存储区。动态分配的存储区在用户的程序之外,即其不是由编译系统分配的,而是由用户在程序中通过动态分配获取的。使用动态内存

39、分配至少有三个优点:一是可以更有效地使用内存;二是同一段内存可作为不同的用途,使用时申请,用完时释放;三是允许建立链表等动态数据结构。,6.10.2 内存动态分配的步骤,6.10 用指针进行内存动态分配,内存动态分配可大致归纳如下:(1)首先要确切地规定需要多少内存空间,以避免存储空间的浪费,也可多为其他数据留有空间。(2)利用C编译系统提供的动态分配函数来分配所需要的存储空间。(3)使指针指向获得的内存空间,以便用指针在该空间内实施运算或操作。(4)当动态内存用完之后,一定要释放这一空间。如果不释放获得的存储空间,则可能把堆上的内存用尽。,6.10.3 常用的内存动态分配函数,6.10 用指

40、针进行内存动态分配,malloc()函数用来申请动态内存,其一般格式为:void*malloc(size)该函数用来按字节数申请内存分配。其中,参数size为unsigned int型的表达式,表示申请的字节数。如果申请成功,则函数返回一个void型的指针,即获得动态存储空间的首地址,否则返回空(NULL)指针。,1.申请内存函数,2.释放内存函数,6.10.3 常用的内存动态分配函数,6.10 用指针进行内存动态分配,free()函数用来释放已申请的内存,其一般格式为:void free(p)该函数释放以p为起始地址的动态内存区。由于该函数没有返回值,故定义为void型。,1.申请内存函数,

41、2.释放内存函数,6.10.3 常用的内存动态分配函数,6.10 用指针进行内存动态分配,【例6.16】编制程序利用动态内存分配存放n个整数的一维数组,n的值在程序运行过程中指定,然后从键盘输入任意n个整数存入该数组中,并计算其各个元素的平方和。分析:先通过scanf()获得n的值,用calloc()申请能存放n个int型数的动态内存。如果申请成功,就得到动态内存的首地址,将该地址存放在指针p中,通过移动指针存入n个整数,再通过移动指针取出各个数并计算它们的平方和。,1.申请内存函数,2.释放内存函数,6.10.3 常用的内存动态分配函数,6.10 用指针进行内存动态分配,#include#i

42、nclude main()int n,s,i,*p;printf(Enter the dimension of array:);scanf(%d,1.申请内存函数,2.释放内存函数,程序的运行情况为:Enter the dimension of array:2enter 2 values of array:1 25Enter the dimension of array:5enter 5 values of array:1 2 4 45 788130Enter the dimension of array:12enter 12 values of array:1 2 3 4 5 6 7 8 9 10 11 12650,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号