教学课件第9章 指针.ppt
《教学课件第9章 指针.ppt》由会员分享,可在线阅读,更多相关《教学课件第9章 指针.ppt(39页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、教材配套PPT正版可修改课件教学课件第9章 指针LOGO程序设计与问题求解(C语言)第第9 9章章 指针指针计算机基础教学中心计算机基础教学中心本章教学内容及要求本章教学内容及要求(1)指针的概念和指针变量的定义及其基本使用)指针的概念和指针变量的定义及其基本使用 要求初步了解指针可以解决什么问题;理解两种数据访问方式的特点,掌握指针的概念和含义;理解和掌握指针变量的定义形式、基类型、空间分配以及相关运算符,学会初步使用指针访问内存数据的方法。(2)应用指针处理数组数据和字符串数据)应用指针处理数组数据和字符串数据 要求理解和掌握应用指针处理一组数据的优势和基本方法,明确指针运算、指针移动的具
2、体含义,掌握利用指针处理字符串的一般方法。(3)指针作为函数的参数)指针作为函数的参数 要求理解和掌握利用指针作为函数参数实现主调函数和被调函数之间传递单个数据和一组数据的机理和方法,并熟练应用解决具体问题。本章学习重点与难点本章学习重点与难点重点:重点:理解指针的概念,掌握指针变量的定义及其基本使用;应用指针处理一组数据的特点和方法;利用指针作参数实现函数间数据传递;熟练运用指针解决实际问题。难点:难点:使用指针处理一组数据的过程和方法;利用指针作参数传递数据的机理及具体过程和方法;指针在具体问题中的应用。9.1 指针的引入指针的引入观察下面程序,分析函数观察下面程序,分析函数exchang
3、e的功能:的功能:(1)由于变量作用域的限制,函数exchange没能实现实参a、b值的互换。(2)可以通过将a、b的存储地址传递给函数exchange,函数按照地址访问a、b的数据,使之进行互换。(3)这里变量a、b的存储地址就是指针,可以通过指针访问处理a、b的数据。9.2 内存数据的访问方式内存数据的访问方式 有直接访问和间接访问两种方式(1)直接访问方式 按照变量名对其存储单元数据进行存取操作,例如:a=b-2;printf(“%d”,a);(2)间接访问方式 通过变量的存储地址找到其相应的存储单元,进而访问其中的数据。假设已获取变量a、b的存储地址1000和1004并存放在变量x、y
4、中;通过变量x、y找到a、b地址,间接访问a、b数据:*x=*y-2;printf(“%d”,*x);地址1000和1004都是指针,存放指针的变量x、y称为指针变量,x指向了a,y指向了b。9.3 指针变量的定义及其基本使用指针变量的定义及其基本使用(1)什么是指针?什么是指针变量?内存地址称为“指针”存放地址的变量称为“指针变量”,常简称指针。若指针变量x中存放了变量a的地址,称“指针x指向了a”,常形象地用箭头标识。(2)如何定义指针变量?基类型 *指针变量名1,*指针变量名2 *表示该变量为指针变量 基类型限定了所指向变量的类型 例如:int a,b;int*x,*y;x=&a;/*指
5、针变量x指向了a变量*/y=&b;/*指针y指向了b变量*/xy9.3 指针变量的定义及其基本使用指针变量的定义及其基本使用(3)如何使用指针变量间接访问内存数据?利用两个相关运算符:取地址运算符“&”单目运算,作用于变量或数组元素,返回其运算量的内存地址。例如:int a,b10,*p1=&a,*p2=&b0;指针运算符“*”单目运算,其运算量是指针,返回指针所指向的变量的值。例如:*p1=123;/*给p1指向的变量a赋值123,等价于a=123;*/printf(%d,*p1);/*输出p1指向的变量a的值,等价于printf(%d,a);*/9.3 指针变量的定义及其基本使用指针变量的
6、定义及其基本使用例例9.1 使用指针间接访问变量使用指针间接访问变量#include int main()int a,b,*p1,*p2;a=10;b=20;p1=&a;p2=&b;printf(a=%d,b=%dn,a,b);printf(*p1=%d,*p2=%dn,*p1,*p2);/*输出p1、p2指向的变量的值*/*p1=*p1+2;/*将p1指向的变量的值自增2*/*p2=*p2*2;/*将p2指向的变量的值自乘2*/printf(a=%d,b=%dn,a,b);/*输出变量a、b的值*/printf(*p1=%d,*p2=%dn,*p1,*p2);/*输出p1、p2指向的变量的值
7、*/return 0;9.3 指针变量的定义及其基本使用指针变量的定义及其基本使用例例9.2 应用指针间接访问变量应用指针间接访问变量a、b,使二者的数据互换。,使二者的数据互换。#include int main()int a,b,temp;int*x=&a,*y=&b;scanf(%d%d,&a,&b);temp=*x;/*把x指向的变量a的值12取出,存放在temp中*/*x=*y;/*把y指向的变量b的值35取出,赋值给x所指向的变量a*/*y=temp;/*把temp的值12赋值给y指向的变量b*/printf(a=%d,b=%dn,a,b);return 0;9.4 指针作函数的参
8、数更改下面程序,实现a、b值互换。#include void exchange(int x,int y)int temp;temp=x;x=y;y=temp;int main()int a=18,b=30;exchange(a,b);printf(%d,%dn,a,b);exchange(&a,&b);int *x,int*y int temp;temp=*x;*x=*y;*y=temp;输出:30,18(1)方法:实参传递的是指针 形参相应地应是指针变量 函数体中利用指针间接访问主调函数中a、b变量的数据,实现交换。(2)结论:指针作函数的参数,可以使被调函数能够间接处理主调函数中的数据,将
9、处理结果“返回”给主调函数。函数调用时,实参形参结合时本质上仍旧是“单向传值”,但传递的是“地址值”,因此实际达到的结果是数据的“双向传递”。9.4 指针作函数的参数例例9.3 要求编写函数sort3对任意三个整数进行升序排序,然后在主函数中调用它。#include void sort3(int*x,int*y,int*z)int temp;if(*x*y)temp=*x;*x=*y;*y=temp;if(*y*z)temp=*y;*y=*z;*z=temp;if(*x*y)temp=*x;*x=*y;*y=temp;int main()int a,b,c;scanf(%d%d%d,&a,&b
10、,&c);sort3(&a,&b,&c);printf(a=%d,b=%d,c=%dn,a,b,c);return 0;函数体中数据交换也可以调用exchange函数实现,即:void sort3(int*x,int*y,int*z)int temp;if(*x*y)exchange2(x,y);if(*y*z)exchange2(y,z);if(*x*y)exchange2(x,y);9.4 指针作函数的参数例例9.4 编写函数prime_maxmin求任意闭区间a,b内的所有素数的个数以及其中的最大素数、最小素数。分析:(1)函数返回值 需要返回多个结果:素数个数、最大素数、最小素数,这里
11、都将采用指针作形参来“返回”结果,因此,函数返回值类型为void。(2)函数形参 调用函数时需要指出闭区间的上限和下限,故形参应包含 int a,int b;主调函数中使用三个变量存放本函数返回的结果,需要把它们的地址传递给本函数,因此,形参还应包含:int*pcount,int*pmax,int*pmin(3)函数体的实现 穷举闭区间a,b中的每个数,判断其是否为素数,是素数则计数增1;将素数存放在指针pmax指向的变量max中(后续更大的素数覆盖小的);当素数个数为1时,该素数一定是最小素数,将其放入指针pmin指向的变量min中;调用函数prime判断某数是否为素数,是素数返回1,否则返
12、回0。9.4 指针作函数的参数#include int prime(int x)/*判断x是否为素数,是返回1,不是返回0*/int i;for(i=2;ix;i+)if(x%i=0)return 0;return 1;void prime_maxmin(int a,int b,int*pcount,int*pmax,int*pmin)int k;for(k=a;k=b;k+)/*穷举a,b间的所有整数*/if(prime(k)/*判断k是否为素数*/*pcount=*pcount+1;/*若是素数,pcount指向的变量中的数据增1*/*pmax=k;/*素数放在pmax指向的变量中*/if
13、(*pcount=1)*pmin=k;/*如果是第1个素数,一定是最小素数*/int main()int a1,b1,count=0,max,min;scanf(%d%d,&a1,&b1);/*输入任意闭区间的下限a1和上限b1*/prime_maxmin(a1,b1,&count,&max,&min);/*调用函数*/printf(count=%d,max=%d,min=%dn,count,max,min);return 0;9.5 指针变量的各种应用指针与数组(1)数组的存储特点)数组的存储特点 例如,例如,short int b5=2,6,10,7,9,*p2;分配一段地址连续的存储单元
14、 每个元素的地址是其占用的首单元地址 由首元素地址可以计算得到任意元素地址 数组名本质上是一个地址常量,是首元素地址(2)指针指向数组元素)指针指向数组元素 使指针p2指向元素b0:p2=&b0;或者 p2=b;p2+2计算得到b2的地址 p2+使得指针p2移动,指向下一个元素(3)利用指针访问数组元素)利用指针访问数组元素 假设 p2=b;,有多种方法访问b2元素:*(p2+2)=30;*(b+2)=30;/*对程序编译时,系统实际上就是把b2处理成*(b+2),因此,都是以间接方式访问数组元素*/p22=30;/*(p2+2)也可以写成p22*/p2+;p2+;*p2=30;/*不断移动指
15、针,使之指向b2*/数组元素 地址 内存 指针 b0 b1 b2 b3 b49.5 指针变量的各种应用指针与数组例例9.5 输出数组各元素。输出数组各元素。#include int main()int i,a5,*p=a;for(i=0;i5;i+)/*为数组输入数据*/scanf(%d,&ai);for(i=0;i5;i+)/*方法1:采用下标法输出各元素*/printf(a%d=%d,i,ai);/*这里的ai也可以写成*(a+i),二者等价*/printf(n);for(i=0;i5;i+)/*方法2:使用指针法输出各元素*/printf(*(p+%d)=%d,i,*(p+i);/*可以
16、把*(p+i)替换为pi,二者等价*/printf(n);for(p=a;p(a+5);p+)/*方法3:使用指针法访问各元素*/printf(*p=%d,*p);/*指针不断后移,依次输出当前指针指向的元素*/printf(n);return 0;9.5 指针变量的各种应用指针与字符串(1)用字符数组存放一个字符串,然后通过指针访问它)用字符数组存放一个字符串,然后通过指针访问它 char a10=c,h,i,n,a,0;/*也可以写成char a10=china;*/char*p=a;/*p指向字符串“china”的首字符*/例例9.6 求字符串的长度。求字符串的长度。解题思路:利用一个字
17、符指针依次指向每个字符,同时计数字符个数,直到指向字符串结束标记为止。#include int main()char a30,*p;int n=0;scanf(%s,a);/*输入字符串存放在a数组中*/for(p=a;*p!=0;p+)n+;/*计数字符个数*/printf(length=%dn,n);return 0;9.5 指针变量的各种应用指针与字符串(2)定义一个字符指针,使其直接指向指定的字符串常量)定义一个字符指针,使其直接指向指定的字符串常量 char*p=Just do it!;在编译程序时,系统会在内存中分配空间存放程序中出现的所有常量,字符串常量“Just do it!”
18、也会占用一段连续的存储单元,并用其首字符所在单元的地址来初始化字符指针p,使p指向了该字符串。(3)使用指针处理字符串过程中要注意的几点)使用指针处理字符串过程中要注意的几点 指针法与下标式的互换性 例如:char a10=supermarket,*p=a;只有当p指向首元素a0时,pi与 ai 等价;假设p=&a3;,则p5等价于a8。注意*(p+)、*p+、*(+p)、*+p的使用中各运算符的优先级和结合性 随时注意指针的指向,任何时候都要指向本程序合法数据空间。注意区分数组名与字符指针在使用上的不同。char a10,b10,*p1,*p2;a=“Just do it!”;p1=“Jus
19、t do it!”;scanf(%s,b);scanf(%s,p2);9.6 使用指针的算法分析和设计使用指针处理数组例例9.8 对任意对任意n(n=20)个整数构成的序列,整个序列循环右个整数构成的序列,整个序列循环右移移m位(位(mn),末尾数据移动到序列的开始处。),末尾数据移动到序列的开始处。例如,有10个数据:1,2,3,4,5,6,7,8,9,10 将其循环右移3位之后,序列变为:8,9,10,1,2,3,4,5,6,7分析问题:(1)针对整数序列定义一个数组a(包含20个数组元素),存放任意n(na9、a7-a8、a1-a2,最后,再将暂存在temp中的末尾数据存放在a0中。这个
20、过程重复m次,实现循环右移m位。9.6 使用指针的算法分析和设计使用指针处理数组#include int main()int a20,n,m,i,temp,*p;scanf(%d%d,&n,&m);/*输入数据个数n和右移位数m*/for(i=0;in;i+)/*输入n个数据*/scanf(%d,&ai);for(i=1;ia)/*指针还没指向首元素a0*/*p=*(p-1);p-;/*数据后移,指针前移*/*p=temp;/*末尾数据移动到序列首部*/for(i=0;in;i+)/*输出移位后的数据序列*/printf(%d,ai);return 0;9.6 使用指针的算法分析和设计使用指针
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 教学课件第9章 指针 教学 课件
限制150内