《第9章指针程序设计与问题求解C语言经典课件无师自通》由会员分享,可在线阅读,更多相关《第9章指针程序设计与问题求解C语言经典课件无师自通(38页珍藏版)》请在金锄头文库上搜索。
1、LOGO程序设计与问题求解(C语言)第第9 9章章 指针指针计算机基础教学中心计算机基础教学中心本章教学内容及要求本章教学内容及要求(1)指针的概念和指针变量的定义及其基本使用)指针的概念和指针变量的定义及其基本使用 要求初步了解指针可以解决什么问题;理解两种数据访问方式的特点,掌握指针的概念和含义;理解和掌握指针变量的定义形式、基类型、空间分配以及相关运算符,学会初步使用指针访问内存数据的方法。(2)应用指针处理数组数据和字符串数据)应用指针处理数组数据和字符串数据 要求理解和掌握应用指针处理一组数据的优势和基本方法,明确指针运算、指针移动的具体含义,掌握利用指针处理字符串的一般方法。(3)
2、指针作为函数的参数)指针作为函数的参数 要求理解和掌握利用指针作为函数参数实现主调函数和被调函数之间传递单个数据和一组数据的机理和方法,并熟练应用解决具体问题。本章学习重点与难点本章学习重点与难点重点:重点:理解指针的概念,掌握指针变量的定义及其基本使用;应用指针处理一组数据的特点和方法;利用指针作参数实现函数间数据传递;熟练运用指针解决实际问题。难点:难点:使用指针处理一组数据的过程和方法;利用指针作参数传递数据的机理及具体过程和方法;指针在具体问题中的应用。9.1 指针的引入指针的引入观察下面程序,分析函数观察下面程序,分析函数exchange的功能:的功能:(1)由于变量作用域的限制,函
3、数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中;通过变量x、y找到a、b地址,间接访问a
4、、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; /*指针变量x指向
5、了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
7、,*p2); /*输出p1、p2指向的变量的值*/ 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
8、=%d,b=%dn,a,b); return 0;9.4 指针作函数的参数更改下面程序,实现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、
9、b变量的数据,实现交换。(2)结论:指针作函数的参数,可以使被调函数能够间接处理主调函数中的数据,将处理结果“返回”给主调函数。函数调用时,实参形参结合时本质上仍旧是“单向传值”,但传递的是“地址值”,因此实际达到的结果是数据的“双向传递”。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*
10、y) temp=*x;*x=*y;*y=temp; int main() int a,b,c; scanf(%d%d%d,&a,&b,&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 编写函数p
11、rime_maxmin求任意闭区间a,b内的所有素数的个数以及其中的最大素数、最小素数。分析:(1)函数返回值 需要返回多个结果:素数个数、最大素数、最小素数,这里都将采用指针作形参来“返回”结果,因此,函数返回值类型为void。(2)函数形参调用函数时需要指出闭区间的上限和下限,故形参应包含 int a, int b ;主调函数中使用三个变量存放本函数返回的结果,需要把它们的地址传递给本函数,因此,形参还应包含:int *pcount, int *pmax, int *pmin(3)函数体的实现穷举闭区间a,b中的每个数,判断其是否为素数,是素数则计数增1;将素数存放在指针pmax指向的变量
12、max中(后续更大的素数覆盖小的);当素数个数为1时,该素数一定是最小素数,将其放入指针pmin指向的变量min中;调用函数prime判断某数是否为素数,是素数返回1,否则返回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间的所
13、有整数*/ if(prime(k) /*判断k是否为素数*/ *pcount=*pcount+1; /*若是素数,pcount指向的变量中的数据增1*/ *pmax=k; /*素数放在pmax指向的变量中*/ if(*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,m
14、in=%dn,count,max,min); return 0; 9.5 指针变量的各种应用指针与数组(1)数组的存储特点)数组的存储特点 例如,例如,short int b5=2,6,10,7,9,*p2;分配一段地址连续的存储单元每个元素的地址是其占用的首单元地址由首元素地址可以计算得到任意元素地址数组名本质上是一个地址常量,是首元素地址(2)指针指向数组元素)指针指向数组元素使指针p2指向元素b0:p2=&b0;或者p2=b;p2+2计算得到b2的地址p2+使得指针p2移动,指向下一个元素(3)利用指针访问数组元素)利用指针访问数组元素假设p2=b;,有多种方法访问b2元素:*(p2+2
15、)=30;*(b+2)=30;/*对程序编译时,系统实际上就是把b2处理成*(b+2),因此,都是以间接方式访问数组元素*/p22=30;/*(p2+2)也可以写成p22*/p2+;p2+;*p2=30;/*不断移动指针,使之指向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:采用下标法输出各元素*/ pr
16、intf(a%d=%d ,i,ai); /*这里的ai也可以写成*(a+i),二者等价*/ printf(n); for(i=0;i5;i+)/*方法2:使用指针法输出各元素*/ printf(*(p+%d)=%d , i ,*(p+i); /*可以把*(p+i)替换为pi,二者等价*/ printf(n); for(p=a;p(a+5);p+)/*方法3:使用指针法访问各元素*/ printf(*p=%d ,*p); /*指针不断后移,依次输出当前指针指向的元素*/ printf(n); return 0;9.5 指针变量的各种应用指针与字符串(1)用字符数组存放一个字符串,然后通过指针访问
17、它)用字符数组存放一个字符串,然后通过指针访问它 chara10=c,h,i,n,a,0;/*也可以写成chara10=china;*/char*p=a;/*p指向字符串“china”的首字符*/例例9.6 求字符串的长度。求字符串的长度。解题思路:利用一个字符指针依次指向每个字符,同时计数字符个数,直到指向字符串结束标记为止。#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
18、;9.5 指针变量的各种应用指针与字符串(2)定义一个字符指针,使其直接指向指定的)定义一个字符指针,使其直接指向指定的字符串常量字符串常量char*p=Justdoit!;在编译程序时,系统会在内存中分配空间存放程序中出现的所有常量,字符串常量“Justdoit!”也会占用一段连续的存储单元,并用其首字符所在单元的地址来初始化字符指针p,使p指向了该字符串。(3)使用指针处理字符串过程中要注意的几点)使用指针处理字符串过程中要注意的几点指针法与下标式的互换性例如:chara10=supermarket,*p=a;只有当p指向首元素a0时,pi与ai等价;假设p=&a3;,则p5等价于a8。注
19、意*(p+)、*p+、*(+p)、*+p的使用中各运算符的优先级和结合性随时注意指针的指向,任何时候都要指向本程序合法数据空间。注意区分数组名与字符指针在使用上的不同。char a10, b10,*p1,*p2; a=“Just do it!”; p1=“Just do it!”; scanf(%s,b); scanf(%s,p2); 9.6 使用指针的算法分析和设计使用指针处理数组例例9.8 对对任意任意n(n=20) 个整数构成的序列,整个序列循环右个整数构成的序列,整个序列循环右移移m位(位(mn),末尾数据移动到序列的开始处),末尾数据移动到序列的开始处。 例如,有10个数据: 1,2
20、,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中。这个过程重复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)
21、; for(i=1;ia) /*指针还没指向首元素a0*/ *p=*(p-1); p-; /*数据后移,指针前移*/ *p=temp; /*末尾数据移动到序列首部*/ for(i=0;in;i+) /*输出移位后的数据序列*/ printf(%d ,ai); return 0;9.6 使用指针的算法分析和设计使用指针处理数组例例9.9 一一组组n个整数中找出最小数与第个整数中找出最小数与第1个数对调,找出最大个数对调,找出最大数与最后数对调数与最后数对调。例如。例如:分析问题:(1)如何找到a0an-1中的最大数和最小数,并且如何记住它们的位置?利用指针pmax、pmin 指向当前最大数、最小
22、数,初始都指向首元素。 用指针p依次指向各个元素,使之与当前最大、最小数比较,更新最大、最小数指针的指向。(2)将最小数和最大数交换到首部、末尾位置9.6 使用指针的算法分析和设计使用指针处理数组#include#define n 5int main() int an, *p,*pmax,*pmin,t; for(p=a;pa+n;p+)/*输入n个数据*/ scanf(%d,p); /*用户输入数据存放在指针p所指向的元素中*/ pmin=pmax=a;/*假设首元素最大、最小*/ for(p=a+1;p*pmax)/*当前最大元素与p指向元素比较*/ pmax=p; else if(*p*
23、pmin) pmin=p; t=*a; *a=*pmin;*pmin=t;/*pmin所指最小元素与a0交换*/ t=*(a+n-1); *(a+n-1)=*pmax;*pmax=t;/*pmax所指最大元素与an-1交换*/ for(p=a;pa+n;p+)/*输出交换后数组*/ printf(%3d,*p); return 0;请思考:针对输入5个数据: 45 32 9 20 25分析其运行结果,指出程序出现的问题,给出解决方案。9.6 使用指针的算法分析和设计使用指针处理字符串例例9.10 字符串字符串逆置。输入一个字符串(最长不超过逆置。输入一个字符串(最长不超过20个字个字符),如符
24、),如Monday,调整其中各字符的顺序,使之反序放,调整其中各字符的顺序,使之反序放置并输出它,结果为:置并输出它,结果为:yadnoM。解题思路:定义字符数组 char s21; 存放字符串,调整字符存放顺序使之反序。调整方式是以中心对称的字符进行交换,具体算法如下: 定义两个字符指针p、q,初始指向首字符、尾字符; 将p所指字符与q所指字符进行交换; 指针p后移(p+),指针q前移(q-); 如果pq,转,否则结束交换。#include #include int main() char s21,*p,*q,ctemp; int n; scanf(%s,s); n=strlen(s); f
25、or(p=s,q=s+n-1;pq;p+,q-) ctemp=*p;*p=*q;*q=ctemp; printf(%sn,s); return 0;9.6 使用指针的算法分析和设计使用指针处理字符串例例9.11 将将任意一个十进制数任意一个十进制数a(0a232-1)转换为十六进制转换为十六进制。 例如,输入例如,输入2809,输出相应的十六进制数,输出相应的十六进制数AF9。分析问题:(1)如何表示十六进制数?十六进制数包含字母,无法用数值型变量表示,可以用字符串表示,如”AF9”,需要定义字符数组s。 十进制数a的上限是232-1, 相应二进制数是32位,至少需要4字节空间存储,可以定义无
26、符号长整型变量表示a;相应十六进制数是8位,应定义大小为9的字符数组,即: unsigned long a; char s9;(2)如何由十进制转换为十六进制? 按照“短除16取余、先余为低后余为高”的规则得到十六进制各位,再转化为相应字符,构成字符串,如”9FA” 。(3)字符串逆置,得到”AF9”9.6 使用指针的算法分析和设计使用指针处理字符串难点在于进制转换,具体算法如下: 定义一个字符指针p初始指向字符数组s的首元素,预备用来存放转换得到的十六进制的一位; 对a短除16求余数r; 如果余数r只有1位数字,则将其转换成相应数字字符,如由9转换为字符9;否则,转换得到相应的字母字符,如1
27、0转换为A; 把转换得到的十六进制字符存放在指针p指向的元素中,然后指针后移。 将a整除16求出整数商,即a=a/16; ; 如果整数商a还没有为0,则转继续转换,否则结束转换,转; 在字符数组中最后一位十六进制字符后添加串结束标志0 ,构成字符串。9.6 使用指针的算法分析和设计使用指针处理字符串#include #include int main() unsigned long a,r; char s9,*p,*q,ctemp; int n; scanf(%ld,&a); p=s;/*指针p初始指向字符数组首元素*/ do r=a%16; /*求余*/ if(r0); /*若整数商不为0则
28、继续转换*/ *p=0; n=strlen(s); /*求字符串s的长度*/ for(p=s,q=s+n-1;pq;p+,q-)/*对称字符对调*/ ctemp=*p; *p=*q; *q=ctemp; printf(%sn,s); return 0;9.6 使用指针的算法分析和设计使用指针处理字符串例例9.12 字符串字符串比较比较(strcmp函数的实现)函数的实现)。解题思路:使用指针p1、p2分别指向两个字符串的首字符。 如果二者所指字符相等且均不是串结束标志,则指针p1、p2后移,重复继续比较;否则,结束比较,转。 如果二者都是串结束标志,则两个字符串相等,字符串差值为0;否则,两个
29、字符串不相等,字符串差值为进行比较的两字符的ASCII码值之差。 输出字符串差值。#includeint main() int resu; char s130,s230,*p1=s1,*p2=s2; printf(input string1:); scanf(%s,s1); printf(input string2:); scanf(%s,s2); while(*p1=*p2)&(*p1!=0) p1+,p2+; if(*p1=0&*p2=0) resu=0; else resu=*p1-*p2; printf(result:%dn,resu); return 0;9.6 使用指针的算法分析和
30、设计 使用指针作参数传递一组数据如何将数组数据传递给被调函数并返回处理结果?如何将数组数据传递给被调函数并返回处理结果? 需要传递数据地址才能返回处理结果 只要传递首元素地址就可以得到其它元素地址,实现对整个数组的访问。 还需要传递数组元素个数 例如,定义函数sort对一组数据排序。 定义函数: void sort( int *a, int n ) /*对a0an-1排序*/ 调用函数: int x10; sort(x,10);也有人写成int a 或int a10,实际上,编译系统在处理int a 或int a10时只要方括号中不是负数,编译都认为没错,但括号里面的数字并没有实际意义,编译系
31、统本质上就是把a理解为一个指针变量,即int *a。 9.6 使用指针的算法分析和设计 使用指针作参数传递一组数据例例9.13 对指定数组对指定数组a(数据已经升序排好),给出一个数(数据已经升序排好),给出一个数据据key,若数组中存在该数据,则求出其位置(下标),否,若数组中存在该数据,则求出其位置(下标),否则将该数据插入数组中使之仍然有序。则将该数据插入数组中使之仍然有序。 例如: a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 3 6 8 10 16 20 28 42 50 72 若给出数据key=28,在数组中查找key,a6与key相同,返回key出现的位置(下标)为
32、6; 若给出数据key=29,在数组中没有与key相同的元素,此时把key插入该数组中,使之仍然有序。即: a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 3 6 8 10 16 20 28 29 42 50 72分析问题: 问题涉及两部分功能:查找、插入排序,可以定义两个函数分别实现。定义查找函数函数传入数据:一组数据、该组数据的个数、要查找的数据;要传出的结果:查找的结果(找到元素的位置,若找不到返回-1)voidbio_search(int*a,intn,intkey,int*position)/*在a0an-1中查找key,如果找到,结果为其下标,找不到,结果为-1
33、,把结果存放到position指向的内存单元*/定义插入排序函数函数传入数据:一组数据、该组数据的个数、要插入的数据;要传出的结果:排序后的一组数voidinsert_sort(int*a,intn,intkey)/*将key插入a0an-1,插入后仍有序*/9.6 使用指针的算法分析和设计 使用指针作参数传递一组数据解题思路:(1)查找函数的算法实现 采用第8章学过的二分查找算法实现(2)插入排序函数的算法实现确定插入的位置从后向前依次比较各元素确定插入位置:指针p初始指向末尾数据,即p=a+n-1;,如果key*p则确定插入位置在p所指元素之后;否则,指针p前移,即p-;,重复刚才的判断过
34、程。即:p=a+n-1;while(key=a)p-;在p所指元素后插入key9.6 使用指针的算法分析和设计 使用指针作参数传递一组数据源程序:#include /*二分查找函数 */void bio_search(int *a, int n, int key, int *position) int low=0,high=n-1,mid; mid=(low+high)/2; while(key!=amid&low=high) if (keyhigh) *position=-1; /*未找到返回-1*/ else *position=mid;9.6 使用指针的算法分析和设计 使用指针作参数传递
35、一组数据/*插入排序函数 */void insert_sort(int *a, int n, int key) int *p; p=a+n-1; while(key=a) *(p+1)=*p; /*p所指元素后移一位*/ p-; *(+p)=key;/*把key放入p所指元素后*/9.6 使用指针的算法分析和设计 使用指针作参数传递一组数据int main() int b20=3,6,8,10,16,20,28,42,50,72,x,n=10,xp,i; /*xp存放x在数组b中位置*/ for(i=0;in;i+) /*输出查找(插入)前的b数组数据*/ printf(%d ,bi); pr
36、intf(n); scanf(%d,&x); /*输入要查找(插入)的数据x*/ bio_search(b,n,x,&xp); /*实参b是数组名,即数组b的首地址*/ if(xp=-1) /*如果b数组中不存在x,则插入x,否则输出找到的位置*/ insert_sort(b,n,x);/*实参b是数组名,即数组b的首地址*/ n+; /*数组中数据个数增1*/ for(i=0;in;i+) printf(%d ,bi); else printf(found %d at b%d!n,x,xp);/*输出x所在位置(下标)*/ return 0;9.6 使用指针的算法分析和设计 使用指针作参数传
37、递一组数据9.6 使用指针的算法分析和设计 使用指针作参数传递一组数据例例9.14 编写函数编写函数substr,把给定字符串,把给定字符串s1从从m开始的全部字开始的全部字符复制成为另一个字符串符复制成为另一个字符串s2,显然后者是前者的一个子串。,显然后者是前者的一个子串。 例如:从字符串”untitle”的第3个字符t开始取子串”title”分析问题: 函数需要传入数据:字符串1和取子串的起始位置 函数返回结果:取得的子串 因此, 可以利用指针作参数双向传递字符串数据。 定义函数: void substr(char *a, char *b,int m) /*在a所指字符开始的字符串中,从
38、第m个字符开始,全部复制到b指向元素开始的一片连续内存空间中。*/ 调用函数: substr(s1,s2,m); /*s1、s2是两个字符数组名,s1传入字符串,s2传出子串*/解题思路:(1)移动指针a使之指向s1串的第m个字符,b已指向了s2字符数组的首元素;(2)判断a指向字符是否到字符串的结尾,如果没有,则将a所指字符复制到b所指元素中,同时a、b指针均后移一个元素,转(2);否则复制结束,将串结束标志0加到当前b所指元素中,构成子串。 显然, 指针作参数传递一组数据时,如果传递的是字符串时,无需传入字符个数,函数会通过判断是否处理到串结束标记来控制是否该结束对数组的处理。9.6 使用
39、指针的算法分析和设计 使用指针作参数传递一组数据#include void substr(char *a,char *b,int m) a=a+m-1;/* 指向第m个字符 */ while(*a!=0)/*a所指没有到串结束标志*/ *b+=*a+;/*复制一个字符,指针后移*/ *b=0;int main() char s130,s230; int m; gets(s1); scanf(%d,&m); substr(s1,s2,m); puts(s2); return 0;9.6 使用指针的算法分析和设计 使用指针作参数传递一组数据本章小结本章小结内存地址即是指针,可以通过指针间接访问各种
40、数据对内存地址即是指针,可以通过指针间接访问各种数据对象,比如普通变量、数组、字符串等,指针的使用可以提高象,比如普通变量、数组、字符串等,指针的使用可以提高程序的编译效率和执行速度,使函数间实现双向数据传递,程序的编译效率和执行速度,使函数间实现双向数据传递,还可以实现动态的存储分配,便于表示各种数据结构,编写还可以实现动态的存储分配,便于表示各种数据结构,编写高质量的程序。高质量的程序。主要知识点:主要知识点:(1)指针、指针指向的含义)指针、指针指向的含义(2)指针变量的定义和使用)指针变量的定义和使用(3)数组处理本质上与指针密不可分)数组处理本质上与指针密不可分(4)使用指针处理字符
41、串更直观便捷)使用指针处理字符串更直观便捷(5)利用指针做参数实现两函数间双向数据传递)利用指针做参数实现两函数间双向数据传递本章作业、练习及本章作业、练习及SPOC研讨主题研讨主题(1)书后)书后9.8习题一、二习题一、二(2)研讨主题:)研讨主题:F间接访问数据相对直接访问有什么优势?间接访问数据相对直接访问有什么优势?F如何理解如何理解“指针变量指针变量p指向变量指向变量 i ”?Fchar a20,*p; scanf(“%s”,p); 执行时可能出现什么情况,执行时可能出现什么情况,分析原因,如何避免?分析原因,如何避免?F使用指针访问数组有什么特点?使用指针访问数组有什么特点?F假设假设int a5=1,2,3,4,5,*p=a; 分析指针运算分析指针运算*(p+)、*p+、*(+p)、*+p、(*p)+各自的功能。各自的功能。F传递一组数据给被调函数,函数参数(实参、形参)应如传递一组数据给被调函数,函数参数(实参、形参)应如何设置?何设置?F如何理解如何理解“使用指针作参数可以实现函数间双向数据传递使用指针作参数可以实现函数间双向数据传递 ”,举例说明。,举例说明。