收藏 分销(赏)

第三版C语言_第10章 指针 课件讲解.pdf

上传人:曲**** 文档编号:261269 上传时间:2023-06-08 格式:PDF 页数:90 大小:6.52MB
下载 相关 举报
第三版C语言_第10章 指针 课件讲解.pdf_第1页
第1页 / 共90页
第三版C语言_第10章 指针 课件讲解.pdf_第2页
第2页 / 共90页
点击查看更多>>
资源描述
第十章指针10.1地址和指针的概念数据在内存的存放、读取方式(以变量为例):1、数据使用前的编译处理过程2、用户存取数据方式变量名|二|地址 口 地址所标志的内存段|二|数据大一个比方:旅 客一 变量数据 旅客名字一 变量名旅馆房间一内存区 旅馆房间号一地址 查找旅客:旅客名字一房间号码一房 间一找到旅客存取数据:变量名一内存地址一内存区一数 据*注意:内存单元的地址与内存单元的内容是不同的。I内存单元地址一旅馆房间号码内存单元内容一住在房间内的旅客。内存地址 内存用户数据区20002002QQd v_ 内存中存-一一放的数据20042202006弋3、数据存取举例设程序中已定义三个整型变量i,j,k,编译时系统将2000和2001两个字节给变量i,2002、2003给j,2004、2005给k。内存分配示意图如下内存地址内存用户数据区,20003变量i20026变量J20049变量kprintf(“d”,i)变量名i 一 地址2000 取变量值3 送到PRN k=i+j变量名i 一地址2000 一取变量值3 变量名j 地址2002 取变量值6相加得9 送到K占用的2004,2005飞4、直接访问与间接访问V*直接访问:1 在数据存取中,直接得到变量i地址然后按变量i的地址存取变量i的值的方式。间接访问:在数据存放中,变量i的地址不是直接得到,而是 存放在另一个变量Lpointer中,须先从变量Lpointer中 获取变量i地址,然后按变量i地址存取变量值i的方式。?大一个比方(取抽屉A中的东西):直接访问:直接得到钥匙A 打开抽屉A,取出东西(直接获得变量i地址一按变量i地址存取变量的i值)间接访问:钥匙A在抽屉B中一用钥匙B打开抽屉B得到钥匙A打开抽 屉A取得东西变量i地址放在变_读取变量Lpointer量Lpointer中 值得到变量i的地址按变量i地址存取i值*间接访问例子过程:根据变量名i_pointer获得地址3010,到地址3010 读取数据,得到2000(变量i的地址),到2000地 址读取数据,得到变量i的值。内存地址内存用户数据区2000-3变量i20026变量J20049变量k30102000变量 i_pointer1 5、指针和指针变量 指针:一个变量的在内存区中的地址称为指针。通过变量的指V*针,可以找到变量的存储单元,从而读取其中存放的值;V 指针变量:专门用来存放指针的变量,称为指针变量。指针变4 量存放的数据为另一变量的地址(指针)。“注意:指针与指针变量的区别体 指针一是一个地址,用于指向存放变量数据的内存单元;指针变量一是一个变量,它的值是指针例如:变量i的地址2000为该变量的指针,变量i_pointer是 用来存放变量i的指针的,它是一个指针变量。10.2变量的指针和指向变量的指针变量指针:它首先是一个地址,是指变量在内存中的地址;指针变量:它是一个变量,是一个专门存放变量地址 的变量,用来指向另一个变量。为了表示指针变量和它所指向的变量之间的联系,在程序中用表示“指向”例:Lpointer代表指针变量,而*Lpointer是i_pointer所指 向的变量。如下图所示:*Lpointer与i是等效的,都i_pointer*Lpointer 表示同一变量,该变量存放-地址为2000。因此:2000 3 i _ _ i=3;*Lpointer=3两语句作用相同2000%,1021定义一个指针变量例:int i,j;int*pointer_1,*pointer_2;第一条命令定义了两个整型变量i,j;!第二条命令定义了两个指针变量pointer,pointer_2,它们 指向整型变量;两个整型变量*pointer,*pointer_2,它们与i,j为相同类型,被pointer_1,pointer_2两个指针所指向;弋*基类型:指针变量的基类型是指该指针变量可以指向的变量的类型;定义指针变量的一般形式:基类型大指针变量名例:floa t*pointer_3;“I(pointer_3是指向实型变量的指针变量)cha r*pointer_4;(pointer_4是指向字符型变量的指针变审)指针变量指向的改变:方法:将一个该指针 的变量的地址赋给该指针;执行赋值语句之前 执行赋值语句之后pointer_1 i pointer_1=&i Pointer-1 定义指针变量时应注意的两点:(1)“*”表明它后面所跟的变量类型是指针型变量;需要 指出的,指针变量名为pointer,而不是*pointer,I*pointer是一个整型变量;(2)在定义指针变量时必须指定基类型。因为不同数据类型 占用的内存空间大小不同,在进行指针移动和运算时,将导 致不同的结果。如“指针值+1”,对于基类型为整型,将向 后移动两个字节,对于基类型为实型,将向后移动四个字节;1022指针变量的引用WARNING:指针变量中只能存放地址(指针),不能把其它类型的数 据赋给指针变量。例:pointer为指针变量pointer_1=100为非法赋值,因为100为整型变量。有关的两个运算符:(1)&:取地址运算符;(2)大:指针运算符(或称为“间接访问”运算符)例:&a为变量a的地址,*p为指针变量p所指向的存储单元;二.指针变量的引用例10ma in()(int a,b;int*pl,*p2;a=100;b=10;pl=&a;p2=&b;printf(66%d,%d n 工printf(66%d,%d n 工*/Pl a&a-*plp2 b&b j-10*p2a,b);/*“直接访问”方式*/*pl,*p2);/*“间接访问”方式结果:100,10100,10程序中:*pl表示指针变量pl所指向的变量,即a.*p2表示指针变量p2所指向的变量,即b.关于&与*运算符的说明:1:&是取地址运算符.如:&a,&b等.*是指针运算符.用于定义时表示其后的标识 符是指针变量.而在程序中*p则表示指针变量p 所指向的变量,即目标变量。2.&,*同优先级,按从右至左方向结合.a:如:则:如:则:int a,*p2;pl=&a;&*pl匕&a等效 p2=&*pl;或 p2=&a;p2也指向变量a.b:如:int a,*pl;pl=&a;则:*&a与*pl等效,即等价于变量a.pl&aa*pl*&ac:如:int a,*pl;pl=&a;则:但注意(*pl)+等价于 a+*pl+不等价于(*pl)+因为*pl+等价于*(pl+)即先得pl所指向 变量的值,再使指针变量pl的值自增,此时pl已不在指向 原来M变量了.例 10.2void ma in()(int*pl,*p2,*p,a,b;sca nf(“d,%d,&a,&b);pl=&a;p2=&b;if(a 5p2 b|&b|-|9|5(注意:本程序是采用交换指针变量pl和p2的 指向来实现两个数的比较的.且比较前后a,b的 值并未发生变化)三.指针变量作为函数的参数指针变量可以作函数的参数,其作用是将一个变量的地 址传送到另一个函数中。例 10.3void swap(int*pl,int*p2)int p;p=*pl;*pl=*p2;*p2=p;void main()int a,b 5 pointer l 5*pointer_2;scanf(%d,%d 行,&a 5&b)7 pointer i=&a;pointer_2=&b;if(aa一,如果把swa p函数改成:swa p(pl,p2)int/pl,*p2;int/p;P无确定的地址值,它的 的值不可预见,*p所指|向的单元也是不可预见,对*P赋值可能会破坏系L统的正常状态。又如:swa p(int x*p=*pl;(此句有问题)*pl=/p2;*p2=*p;XaJb99x(b)1 y.说明:T 1.不能通过改变形参指针变量的值而使实参指针变 量的值改变.2.可以通过改变形参指针变量所指向的变量的值来改变实参指针变量所指向的变量的俏.3.如想通过函数调用得到n个要改变的值,可以:在主调函数中设n个变量,并用n个指针变量指 向它们;将指针变量作实参,使n个变量的地址传给所调 用的函数形参;(3)通过形参指针变量,改变该n个变量的值;(4)主调函数中就可以使用这些改变了值的变量。飞 swa p(int*pl,int*p2)int*p;.P=Pl;_ 本函数中试图通过改变形参pl=p2;(指针变量的值来使实参指针P2=p;变量的值改变.|ma in()(int a,b,/pointer,pointer!;sca nf(,%d,%d”,&a,&b);pointer l=&a;pointer!=&b;if(a b)swa p(pointer l,pointer!);printf(n%d,%d n”,a,b);作者原意图是实 现这样的结果pointeri&a pointer_2&bj(a)pointerl(d)c语言中实参变量和形 参变量之间的数据传递 是单向的“值传递”方式,指针变量作为函数参 数也要遵循这一规律pointerl a&a-6 5pointer!b&b 1行(d)总结:要实现变量值的双向传递,在被调函 数中必须对指针变量所指向的日标变量进 行操作。如果只是对指针变量本身进行操作,仍然是单向传递。这点是指针变量作为函数参数的难点 和重点。例10.4输入a,b,c3个整数,按大小顺序输出 swap(int*ptl,int*pt2)(int p;p=*ptl;*ptl=*pt2;*pt2=p;)exchange(int*ql,*q2,*q3;)(if(*ql *q2)swap(ql?q2);if(*ql *q3)swap(ql,q3);if(*q2 *q3)swap(q2,q3);)main()(int a,b,c,*p 1,*p2,*p3;scanf(“d,%d,%d,&a,&b,&c);p 1=&a;p2=&b;p3=&c;exchange(pl,p2,p3);printf(n%d,%d,%dn a,b,c);)10.3数组的指针和指向数组的指针变量c语言中,指针变量可以指向变量,也可以指向数组 和数组元素.数组的指针:数组的起始地址.数组元素的指针:数组元素的地址.一.指向数组的指针变量的定义与赋值指向数组的指针变量的定义同指向变量的指针变量 的定义相同.如:int a 10;int*p;若:p=&a 0;则p指向了a数组的第0号元素.由于数组名代表数组的首地址(即起始地址).故:p=&a 0;等价于 p=a;也可:int a 10;int*p=&a 0;int*p=a;注意int*p=&a 0;的含义是将数组首地址赋给指针 变量p,而不是赋给(*p).:.通过指针引用数组元素 P&a 0如:int a 10,*p;P=a;_则:P 的地址;p+的地址;p+的地址.0a 0 a la 9(2)*p=a 0,*(p+1)=a l,.*(p+i)=a i说明:1.数组元素在内存中是连续存放的,c语言 规定,指针变量p+1指向下个元素(不是简单的 加1).2.(p+i)表示指向a i的地址,而a+i也表示 a i的地此故程序中(p+i)等价于a+i.如:p+2;a+2;3.指向数组的指针变量可以带下标.如:Pi I*(P+i)I p a数组p+l,a+i a 0a lp+i 月+I*(P+i)a ip+9 用+9 a 9综上所述:数组元素的引用可以:(假定:int a 10,*p=a;)(1)下标法:数组名I下标或 指针变量名I下标 a i pi指针法:*(p+i)或*(a+i)例10卓用二种方法输出数组各元素.下标法ma in()(int a 10 5 i;for(i=0;i10;i+)sca nf(66%d,&a i);printf(“n);for(i=0;i10;i+)printf(“d”,a i);用以组名计算元素地址.ma in()(int a 10,i;for(i=0;i10;i+)scanf(%d”,&ai);printf(“n”);for(i=0;i 10;i+)printf(d *(a+i);注意几点:(1)指针变量可以作自增,自减运算.如:+P,P-.而数组名不能作自增,自减运算.如a+,a等 均不合法.因为数组名是常量.(2)注意指针变量的当前值.如:例 10.6:ma in()(int a 10,i,;P=a;for(i=0;i10;i+)sca nf(“%d”,p+);printf(“n);for(i=0;i 10;i+,p+)printf(%d,*p);注意指针变量的运算.如:int a 10,i/p;p=a;贝u:a.p+(或 p+=l)表示p指向a l,此时若执行*p,则取出a l 元素的值.b.“户与“+”同优先级,自右往左结合.如:*P+等效于*(p+),即先取P所指向 变量的值,再使p+1.而*(p+)号*(+P)的作用不同.前恚先取*P的俶后使p+1;者是先使p+1,再取*P的值.(L(*p)+表示使目标变量的值加1.而不是指针变量的 值加loe.*(p+)等价于 a i+T*(+p)等价于a+i即先使p自增,再作文运算.如:ma in()(int a 100,*p;P=a;while(p a+100)叨 printf(%d 二*p+);.ma in()(int a 100 5*p;P=a;while(p a+100)printf(u%d,*p);P+;三.数组名作函数参数数组名作函数参数时,实际上是将实参 数组的首地址传给形参。这样实参数组与 形参数组共占同一段内存。使得在调用函 数过程中,形参数组中元素值发生变化也 就使实参数组的元素值随之而发生变化。t如:ma in()”int a rra y10;a rra yf(a rra y,10);f(a rr,n)int a rr 5 n;a rr1)实参传递给形参后a rr和 a rra y指向同一内存地址;2)将“10”传递给形参n后,界定了形参数组的范围;3)这种“数组名+数组元素 个数”的参数形式是常用的。t例10.7将数组a中n个整数按相反顺序存放.题意分析:本题的关键是最后交换的两个元素的上下标值.的确定。即将第一个元素和最后一个元素对换消第 二个同倒数第二个对换.即两两对换,直到:a int(n-1)/2与 a n-int(n-1)/2-1)对换 为止。void inv(int x,int n)int t-1)/2;for(i=0;i=m;i+)j=n-l-i;t=xi;xi=xj;xj=t;return;)ma in()(sta tic int i,a 10=3,7,9,11,0,6,754,2);printf(The origina l a rra y:n);for(i=0;i10;i+)printf(66%d 工 a i);printf(“n”);inv(a 510);printf(The a rra y ha s been inverted:n);for(i=0;i10;i+)printf(%d,a i);printf(“n”);例10.8从10个数中找出其中最大值和最小值 int max,min;void max_min_value(int array ,int n).int*p,*array_end;array_end=array+n;max=min=*array;for(p=array+l;pmax)max=*p;else if(*p min)min=*p;main()int i,number10;printf(enter 10 data n);for(i=0;i10;i+)scanf(%d;&numberi);max_min_value(number,10);printf(n max=%d,min=%d n max,min);此例也可改用指针变量来传送地址,程序可改为:int ma x,min;void ma x min va lue(int*a rra y,int n)一 int*p,*a rra y end;a rra y end=a rra y+n;ma x=min=*a rra y;for(p=a rra y+1;p ma x)ma x=*p )else if(*p v min)min=*p;return;)ma in()int i,number10,*p;p=number;printf(“enter 10 da ta n);for(i=0;ia 1=a+1 a 2=a+2 a i+j是第行j列的地址警*(a i+j)是该地址存储的值,即a皿考虑*(a 2+3)=?a(200)|ajo(216).a R注意:*a i和*(a+i)无条件等价*a+i a i、*(a+i)&a iO均表示第i行首地址;&a ij、a i+j、*(a+i)+j都是第i行j列元素的地址;*a ij*(a i+j)、*(*(a+i)+j)都是第i行j列元素的值;二维数组名(如a)是指向行的;一维数组名(如a 1,a 2)是指向列元素的。在指向行的指针前面 加上一个大,就转换成为指向列的指针。反之,在指向 列的指针前面加&,就成为指向行的指针。3、指向多维数组元素的指针指向多维数组元素的指针形式有2种:(1)指向数组元素的指针变量。这种方式跟指向变量的指针变量的使用方法一样。这里,主要要掌握的是:在数组中相对位置的 计算公式从这个公式可以看到,C语 言规定数组的下标从0开始,对计算上述相对位置比 较方便,只要知道了i和j的值,就可以用公式计算出 相对于数组开头的相对位置。中(2)指向由m个元素组成的一维数组的指针变量。定义格式:,基类型(*指针变量名)常量表达式例如:int(*p)4(与inta 4比较)表示*P有4个元素,每个元素为整数,也就 诂是p所指向的对象是有4个整型元素的数组。假设:p开始指向的地址为2000那么:p+1=?,4、用指向数组的指针作为函数参数,在用指针变量作形参以接受实参数组名传递来的地 址时,有两种方法:(1)用指向变量的指针变量作为v*形参。(2)用指向一维数组的指针变量作为形参。1 例10.13有一个班,3个学生,各学4门课,计算总4.平均分数以及第n个学生的成绩。程序如下:#include void ma in()void a vera ge(floa t*p,int n);void sea rch(floa t(*p)4,int n);floa tscore34=65,67,70,60,80,87,90,81,90,99,100,98;a vera ge(*score,12);sea rch(score,2);void a vera ge(floa t*p,int n)floa t*p_end;floa t sum=0,a ver;p_end=p+n-1;for(;p=p_end;p+)sum=sum+(*p);a ver=sum/n;printf(,a vera ge=%5.2fn,a ver);)void sea rch(floa t(*p)4,int n)int i;printf(the score of No.%d a re:n,n);for(i=0;i4;i+)printf(%5.2f,*(*(p+n)+i);)e例:将a矩阵与b矩阵相力口,和存入c矩阵。inti/;Ima in()int a 34Lb34,c34;prmtf(nThe va lue of a:nn);for(i=0;i3;i+)for(j=0;j4;j+)sca nf(n%dn,a i+j);printf(nThe va lue of b:nn);for(i=0;i3;i+)for(j=0;j4;j+)sca nf(n%d!*(b+i)+j);ma trix(*a,b0,&c00);printf(nThe va lue of c:n);for(i=09p=c0;pc0+12;p+J+)if(i%4=0)printf(niin);printf(n%-4dn/p);ma trix(int*x,int*y,int*z)for(i=0;i3;i+)for(j=0;jy)z=x;else z=y;return(z);int ma x();int Gp)();int a,b,c;p=ma x;sca nff6%d,%d 二&a,&b);c=(*p)(即 b);printf(“a=%d,b=%d,ma x=%d”声,b,c);说明:LC语言中,函数调用可以有两种形式.即函数名调用和函 数指针调用.2.(*p)()表示一个指向函数的指针变量,用于存放函数 的入口地址.若把某一个函数的入口地址赋给它,它就指向 该函数.即在程序中一个函数指针变量可以先后指向不同 的函数.3.对于指向函数的指针变量作自增或自减运算均无意义 如:int(*p)();P+;P+n;P;因为p只能指向函数的入口地址,而不能指向函数 内的某一条指令。二.用指向函数的指针变量作函数参数函数指针变量作函数参数时,它是将函数名(即函数的入口地址)传给形参。这种方式的优点在于:多次调用函数,且每 次要调用的函数不固定时,只需给出不同的函数 名作实参即可。而函数不必作任何修改,这符合 结构化程序设计方法的原则。例 10.24ma in()(int ma x(),min(),a dd();int a,b;printf(enter a a nd b;sca nf(u%d,%d“,&a,&b);printf(ma x=);process(a,b,ma x);printf(min=);process(a,b,min);printf(sum=);process(a,b,a dd);ma x(int x,int y)(int z;if(x y)z=x;else z=y;return(z);min(int x,int y)(int z;if(x y)z=x;else z=y;return(z);a dd(int x,int y)(int z;z=x+y;return(z);)process(int x,int y,int(*fun)()(int result;result=(*fun)(x,y);printf(66%dn”,result);说明:1.ma in函数的第二行不能少int ma x(bmin(),a dd();因为在用函数指针至量而用函数是用函数名作实参.为保 证编译系统正确判别它是函数名,必须作说明.2.本程序如采用函数直接调用,主程序可改为:ma in()(int a,b,z;printf(uenter a a nd b:);sca nf(u%d&a,&b);z=ma x(a,b);printf(ma x=%dn,z);z=min(a,b);printf(u min=%dn”,z);z=a dd(a,b);printf(sum=%dn,z);10.6返 回指针值的函数一个函数可以返回一个整型值、字符值、实 型值等,也可返回指针型的数据,其概念与以前 类似,只是返回值的类型是指针类型而已。定义的一般形式为:I 类型名*函数名(参数表列)例如:int*a(int x,int y)例10.24有若干个学生的成绩(每个学生4门课 程),要求在用户输入学生序号以后,能输出该 学生的全部成绩。用指针函数来实现。程序如下:#include void main()float score 4=60,70,80,90,56,89,67,88,34,78,90,66;float*search(float(*pointer)4,int n);float*p;int i,m;printf(fienter the number of student:11);scanf(ii%di,&m);printf(MThe scores of No.%d are:n,m);p=search(score,m);for(i=0;i4;i+)float*search(float(*pointer)4 Jnt n)float*pt;pt=*(pointer+n);return(pt);将这句改成:pt=(*pointer+n);运行程序,输入m=1,得到的不是第一个学生的成 绩,而是二维数组中开始的4个元 素的值。为什么?10.7指 针数组和指向指针的指针.指针数组的概念由同一数据类型的指针变量构成的数组叫指 针数组.即一个数组的所有元素均为指针型数据.定义格式:类型标识符*数组名数组长度如:int*p4;即表示指针数组p有四个元素.每一个元素 都是指针变量,且可以指向一个整型变量。指针 数组的下标仍从0开始计。例10.28将若干个字符串按字母顺序(由小到大)输出。#include“string.h“ma in()I(void sort();void print();sta tic cha r*na me=“Follow me”,“BASIC”,“Grea twa ll”,“FORTRAN”,“Computer design;int n=5;sort(na me,n);print(na me,n);void sort(cha r*na me,int n)cha r*temp;int i,j,l for(i=0;in-l;i+)k=j;for(j=i+l;j0)if(k!=i)void print(na me,n)cha r*na me ;int n;int i=0;cha r*p;p=na me0;while(i n)p=*(na me+i+);printf(66%s np);temp=na mei;na mei=na meky/na mek=temp;void print(cha r*na me,int n)int i;for(i=0;in;i+)printf(“s n,na mei);?二.指向指针的指针定义格式:数据类型*标识符如:cha r;表示一个指向字符指针变量的指针变量即:p 中只能存放一个指向字符型数据的指针变量的地 工址.na me na me 数组na meO-Follow mena mel-BASICna me2-Grea t wa llna me3-AFORTRANna me4-Computer designma in()sta tic cha r*na me=“Follow meBASIC”,Grea twa ll FORTRAN J Computer design ;cha r*p;int i;for(i=0;i5;i+)P=吗慰生表示na mei的地址 printf(s n,*p);)运行结果:Follow meBASICGrea t Wa llFORTRANComputer design说明:指针数组的元素也可以指向整型数据或实型数据例 10.30ma in()sta tic int a 5=1,3,5,7,9;int*num5=&a 0,&a l,&a 2,&a 3,&a 4;int*p,i;p=num;for(i=0;i1)printf(“s n”,*+a rgv);具有“参数回送”功能的C程序(假定源文件名为echo.c)ma in(int a rgccha r a rgv)(while(a rgc0)printf(%s%cn”,+a rgv5(a rgcl)?6 5:6n5);)如输入命令行:echo Computer a nd C La ngua ge则在显示屏上输出:Computer a nd C La ngua ge此程序也可改为:ma in(int a rgc,cha r*a rgv)(int i;for(i=l;ia rgc;i+)printf-%s%c9a rgviXia rgc-l)?6 5:6n5);10.8有关指针的数据类型和指针运算的小结(自学)109动态内存分配_一.动态内存分配函数L动态数据结构前述各种数组,其元素在内存中存储时占用连续的内存 空间.所占据内存空间的位置和大小是在数组被定义说明 的同时由系统分配的,且在程序运行期间是不变的这种数 据结构叫“静态数据结构”.若数据所占用的内存空间 的位置和大小随程序的运行而动态变化,则这种数据结构叫“动态数据结构”.其特点是:各数据在逻辑上是连续 排列的.但在物理上并不真正连续.即在内存中存储时并不 占用连续的内存空间.t 2.动态内存分配函数(1)ma lloc 函数:作用:为数据动态分配内存单元.格式:void*ma lloc(size)说明:a.参数size表示要求分配的内存空间字节数.即调 用本函数时,它在内存中分配大小为size字节的二 空间.1 b.调用小函数,正常时该函数返叵I所分配内存单元的起始地址.如内存中已没有足够的空间,则返H 零(NULL),即返回空指针.c.由于ma lloc函数的返回值是void型的指针.因 此在把返回值赋给具有一定数据类型的指针变 量时,应该对返回值实行强制类型转换.d.调用ma lloc函数,应在源程序开头用:#include“ma lloc.h 例:在内存中为80个字符动态分配内存#include“ma lloc.hma in()cha r;p=(cha r)ma lloc(80sizeof(cha r);if(p=0)printf(out of memony n”);exit();其中:ma lloc()的返值用(cha r 0强制转换为 字符型指针.用sizeof函数测试数据类型的大小.(2)free()函数.作用:用于释放ma lloc函数分配的内存空间.格式:void free(p)说明:l.p为指针变量.调用该函数,则把p所指向的 导内存空间释放,被释放的空间可以重新分配.2.p所指向的必须是在此之前使用ma lloc函 数分配的内存空间.而被释放的空间大小,则由使用 ma lloc函数时参数size决定.、3.只有调用ma lloc函数时分配的内存空间才能用free函数释放.否则,可能会导致错误.例:为40个int数据动态分配空间,并赋值和输出ft#include“stdio.h#include“ma lloc.h59 ma in()int i,*p;p=(int)ma lloc(40sizeof(int);if(p=NULL)printf(out of memony n);exit();for(i=0;i40;i+)*(p+i尸i;for(i=0;i40;i+)printf(%d”,p+i);free(p);
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传
相似文档                                   自信AI助手自信AI助手

当前位置:首页 > 教育专区 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服