大学C语言程序设计基础第9章ppt课件.ppt

大学C语言程序设计基础第9章ppt课件.ppt

ID:59319603

大小:240.00 KB

页数:57页

时间:2020-09-20

上传者:U-5097
大学C语言程序设计基础第9章ppt课件.ppt_第1页
大学C语言程序设计基础第9章ppt课件.ppt_第2页
大学C语言程序设计基础第9章ppt课件.ppt_第3页
大学C语言程序设计基础第9章ppt课件.ppt_第4页
大学C语言程序设计基础第9章ppt课件.ppt_第5页
资源描述:

《大学C语言程序设计基础第9章ppt课件.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

第九章指针 第9章指针指针是C语言中广泛使用的一种数据类型。能很方便地使用数组和字符串;并能像汇编语言一样处理内存地址,正确理解和使用指针是掌握C语言的一个重要标志。诚然,指针也是C语言中最为困难的一部分内容。●一个变量有如下几个属性:变量名变量值变量类型(存储宽度)变量存储地址-------指针变量作用域变量生存期①指针其实就是变量的地址。②指针也是一种数据类型,它用专门的变量——“指针变量”来存放。注意:所有的数据(常量、变量)的地址都有系统来分配,用户无法指定数据的地址,只能申请和使用地址(指针)。 §9.1地址和指针的基本概念一、数据的存取:图9.1用户数据区地址:变量:2000H00000000变量I=3000001012002H00000000变量j=6000001102004H00000000变量k=900001001………..指针变量3010H00000000P=2000H3011H001000001、内存地址:一般把存储器中的一个字节称为一个内存单元,如整型量占2个单元,字符量占1个单元等。每个内存单元的编号称为“内存地址”。程序中的每个变量都对应着内存中的一个地址,从该地址开始的一个或多个字节用来存放该数据。2、内存单元的地址和内存单元的数据的区别:根据内存单元的地址就可以找到内存单元中的数据,这个地址称为内存单元的指针。内存单元的指针和内存单元的数据是两个不同的概念,例如,若有三个整形变量及值分别为:inti=3,j=6,k=9则它们在内存中的存储情况如图9.1 对于一个内存单元来说,地址是它的位置,数据是它的内容。●在C语言中,允许用一个变量来存放指针,这种变量称为指针变量。●定义指针的目的是为了通过指针去访问内存单元。●程序编译后已经没有i、j、k这些变量名了,而是将变量名转换成了变量的地址如:2000、2002、2004。系统通过内存地址对变量进行存取。●指针变量中不仅可以存放变量的地址,也可以是其他数据结构(如:数组、字符串、函数)的地址。因为数组、字符串、函数都是连续存放的,所以指针变量中存放的是他们的首地址。 二、内存单元的直接访问和间接访问方式1、直接访问方式:按变量地址存取变量值的方式称为直接访问方式。如语句:printf(“%d”,i);程序编译时将变量i转换为2000,执行时,找到地址2000,从2000,2001两个字节中取出数据3,把它输出。又例如语句:scanf(“%f”,&i);系统将键盘输入的值送到地址为2000开始的变量i的存储单元中。2、间接访问方式:通过指针变量找到变量的地址,再按变量地址定位到内存单元,再存取变量的值。例如:int*p,I;通过执行语句p=&i;将整型变量i的地址存放到变量p中,即p的值为变量i所对应的内存单元的起始地址2000。现在要存取i的值可以这样做:①找到存放i的地址的内存单元地址(3010和3011),从中取出变量i的地址值2000,②对2000和2001单元进行存取——这就称为间接访问。 3、关于“指向”的含意指针变量p的值为2000,即变量i的地址,这样就在p和i之间建立了一种联系:通过指针变量p知道变量i的地址,从而可找到变量i的内存单元,因此说变量p指向变量i,如下图所示:为了将整数10送到变量i中,可以有以下两种表示方法:⑴将10直接送到变量i所标志的单元中,如左下图所示。(2)将10送到指针变量p所指向的单元中,如右下图所示。20003000p2000i102000i20003000p102000i 4、指针与指针变量的概念如果一个变量专门用来存放另一个变量的地址,则称这个变量为“指针变量”。指针变量的值(即指针变量中存放的数据)是指针(地址)。●注意区分“指针”和“指针变量”这两个概念。●几点说明▲数据所需内存单元的个数是由数据类型决定的。▲变量的地址是指变量所占内存单元中第1个字节的地址。▲地址的值与整数是有区别的。 一、指针变量的定义1、指针变量的定义形式:基类型*变量名;定义包括三个内容:(1)指针类型说明,即定义变量为一个指针变量;(2)指针变量名;(3)指针所指向的变量的数据类型。2、定义示例例如:inti,*p1=&i;表示p1是一个指针变量,它的值是整型变量i的地址。或者说,p1指向整型变量i。问题:能不能这样定义:intp1=&i,i;为什么?又例如:int*p2;/*p2是指向整型变量的指针变量*/float*p3,x;/*p3是指向实型变量的指针变量*/char*p4;/*p4是指向字符变量的指针变量*/应该注意的是,一个指针变量只能指向同类型的变量,如:P3只能指向实型变量。§9.2指针变量的定义与引用 3、说明“*”只是表示定义的变量为指针变量,指针变量名中并不包含“*”;“*”是指针变量的标志,不可丢掉。(2)一个指针变量被定义之后,它所指向对象的类型就确定了。例如:intx,y,*p;doublea;p=&x;●不能把a的地址赋给p,即不能有p=&a。(3)所有指针变量占用相同字节的内存单元。(4)指针变量可以指向任何类型的对象,包括指向数组、指向别的指针变量、指向函数等。例如,可以有下列变量说明:char(*p)[5];p指向含5个元素的一维字符数组,或理解为字符型二维数组的行指针,每行为含5个元素,p+i指向第i行。int*p[5];P为指针型数组,其5个元素都是指针,都指向整型数组。int**ip;指向整形指针的指针int*fip();函数值为指针的函数------指针型函数,指向整形函数。int(*pti)()指向整形函数的指针,此处括号强调的是:指针 二、指针运算符“*”(间接访问变量的值)“*”可以得到指针变量所指向的变量的值。例如:若ip为指针变量,它指向变量i,则*ip与I等价。inti,*ip;ip=&i;/*指针变量ip中存放整形变量i的地址*/则下面两个赋值语句作用相同:i=5;*ip=5;第2个语句的含义是将5赋给指针变量ip所指向的变量。●结论:因为*ip与i等价。所以x=i+3;与x=*ip+3;也等价。 三、取地址运算符“&”运算符“&”与一个变量连用,可以得到该变量的内存地址。如:&a、&x[1]●说明取地址运算符只能作用于变量,如:&x,&a[5];不能作用于常量、表达式或寄存器变量,如“&25,&(i+1);”是错的。(2)不能把整数赋值给一个指针变量。如:int*ip;ip=3000;是错的。为什么?(3)不能把一个指针变量的值赋值给一个整型变量.如:int*ip,x;x=ip;是错的。为什么? [例J9.1]:“*”运算符和“&”运算符用法的例子。#include(演示)voidmain(){floatx;/*x是一个实型变量*/float*p=&x;/*定义指针变量p,将实型变量x的地址传给p*//*也可以写成:float*p;p=&x;*/x=7.10;printf("Theaddressofxis%xThevalueofpis%x ",&x,p);/*以十六进制形式显示x的地址和p的值*/printf("Thevalueofxis%fThevalueof*pis%f ",x,*p);}/*输出x的值和指针xptr所指向的变量x的值*/运行结果为:Theaddressofxisffd6Thevalueofpisffd6Thevalueofxis7.100000Thevalueof*pis7.100000 四、指针变量的赋值和引用1、指针变量的赋值● 指针变量在使用之前不仅要定义而且必须赋值。未经赋值的指针变量(称为:浮动指针)不能使用,否则将造成系统混乱,甚至死机。● 指针变量只能赋予变量的地址值。例如,可以用以下两种方式给指针赋值:(1)用指针变量初始化的方法,即:inta;int*p=&a;(2)用赋值语句的方法:inta;int*p;p=&a;●同类型的指针变量可以相互赋值:例如:int*p1,*p2,i;p1=&i;p2=p1 ●说明:(1)指针变量定义后,若不赋值,其值是不确定的(浮动)。(2)可以给指针变量赋空值(NULL),使指针变量不指向任何变量,例如:#defineNULL0int*pip=NULL;(3)指针的值为空(NULL)与浮动指针意义是不同的。(4)指针变量的值是它所指对象在内存中的地址,利用运算符“&”可得到该对象的地址。(5)利用指针可以间接访问对象,这是通过运算符“*”实现的。(6)不能将一个整型量(或任何其他非地址类型的数据)赋给一个指针变量。例如:int*p;p=1000;是错误的。(7)被赋值的指针变量前不能再加“*”说明符,如写为*p=&a也是错误的。因为*p表示变量的值。 2.指针变量的引用●说明⑴“&”既能作用于一般变量,也能作用于指针变量;但“*“只能作用于指针变量。⑵表达式中的*p与变量定义中的*p含义不同,如有以下语句:inti,*p=&i;/*定义一个指针p,其值为变量i的地址*/*p=5;/*给变量i赋值*/又假设:inti=200,x;int*ip;ip=&i;假设变量i的地址为1800,以后便可以通过指针变量ip间接访问变量i,例如:x=*ip;运算符“*”可以访问以ip为地址的存储区域,而ip中存放的是变量i的地址。因此,*ip访问的是地址为1800的存储区域(因为是整数,实际上是从1800开始的两个字节),它就是i所占用的存储区域。所以,上面的赋值表达式等价于:x=i; (3)指针变量中的值是可以改变的。改变他的值就是改变它的指向。如:inti,j,*p1,*p2;i=’a’;j=’b’;p1=&i;p2=&j;如图10.7若执行p2=p1;则p2与p1指向同一变量i,,如图9.8若执行*p2=*p1;相当于:j=i;。如图9.9所示。图9.8图9.7图9.9 4)指针变量可出现在表达式中。若有定义:intx,y,*px=&x;则*px可以出现在表达式中:y=*px+5;/*表示把*px中的内容加5并赋给y*/y=++*px;/*右结合,px的内容加上1之后赋给y,++*px相当于++(*px)*/y=*px++;/*运算符右结合,等价于*(px++),括号中后置运算,故先*//*做y=*px;再做px++;于是px指向下一个整型变量了*/ [例J9-2]指针与++、---的结合(演示)#includevoidmain(){inti,j,k,m,*p=&i;i=5,j=8;printf("Thevalueof++*pis%d ",++*p);printf("Thevalueofpis%x ",p);k=*p++;/*执行后P指向下一个变量了*/m=*p;printf("Thevalueofp++is%x ",p);printf("%d,%d ",k,m);getch();}运行结果:Thevalueof++*pis6Thevalueofpisffc8Thevalueofp++isffca6,8 ●指针变量的引用举例阅读P179例L9.1a),注意到变量a,b的值并没有改变.阅读P179例L9.1b),注意到变量a,b的值已经改变了。●指针变量的引用方法:(1)将变量的地址赋给指针变量(p1=&a1)。(2)将一个指针变量赋给另一个指针变量(p2=p1;)。(3)通过指针变量间接访问它所指向的变量(*p1)。 五、指针变量作为函数的参数有两种不同的方式把实参值传递给被调函数的形参:●一种是前面所讲的传递实参的值;●另一种方式就是传递实参的地址。由于被调函数接收到的值是实参的地址,所以在被调函数执行过程中就可以引用这个地址而修改主调函数中相应实参变量的值。[P182页例L9.2]用传值方式和传址方式编写一个程序,输入两个整数a、b,按大小顺序输出。(1)按“传值”调用方式编写程序并不能达到目的。因为C语言中的“参数值传递”是“单向传递”方式。即:主调函数可以将实参的值传递给被调函数的形参,但不能通过改变形参的值而改变实参的值。●阅读P182页程序。(2)按“传址”调用方式编写程序能得到正确的结果。●阅读P183页程序 ●分析下面的程序是否能交换变量的值?[例J9-3]#includevoidswap(int*px,int*py){int*temp;*temp=*px;/*危险*/*px=*py;*py=*temp;}voidmain(){inta,b,*p1,*p2;printf(" Inputa,b:");scanf("%d,%d",&a,&b);p1=&a;p2=&b;if(avoidswap(int*px,int*py){int*p;p=px;px=py;py=p;}voidmain(){inta,b,*p1,*p2;printf(" Inputa,b:");scanf("%d,%d",&a,&b);p1=&a;p2=&b;if(apf2表示pf1处于高地址位置(后面);pf1voidmain(){inta[5]={3,5,7,9,11};inti,*p;p=a;printf("%d ",p[2]);printf(“%d ”,*(p+2);getch();}运行结果:772、通过指针变量引用数组元素时应注意的问题: 3、如何使用数组指针()(1)可以使用p++使指针变量p的值不断改变,例如:for(p=a;p<(a+10);p++)printf("%4d",*p);(2)注意指针变量的运算:若p指向数组的开始,即:p=a;则:①p++;使p指向下一元素,即:a[1];②*p++;*p++相当于*(p++),若p=&a[0],则先取*p的值、即a[0]的值,再使p+1,p指向a[1],而:*(++p)为先使p=p+1,p指向a[1],*(++p)取出a[1]的值。●设指针变量指向数组的第i号元素,则:*(p--)相当于a[i--];先取a[i],再指向a[i-1]*(++p)相当于a[++i];*(--p)相当于a[--i]。 ③(*p)++表示p所指向的元素值加1,(*p)--表示p所指向的元素值减1。但:*(p)++;与*p++等价。*(p)––;与*p--等价。[例J9-5](演示)#includevoidmain(){inti,j,k,*p1,*p2,*p3;inta[5]={1,5,10,15,20};p1=a;p2=p1;p3=p1;i=*(p1)++;printf("a[0]=%d ",a[0]);j=(*p2)++;printf("a[0]=%d ",a[0]);k=*p3++;printf("%d,%d,%d,%d ",a[0],i,j,k);}运行结果:a[0]=1a[0]=22,1,1,2 三、通过指针在函数间传递一维数组1.数组元素作为函数参数:voidswap(intx,inty);swap(a[1],a[2]);2.数组名作为函数参数:当实参、形参均为数组名时,调用时会将实参数组首地址传递(单向)给形参数组,形参和实参指向同一数组。voidf(intx[],intn);f(a,10);●C语言编译系统将数组名作为指针变量来处理的,例如:voidf(int*x,intn);inta[10];x=a;x[i]等效于*(x+i)若在函数调用期间改变了数组某一存储单元的内容,则在函数调用完毕后,已改变的值将被保留下来。●阅读P191页[例9-7] 3、用指针变量替代数组名作为函数的参数(1)形参和实参都用数组名,例如:定义:f(intx[],intn);调用:f(a,10);(2)实参用数组名,形参用指针变量,例如:定义:f(int*x,intn);调用:f(a,10);(3)形参和实参都用指针变量,例如:定义:f(int*x,intn);调用:f(p,10);p=a;(4)实参为指针变量,形参为数组名,例如:定义:f(intx[],intn);调用:f(p,10);阅读P194页,例9-8至例9-10 四、指向二维数组的指针和指针变量考察二维数组a[3][4]:01234567891011其定义为:inta[3][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11}}巩固概念:二维数组a由3个名为:a[0]、a[1]、a[2]的一维数组组成。a[0]a[1]a[2]都是地址,不是元素,二维数组元素应带2个下标。1、二维数组的地址上述:●二维数组名a中存放着二维数组的首地址。●3个一维数组名a[0]、a[1]、a[2]分别存放着3个行的首地址。a是第0行的首地址a[0];a[0]+0是数组元素a[0][0]的地址a[0]+1是数组元素a[0][1]的地址a[0]+2是数组元素a[0][2]的地址a[0]+3是数组元素a[0][3]的地址a+1是第1行的首地址a[1];a+2是第2行的首地址a[2]; ●地址:a,a[0],*(a+0),*a,&a[0][0]是等价的。a+1,a[1],*(a+1),&a[1][0]是等价的。●推广:a+i,a[i],*(a+i),&a[i][0]是等价的。特别别扭之处:a+i、*(a+i)怎么是一个地址呢?*(a+i)不是表示变量a的值吗?注意:此处a是二维数组名,在二维数组中就有此规定。还有如下别扭之处:&a[i]和a[i]也是等同的。因为在二维数组中不能把&a[i]理解为元素a[i]的地址,不存在元素a[i]。表示二维数组a第i行首地址。由此可见:a[i],&a[i],*(a+i),a+i也都是等价的。由于*(a+1)都是第1行元素的首地址,故*(a+1)+1是元素a[1][1]的地址。●于是:*(*(a+1)+1)才是元素a[1][1]的值。此处a是二维数组!●阅读P199页例9-12 二、指向二维数组的指针变量设有二维数组:inta[3][4]可以做如下定义:inta[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};int(*p)[4];/*定义二维数组指针p*/p=a;/*p指向二维数组a*/▲二维数组指针说明的一般形式为:类型说明符(*指针变量名)[长度]“类型说明符”:所指数组的数据类型。“长度”:也就是二维数组的列数。“*指针变量名”两边的圆括号不可少,如缺少圆括号则表示是指针数组。 对于:int(*p)[4];▲说明:*p有4个元素,每个元素为整型,p所指的对象是有4个整型元素的数组,p为行指针。p只能指向一个包含4个元素的一维数组,p的值就是该一维数组的首地址。P不能指向一维数组中的元素.p+i表示二维数组中第i行的地址,于是:*(p+i)+j表示第i行第j列元素的地址;*(*(p+i)+j)即数组元素a[i][j]。 [例10-18]:二维数组指针变量的应用。通过指针输出二维数组的所有元素,程序如下:voidmain(){inta[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};int(*p)[4];inti,j;p=a;for(i=0;i<3;i++){for(j=0;j<4;j++)printf("%2d",*(*(p+i)+j));printf(" ");}}程序运行结果为:01234567891011五、通过指针在函数间传递多维数组(略,学生可自学) §9.4指针与字符串一、通过指针访问字符串1.有关概念(1)字符串与一维字符数组等价。(2)字符串的指针:存放字符串的字符数组的首地址。(3)指向字符串的指针变量:是专门用来存放字符串指针的变量。(4)字符串指针变量的定义与赋值:char*p,str[30];p=str;或者:p=&str[0];2、通过字符串指针变量访问字符串字符串中字符的逐个引用2)字符串中字符的整体引用 3、字符串的表示(1)用字符数组表示,例如:staticchars[]="Iamastudent!";作用是:将字符串中的各字符和结束标志‘’存放到数组s的各元素中,数组的首地址用数组名s表示(s是一个指针常量)。(2)将字符数组名赋给指针变量,例如:staticchars[]="Iamastudent!";char*p;p=s;作用是:将字符串在内存中的首地址赋给指针变量p(3)将一个字符串常量赋给指针变量,例如:char*cp;cp=“Hello,world!”;或:char*cp="Hello,world!";作用是:将字符串在内存中的首地址赋给指针变量cp 4、指针处理字符串举例●阅读P205页例9-17的(2)用指针法将A复制到B。5、字符串指针变量与字符数组使用的比较:①存储内容不同:字符串指针存放字符串的首地址;字符数组存放字符串本身,每个数组元素存放一个字符。②赋值方式不同:可以对指针变量名直接赋值;不能对数组名直接赋值如:char*p;p="Thisisaexample.";或者:char*p="Thisisaexample.";但是:charchar_array[20];char_array="Thisisaexample.";/*对数组名赋值非法,只能逐个元素赋值*/ ③指针变量的值可以改变,可以指向不同的字符串,而字符数组名是一个地址常量,不能改变。 5、函数指针变量函数经过编译后,其中的变量、数据存放到数据区,语句变成了二进制指令代码,存放在一片连续的内存区域,这片区域的首地址就存放在地址常量——函数名中。调用函数时,由函数名找到该函数的指令码而执行函数语句。与用指针执向数组名而存取数组数据一样,可以用一个指针指向函数名,通过函数指针找到并调用这个函数。●函数指针变量:指向函数入口地址的指针变量。(1)定义:类型说明符(*指针变量名)()类型说明符:被指向的函数返回值的类型;()表示是指向函数的指针。例如:int(*pf)();定义函数指针变量pf.intfun(intx,inty);定义函数fun.pf=fun;将指针pf指向函数fun.z=(*pf)(i,j)由指针调用函数fun. ●阅读P208页例9-19.(演示)intmax(inta,intb){if(a>b)returna;elsereturnb;}#includevoidmain(){int(*pmax)();/*定义函数指针*/intx,y,z;pmax=max;/*给函数指针赋值*/printf("inputtwonumbers: ");scanf("%d,%d",&x,&y);z=(*pmax)(x,y);/*利用函数指针调用函数*/printf("maxmum=%d",z);} (2)用函数指针变量调用函数的步骤如下:●先定义函数指针变量。●把被调函数的入口地址(函数名)赋予该函数指针变量。●用函数指针变量形式调用函数。●注意:(1)函数指针变量不能进行算术运算。。(2)函数调用中“(*指针变量名)”的两边的圆括号不可少,其中的“*”不应该理解为求值运算,在此处它只是一种表示符号。 6、指针型函数函数的返回值可以是:字符型、整型、实型,事实上函数还可以返回一个指针值,●指针型函数:返回值是指针的函数。P212页例9-22就是一个指针函数的例子。●指针型函数的定义:类型说明符*函数名(形参表){……/*函数体*/}“*”:表明这是一个指针型函数,“类型说明符”:表示返回的指针所指向的数据类型。●阅读P213页例9-23 7、指针数组和指向指针的指针一、指针数组的概念前面的学习中,数组元素可以是整型、实型、字符型,事实上,数组元素还可以是指针。指针数组:一组有序的指针的集合。●指针数组的所有元素都必须是指向相同数据类型的指针变量。●指针数组的定义:类型说明符*数组名[数组长度]“类型说明符”:指针指向的变量的类型。例如:int*pa[3];表示pa是一个指针数组,它有3个数组元素,每个元素值都是一个指针,它们都指向整型变量。 ●指针数组和二维数组指针的区别二维数组指针是单个的指针变量,如:int(*p)[3];表示一个指向二维数组的指针变量P。该二维数组的列数为3,P指向二维数组的第0行;P+1指向第1行;P+i指向第二维数组的第i行。而指针数组,如int*p[3];表示p是一个指针数组,有3个下标变量p[0],p[1],p[2]均为指针变量。它可以分别指向二维数组的各行。如:inta[3][3];int*p[3];p[0]=a[0];p[1]=a[1];p[2]=a[2];●阅读P214页例9-24指针数组可以方便地表示一组字符串,这时指针数组的每个元素被赋予一个字符串的首地址。如:Char*pc[3]={“China”,”Korea”,”Australia”};当字符串长度不同时,用指针数组指向字符串比字符数组存放更节省存储空间。●阅读P215页例9-25,例9-26 二、指向指针的指针指针可以指向其它的变量,它能否指向另一个指针变量呢?回答是肯定的。如果一个指针变量中存放的是另一个指针变量,则称这个指针变量为指向指针的指针变量。●指向指针的指针变量定义:char**p;如:#includevoidmain(){char*name[3]={"BASIC","FORTRAN","PASCAL"};/*定义指针数组*/char**p;inti;for(i=0;i<3;i++){p=name+i;/*指针变量P中存放的是字符串的地址指针*/printf("%s ",*p);}} P220页例9.29:一个指针数组的元素指向数据的简单例子:#includevoidmain(){staticinta[5]={1,3,5,7,9};int*num[5]={&a[0],&a[1],&a[2],&a[3],&a[4]};int**p,i;p=num;for(i=0;i<5;i++){printf("%dt",**p);p++;}}程序运行结果为:13579说明:指针数组的元素只能存放地址。 三、main函数的参数系统传给main函数的参数;命令行的一般形式是:命令名参数1参数2…参数nargc:整型变量,表示命令行中参数的个数(argc=1表示命令行只有命令,没有参数)argv:字符指针数组,argv[0]是命令名字符串的地址,argv[1]是参数1字符串的地址…。第七节多级指针和命令行参数54 例在屏幕上回显命令的参数,设源文件名为echo.cmain(intargc,char*argv[]){inti;for(i=1;iechoHowareyou!那么程序的运行结果如下:Howareyou!在程序的运行过程中,系统传递给main()函数的参数个数是4,即argc的值是456 指针小结int*p;指向整型量的指针int(*p)[4];指向一维整型数组的行指针int(*p)();指向函数的指针int*p();返回指针值的函数int*p[4];指针数组,由4个指针元素组成int**p;指向指针的指针注意:指针在使用前一定要有明确的指向优点:灵活、可实现动态存储分配缺点:易出大错57

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
关闭