




免费预览已结束,剩余71页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第九章指针,常州信息职业技术学院软件学院主讲教师:李春华,2,教学要求、重点与难点,教学要求1、了解地址与指针的概念;2、掌握指针变量的定义与使用;3、掌握将一个变量或数组的地址赋给指针类型的变量;4、掌握通过指针类型的变量去访问某个变量或数组元素的值。重点与难点1、指针变量的定义与引用;2、指针与数组;3、指针与函数,3,内容,2指针变量的定义与引用,3指针与数组,4指针与字符串,本章小结,本章作业,1指针的概念,6返回指针的函数,7指针数组与指向指针的指针,8动态内存分配与回收,5指针与函数,4,指针,指针是C语言的一个重要概念,也是C语言的一个重要特色。深刻理解和正确使用指针是学习本章的基本要求。,5,9.1指针的概念,一、地址在计算机中,把内存区划分为一个一个的存储单元,每个单元为一个字节(位),它们都有一个编号,这个编号就是内存地址。如下图所示:,注意:1、程序中定义的每个变量在编译时分配内存单元,系统通过内存地址对变量进行存取。2、数据所占有的存储单元个数是由其类型决定的。3、首地址:第1个单元的地址4、表示地址的数与整数的区别,6,9.1指针的概念,二、举例如有定义:charc=A;inta=3;则所占内存情况如下:,注意:c和a的地址可能相邻,也可能不相邻,是由系统分配的,我们不用关心。,00000011,7,9.1指针的概念,三、指针与指针变量1、指针:简单地说,指针就是地址。二者是同一个概念的两种说法。只不过指针更形象一些,就像一个针一样,可以指向某个内存单元。什么是指针变量呢?我们回忆一下什么叫整型变量2、指针变量:首先指针变量就是一个变量,和我们以前所讲的其它变量没有本质区别。不同之处在于这种变量中所存放的内容是地址。,8,9.1指针的概念,打个比方,四、直接访问和间接访问有两个上锁且放着物品的盒子A、B:如果你有A盒子的钥匙,则可以直接打开A盒子将物品取出;如果你有B盒子的钥匙,而A盒子的钥匙在B盒子中,要想取出A盒子中的物品,则必须先打开B盒子,取出A盒子的钥匙,再打开A盒子将物品取出。上面两种情况就是直接访问和间接访问的概念。,9,9.1指针的概念,1、直接访问通过变量本身对变量进行存取的方式,称为直接访问。如定义:intx;则x=10;x+=5;等等这种访问方式只需要变量本身就得到了该变量的全部信息,不需要其它内容,是直接的。2、间接访问通过指针变量实现对变量的访问方式,称为间接访问。首先要定义一个指针变量,然后将一个同类型变量的地址赋给该指针变量(这时我们称指针变量指向该变量),这样就可以进行间接访问了。间接访问的过程是:由指针变量得到变量的地址,根据该地址找到变量的存储区,再对该存储区的内容进行存取,从而实现了对变量的间接访问。,10,9.2指针变量的定义和引用,一、指针变量的定义和赋值1、格式:类型名*指针变量名;2、举例int*p1;char*s1,*s2;float*a1,*a2,f;3、说明a.类型名:指针变量所指向的变量类型。b.*是定义指针变量的标志,不可丢掉。c.指针变量定义后,其值是不确定的。,11,9.2指针变量的定义和引用,4、赋值:可以进行初始化,也可以使用赋值语句(1)、初始化:inta,*s=是错误的。,12,9.2指针变量的定义和引用,不定,在分析有关指针的程序时,画图是很好的方法:,若有:inta,*s;则,s,a,若有:inta=5,*s=则,不定,5,int*p1,*p2;p1=,9.2指针变量的定义和引用,p1,int*p1,*p2,*p;p1=,9.2指针变量的定义和引用,p1,int*p1,*p2;p1=,9.2指针变量的定义和引用,p1,main()inta=11,*p=,9.2指针变量的定义和引用,20,例10-5swap(int*p1,int*p2)intt;t=*p1;*p1=*p2;*p2=t;/*交换a,b的值*/main()inta,b,*p1,*p2;scanf(“%d,%d”,9.2指针变量的定义和引用,21,在语言中,指针与数组有着密切的关系。对数组元素,既可以采用数组下标来引用,也可以通过指向数组元素的指针来引用。采用指针方法处理数组,可以产生代码长度小、运行速度快的程序。一、通过指针访问一维数组1、数组结构的分析设有数组定义为:inta5;则有:(1)a表示数组在内存中的首地址,也就是数组中第1个元素的首地址,它是一个地址常量,其值由系统在编译时确定,程序运行期间不能改变。(2)数组中的各元素表示为:a0、a1、a2、a3、a4或者是:*(a+0)(或*a)、*(a+1)、*(a+2)、*(a+3)、*(a+4),9.3指针与数组,22,(3)数组中的各元素的地址表示为:并进行赋值:s=a;或s=则,指针变量s指向了数组a的开始,二者产生了联系,这样就可以通过指针变量s访问数组a了。注意:a是指针常量,s是指针变量。,9.3指针与数组,a,或s=效果与上述相同。,9.3指针与数组,a,for(i=0;i5;i+)printf(“%d”,ai);/*下标法*/for(i=0;i5;i+)printf(“%d”,*(a+i);/*数组名+下标*/for(i=0;i5;i+)printf(“%d”,pi);/*指针下标法*/for(i=0;i5;i+)printf(“%d”,*(p+i);/*指针+下标*/for(;pa+5;p+)printf(“%d”,*p);/*指针的移动*/p=a;while(pa+5)printf(“%d”,*p+);/*指针的移动*/,9.3指针与数组,27,4、几个表达式的分析设定义:staticinta3=1,2,3,*s=a;s,*sa,*as+,*s+,a+,*a+*(s+),(*s)+*(a+),(*a)+初始化时的*s=a;与语句*s=a;的不同一个指针变量加/减一个整数后,指针变量值的变化情况,9.3指针与数组,错误,错误,错误,28,二、数组名作函数参数1、数组名作函数形参与实参的一般形式函数类型函数名(类型数组名,intn)函数名(数组名,n)函数体;也可以写为:类型函数名(类型*指针名,intn)函数名(数组名,n)函数体;例如:intfunc(intarray,intn)inta10;func(a,10)函数体;也可以写为:intfunc(int*pointer,intn)inta10;func(a,10)函数体;,9.3指针与数组,29,2、函数的说明形式如有函数定义:intfunc(intarray,intn)函数体;则对该函数的说明形式可以写为:intfunc(intarray,intn);intfunc(int*array,intn);intfunc(int,int);intfunc(int*,int);intfunc();,9.3指针与数组,注意:作为形参定义的数组名是一个指针变量,它在函数体中可以变化,这一点与变量定义时不同。,30,例10-7编写在数组的最后一个元素中存放其它元素和的函数#includevoidsummary(int*p,intn);main()staticinta11=1,2,3,4,5,6,7,8,9,10;summary(a,10);printf(“Sumis%dn”,a10);voidsummary(int*p,intn)ints=0;while(n-)s+=*(p+);*p=s;,9.3指针与数组,函数还可写为:voidsummary(intarr,intn)inti,s=0;for(i=0;in;i+)s+=arri;arrn=s;,31,例10-8调用子程序,实现求解一维数组中的最大元素#includemain()intsub_max();/*函数声明*/intn,a10,*ptr=a;/*定义变量,并使指针指向数组*/intmax;for(n=0;n=10-1;n+)/*输入数据*/scanf(%d,9.3指针与数组,32,/*函数定义,其形参为数组*/intsub_max(intb,inti)inttemp,j;temp=b0;for(j=1;j=9;j+)if(tempbj)temp=bj;returntemp;,9.3指针与数组,/*函数定义,其形参为指针*/intsub_max(int*b,inti)inttemp,j;temp=b0;for(j=1;j=9;j+)if(tempbj)temp=bj;returntemp;,33,例10-9用指向数组的指针变量实现一维数组的由小到大的冒泡排序。编写三个函数用于输入数据、数据排序、数据输出。#include#defineN10main()voidinput();/*函数声明*/voidsort();voidoutput();intaN,*p;/*定义一维数组和指针变量*/input(a,N);/*数据输入函数调用,实参a是数组名*/p=a;/*指针变量指向数组的首地址*/sort(p,N);/*排序,实参p是指针变量*/output(p,N);/*输出,实参p是指针变量*/,9.3指针与数组,34,voidinput(intarr,intn)/*无需返回值的输入数据函数定义,形参arr是数组*/inti;printf(inputdata:n);for(i=0;i*(ptr+j+1)/*相邻两个元素进行比较*/t=*(ptr+j);/*两个元素进行交换*/*(ptr+j)=*(ptr+j+1);*(ptr+j+1)=t;,9.3指针与数组,35,voidoutput(intarr,intn)/*数据输出*/inti,*ptr=arr;/*利用指针指向数组的首地址*/printf(outputdata:n);for(;ptr-arrn;ptr+)/*输出数组的n个元素*/printf(%4d,*ptr);printf(n);,9.3指针与数组,36,实参形参1数组名数组名2数组名指针变量3指针变量数组名4指针变量指针变量,9.3指针与数组,实参与形参的对应关系小结:,37,三、指向多维数组的指针1、二维数组结构的分析设有数组定义为:inta34;则有:a表示数组在内存中的首地址,也就是数组中第1个元素(也是第一行)的首地址,它是一个地址常量,其值由系统在编译时确定,程序运行期间不能改变。该二维数组可以理解为:它是一个一维数组,含有3个元素,每个元素又是一个一维数组,该一维数组含有4个元素,每个元素是int类型。,9.3指针与数组,38,二维数组的逻辑结构图如下:,9.3指针与数组,a0,a1,a2,a+0,a+2,a+1,39,2、指向二维数组中一行的指针变量(1)格式:类型名(*指针变量名)长度;(2)例如:int(*pa)4;(3)含义:pa是指针变量,它指向一个数组,数组含有4个元素,每个元素的类型是int。(4)说明:a.与定义int*pa;以及int(*pa)4;含义不同。b.如果执行pa+,则pa实际增加了多少呢?,9.3指针与数组,pa实际增加了2*4=8个字节,40,9.3指针与数组,c.若定义:inta34,(*pa)4=a;则关系图为:,a,pa,(*pa)0(*pa)1(*pa)2(*pa)3,如果执行pa+,则变为如图所示,pa,pa,第一行各元素还可以表示为,那么(*pa)0、(*pa)1、(*pa)2、(*pa)3也变了,41,9.3指针与数组,3、几个表达式由xi*(x+i)和float*p,a22;p=a;for(i=0;i4;i+)scanf(%f,p+);for(i=0;i2;i+)for(j=0;j2;j+)printf(%4.1f,aij);printf(n);,43,9.3指针与数组,例10-11用各种方法访问二维数组各元素#includemain()staticintaa34=1,2,3,4,5,6,7,8,9,10,11,12;inti,j,*p,(*pa)4;/*第一种方法*/for(pa=aa,i=0;i3;i+)printf(“n”);for(j=0;j4;j+)printf(“%5d”,paij);,44,9.3指针与数组,/*第二种方法*/for(pa=aa;paaa+3;pa+)printf(“n”);for(j=0;jb?a:b);intmin(inta,intb)return(a=a,60,9.7指针数组和指向指针的指针,一、指针数组1、指针数组的概念指针数组是一种特殊的数组,它每个元素的类型都是指针类型(即地址),其它与一般数组相同。当把某个量的地址放入某元素中后,即可通过该元素对相应的量进行间接访问。2、指针数组的定义类型名*指针数组名常量表达式;如:int*ap3;char*s10;等等。,61,9.7指针数组和指向指针的指针,3、指针数组的初始化(1)inta15,a25,a35,*ap3=a1,a2,a3;(2)char*sp=“abc”,“123”,“Hello”;4、指针数组的赋值上面的情况中,可以先定义变量,再进行赋值,即(1)inta15,a25,a35,*ap3;ap0=a1;ap1=a2;ap2=a3;(2)char*sp3;sp0=“abc”;sp1=“123”;sp2=“Hello”;,62,9.7指针数组和指向指针的指针,例10-18显示多个字符串#includemain()/*用指针数组实现*/staticchar*ap3=“CPU”,“Computer”,“Microprocessor”;inti;for(i=0;imain()/*用二维字符数组实现*/staticcharaa315=“CPU”,“Computer”,“Microprocessor”;inti;for(i=0;i=0,67,9.7指针数组和指向指针的指针,三、命令行参数1、命令行参数的概念1)DOS命令:copyfile1file22)以前的main函数形式:main()3)main函数的调用由系统完成4)带参main函数:main(intargc,char*argv);或main(intargc,char*argv);,68,9.7指针数组和指向指针的指针,2、命令行参数的说明1)形参也可以用其它名字,习惯上为argc和argv2)argc和argv的值的获得如有程序myprog.c,经编译和链接生成可执行程序myprog.exe,在命令行中输入:myprogargument1argument2则argc的值为3,argv0的值为“myprog”,argv1的值为“argument1”,argv2的值为“argument2”。3)实现:DOS提示符状态下或集成环境中。,69,9.7指针数组和指向指针的指针,例10-20输出各命令行参数#includemain(intargc,char*argv)inti;for(i=1;i4,71,9.7指针数组和指向指针的指针,initgraph(/*关闭图形工作方式*/假设生成L9-22.exe文件,则命令行方式为:L9-22pass40203,72,9.8动态内存分配与回收,由变量的作用域和存储类别知道,内存变量都有生存期,以前接触的变量,其内存的分配及释放都是由系统统一管理的。这一节我们介绍如何实现自己对变量空间的申请和释放。动态内存分配可以提高内存的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 妇幼保健试题库及答案
- 扭矩系数试验课件
- 扫地车安全教育培训总结课件
- 2025年注会会计考试真题及答案
- 2025年中职护理基础考试试题及答案
- 2025年化工职称考试试题及答案
- 2025年体育教育自考试题及答案
- 情景课件教学课件
- 泰安数学中考试题及答案
- 悯农重点课件
- 道路运输安全员考试题库及答案
- 2025年全国高考一卷英语真题(解析版)
- 2025年秋期新教材部编人教版一年级上册道德与法治教学计划+进度表
- 2025年北师大版新教材数学三年级上册教学计划(含进度表)
- 港珠澳大桥总体设计及关键技术-课件
- 舌尖上的历史与文化智慧树知到期末考试答案2024年
- 王崧舟教学实录——《圆明园的毁灭》
- 商业银行资产减值准备计提管理办法
- 浅谈部门预算编制存在的问题及建议
- 常规保养双人作业流程新模板汇总
- 数字化管道综述
评论
0/150
提交评论