复习第5章市公开课金奖市赛课一等奖课件_第1页
复习第5章市公开课金奖市赛课一等奖课件_第2页
复习第5章市公开课金奖市赛课一等奖课件_第3页
复习第5章市公开课金奖市赛课一等奖课件_第4页
复习第5章市公开课金奖市赛课一等奖课件_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

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

文档简介

第5章指针指针是变量在内存中地址。计算机内存是一个连续编号或编址空间。也就是说,每一个存放单元(在微型计算机中通常是一个字节)都有一个固定编号,这个编号称为地址。专门用来存放地址变量就是指针变量。指针变量和普通变量共同点是:它们都代表内存中某个存放单元,在内存中都被映射为地址;不一样之处于于:普通变量存放单元中存放是数据,而指针变量存放单元中存放是地址第1页相关地址运算&v,v是变量或数组元素访问地址运算是使用访问地址运算符*和[]来访问指定内存地址中数据(1)*运算符是一元运算符,它格式以下:*add,add是地址量,如变量或数组元素地址、数组名、指针变量等(2)[]运算符是二元运算符,它格式以下:add[exp],add是地址变量,通常是数组名或指向数组指针;exp是整型表示式第2页重点C语言要求在程序中对变量先定义后使用,目标是在编译时就能为这些变量分配内存空间。没有定义变量是不能访问不一样数据类型变量或数组占用存放空间字节数是不一样。比如,整型变量要占两个字节存放单元,而每一字节都有一个地址,变量地址是指该变量所占存放空间首字节地址数组名代表该数组占用一片连续存放空间首地址,它是一个常数。因为各元素在内存中是次序存放,所以可依据某个数组元素地址取得其它元素地址。指向数组指针正是利用这一点,经过指针移动来访问各个数组元素第3页重点比如,定义了一个简单变量a,它地址为&a,能够用*&a来访问a中数据,也能够用(&a)[0]来访问a中数据,但不能用*a或a[0]来访问,因为a不是地址量若d是整型数组,则d[1]表示从d起始地址开始向高地址方向移动一个数据单元,即两个字节后数据单元值C语言对多维数组是采取递归方式定义。比如,二维数组a[4][3]能够看做由a[0],a[1],a[2],a[3]这四个元素组成一维数组,而这一维数组每个元素又都是包含三个元素一维数组。依据递归定义,a[0],a[1],a[2],a[3]都是一维数组名,它们分别代表数组a第一行到第四行首地址,称为行地址,每行中又包含若干个列地址第4页重点*和[]都是访问地址运算符,它们是等价。指针数据类型包含int,float,char,double,void五种基本类型,指针定义中”*”是指针说明符,而不是访问地址运算符,也不是乘法运算符使指针指向对象,是将该对象地址存入指针变量中。第5页重点指针变量是用来存放地址,而指针本身也有自己地址。所以,指针本身地址与指针中存放地址是不一样charp=&c;charc;是错误,所以编译charp=&c时,变量c还未安排存放单元,它地址不存在。Floata,*p;p=a;是错误,应:p=&a;第6页难点将int型指针指向char型数据对象是错误Int*ip;char*cp;ip=cp;是错误。空指针,也叫NULL指针,是指已经定义但未指向数据对象指针;void型指针,也叫无值类型指针,是仅表示指向内存某个地址而未说明指向何种类型数据指针第7页指针运算假如两个指针之间存放是相同类型数据(通常是数组情况),则这两个指针能够相减,结果是这两个指针之间包含数据对象个数。尤其是,当一个指针与NULL进行相等或不等比较时,能够判断该指针是否为空指针。If(p!=NULL)printf(“%d\n”,*p);表示当p不是空指针时,就显示该指针所指存放单元值第8页难点指针与整数相加减能够移动指针,这种移动指是内存地址改变,而不是真有一个指针在内存中移动Inta[5],*p=a;使p指向数组a第一个元素a[0],即p中存放是a[0]地址。P+1就是a[1]地址。P+1与++p是不一样,假如p指向a[0],p+1能够得到a[1]地址,但p中存放仍是a[0]地址。但经过p++运算后,p中存放是a[1]地址,也就是说,p已经指向了a[1],而不再指向a[0]。假如定义了指向变量a指针p,则程序中凡是能正确使用变量名a地方,都能够用*p或p[0]来代替第9页重点Main(){inta,b,*p=&a;scanf(“%d%d”,p,p+1);printf(“a=%d,b=%d\n”,*p,*(p+1));}程序中p存放是变量a地址,p+1表示变量b地址,直接使用指针p来输入和输出变量a和b值注意,因为*和++处于同一优先级,结合性均为从右到左,所以(*p)++与*p++是不一样假如定义了变量a及指向它指针p,则p[0]和(&a)[0]都表示变量a值,初学者不要一看到出现了[]就误认为p是一个数组名第10页用指针访问一维数组一维数组存放结构是线性,在内存中占用一片连续存放单元。因为一维数组下标是从0开始,所以p[0]表示数组第1个元素,p[i]表示数组第i+1个元素当用*&p[i]形式指针访问一维数组元素a[i]时,无须加上圆括号,因为[]优先级高于*和&,而*和&处于同一优先级,它们结合性都是从右到左,所以先得到p[i],然后得到&p[i],最终才得到*&p[i]。因为用指针访问数组时,主要是经过指针移动来实施数据访问,所以需要十分警觉,预防越界第11页用指针访问二维数组定义一个指向二维数组指针能够从两个方面考虑:一是按二维数组存放结构考虑,二是从二维数组逻辑结构考虑二维数组在逻辑上是二维空间,不过在内存中则是以行为主序占用一片连续存放空间,其存放结构是一维线性二维数组逻辑结构是一个二维表,横向为一行,纵向为一列。假如定义一个指针指向二维数组一行,则能够移动到下一行,这就是行指针第12页按二维数组逻辑结构定义行指针[存放类型]数据类型(*指针)[n]方括号中n是一个整数,表示所指向二维数组列数假如定义几个指针,使每个指针分别指向二维数组对应行,这就是指针数组。指针数组每一个元素都是指针,实际上是由若干个行指针组成数组,其中每一个元素分别指向二维数组对应行[存放类型]数据类型(*指针数组名)[n]方括号中n是一个整数,表示指针所指向二维数组行数第13页行指针和指针数组共同点行指针和指针数组都是按二维数组逻辑结构定义用行指针和指针数组访问数组元素时地址表示形式和数据访问形式是完全相同,所以掌握其中一个,能够套用到另一个对二维数组而言,数组名、行指针或指针数组都是针对数组逻辑结构。第一次访问地址运算访问是行地址,第二次访问地址运算才能访问到数据第14页难点Inta[3][5],(*p)[5],*p1[3];P=a;P1[0]=a[0],p1[1]=a[1],p1[2]=a[2];用a,p或p1都能访问数组a各个元素,都要进行两次访问地址运算。第一次访问地址运算可得到*(a+i),*(p+i),*(p1+i),a[i],p[i],p1[i]等,它们都表示数组a第i行第0列地址;第二次访问地址运算可得到*(*(a+i)+j),*(*(p+i)+j),*(*(p1+i)+j),*(*(a[i]+j),*(*p[i]+j),*(*p1[i]+j),a[i][j],p[i][j],p1[i][j]等,它们才是真正访问到了数组元素a[i][j]值,其中*(a+i)+j,*(p+i)+j,*(p1+i)+j,a[i]+j,p[i]+j和p1[i]+j都表示数组a第i行第j列地址第15页难点对二维数组a[M][N]而言,a+i,*(a+i),a[i],&a[i]及&a[i][0]都表示该数组第i行首地址,这几个表示形式从数值上是相等,但其含义是不一样。其中,a+i和&a[i]是指向行,它们和数组名一样并不指向详细存放单元,所以不能试图经过对它们再进行一次访问地址运算就能访问它们内容,因为它们没有内容;,*(a+i),a[i],及&a[i][0]是指向列,即指向第i行第0列存放单元,若对它们再进行一次访问地址运算,就能访问a[i][0]值。第16页用指针处理字符串Chars[80],*st=s;st=“Goodmorning”;字符型指针st中存放是字符型数组s首地址。字符串”Goodmorning”被存放在字符型数组s中,于是能够用st代替数组s来处理字符串Char*str;str=“abcd”;printf(“%s\n”,str);str=“efgh”;“abcd”并没有被“efgh”替换,而是”abcd”和”efgh”各自占用自己存放单元,含有不一样起始地址。也就是说,”abcd”所在存放单元已变成不可访问第17页用指针处理字符串Char*st;scanf(“%s”,st);是不正确。因为st并没有指向任何可存放字符串存放单元,st中地址值是随机,使用由它指示起始地址来存放字符串,可能引发意料不到错误因为无名数组元素都没有名字,所以只能经过指针访问;无名数组所占存放空间是由编译系统指定,用户无法控制或改变;一旦指针被重新赋值,它就指向另一个无名数组,原先数组就不能再访问依据字符型指针独立使用上述特点,能够将字符型指针用做中间变量,起字符串变量作用,这在进行字符串排序时是很有用第18页难点每个字符串常量都各有自己起始地址,即使两个完全相同字符串,它们起始地址也是不一样用字符串常量对字符型指针进行初始化或赋值时,指针中存放是无名字符型数组起始地址,对每个数组元素只能用指针访问第19页用指针进行内存动态分配方法和内存动态分配函数第一个使用内存静态存放区和堆栈区,分别存放全局变量和局部变量;第二种使用内存堆或堆栈区,进行内存动态分配,即由用户在程序中经过动态分配获取内存。使用内存动态分配最少有三个优点:一是能够更有效地使用内存,二是同一段内存可作为不一样用途,三是能够用来处理链表等动态数据结构第20页重点Malloc(),calloc()和realloc()函数返回值都是void型指针,也就是说,这三个函数得到是内存单元地址,该地址并未指明存放何种类型数据Int*pi;pi=calloc(100,sizeof(int));是错误因为提供动态分配内存空间并不是无限大,假如在程序中频繁开辟动态内存,提议使用下面程序段,方便在p得到NULL值时能及时处理If((p1=(char*)malloc(80))==NULL)exit(1);Exit函数是C编译系统提供函数,用来在分配不成功时中止程序执行,并返回到操作系统第21页多级指针所谓一级指针,是直接指向数据对象指针,即其中存放是数据地址。所谓二级指针,是指向指针指针,它并不直接指向数据对象,而是指向一级指针,也就是说,二级指针中存放是一级指针地址。类似地,三级指针式指向指针指针指针,三级指针存放是二级指针地址[存放类型]数据类型**指针名,***指针名指针名前面有两个*表示它是一个二级指针,指针名前有三个*表示它是一个三级指针第22页多级指针Inta,*p1a,**p2a;P1a=&a;p2a=&p1a;其中一级指针p1a存放变量a地址,二级指针p2a存放一级指针p1a地址,那么既能够用一级指针p1a访问变量a,也能够用二级指针p2a访问变量a,即a,*p1a或**p2a都表示访问变量a值,三者是等价第23页多级指针charc,*p1c,**p2c,***p3

温馨提示

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

评论

0/150

提交评论