教学设指向指针的指针教学教学课件.pptx
CONTENTS 目 录提出问题 引入新课自主学习 明确考点案例分析 交流提升仿真演练 体验探索提出问题 引入新课PART 011、间接访问与直接访问 2、如果一个指针变量中包含另一个指针变量时,将通过什么方式访问指针变量所指元素?提出问题 引入新课自主学习 明确考点PART 02“指向指针的指针变量”存放的是指针变量的地址,则为“二级指针”甚至“多级指针”。二级指针变量的定义格式是: *;考点一、二级指针变量的定义:定义后需要把另一个指针变量的地址赋值给二级指针变量,格式是: = &;考点二、二级指针变量的赋值int a = 10 , *p1 , *p2;p1 = &a;p2 = &p1;通过指针访问变量称为间接访问。由于指针变量直接指向变量,所以称为“单级间址”。而如果通过指向指针的指针变量来访问变量则构成“二级间址”。设置指向指针的二级指针变量的目的最终还是要对一级指针变量指向的数据变量(比如变量a)进行操作,因此要用二级指针引用数据变量,形式是:*从下图可以看到,name是一个指针数组,它的每一个元素是指针型数据,每一个元素都有相应的地址。数组名name代表该指针数组的首地址。name+i是manei的地址。name+i就是指向指针型数据的指针(地址)。还可以设置一个指针变量p,使它指向指针数组元素。P就是指向指针型数据的指针变量。考点二、二级指针变量的赋值考点二、二级指针变量的赋值 二级指针变量的作用:首先任何值都有地址 ,一级指针的值是地址,但这个地址亦需要空间来存放,是空间就具有地址 ,也就是存放地址值的空间地址,二级指针就是为了获取这个地址。 如果有:p=name+2;printf(“%on”,*p);printf(“%sn”,*p); 则,第一个printf函数语句输出name2的值(它是一个地址),第二个printf函数语句以字符串形式(%s)输出字符串“Great Wall”。考点二、二级指针变量的赋值 【例1】使用指向指针的指针。 main() char *name=Follow me,BASIC,Great Wall, FORTRAN,Computer desighn; char *p; int i; for(i=0;i5;i+) p=name+i; printf(%sn,*p); 考点二、二级指针变量的赋值 【例2】利用二级指针对n个字符串排序并输出#include #define N 4main() char sN10=BASIC,FORTRAN,Pascal,C; char *pN,*pp,*temp; int i,j,k; for(i=0;iN;i+) pi=si; pp=p; for(i=0;iN;i+) k=i; for(j=i+1;j0) k=j; if(k!=i) temp=ppk; ppk=ppi; ppi=temp; for(i=0;iN;i+) printf(%sn,ppi);考点二、二级指针变量的赋值 【例3】二级指针与二维数组#include main() int a43=1,2,3,4,5,6,7,8,9,10,11,12; int *p4,*pp; int i,j; p0=a0; p1=a1; p2=a2; p3=a3; pp=p; for(i=0;i4;i+) for(j=0;j3;j+) printf(%5d,*(*(pp+i)+j); printf(n); 案例分析 交流提升PART 03【例1】设有定义:int n=0,*p=&n,*q=&p;则以下选项中,正确的赋值语句是( ) A)p=1; B)*q=2;C)q=p; D)*p=5;【解析】在C语言中,指针变量只能存放地址(指针),将一个整型数据(或任何其他非地址类型的数据)赋给一个指针变量的赋值是不合法的;指针中“*”为指针运算符(或称“间接访问”运算符),如本题中,*p为指针变量p所指向的存储单元内的整型值,p是指针,q是指向指针的指针,因此选项A,B,C都是错误的,只有选项D是正确的。误区警示:指向指针的指针,即二级指针的基类型是一个指针变量。本题中,若想引用变量n的值应该用“*p”或“*q”。选项D中的赋值语句等价于“n=5;或*q=5;”。【例2】若有定义和语句( ) main() int a=5,*b,*c; c=&b;b=&a; 程序在执行了“c=&b;b=&a;”语句后,表达式:*c的值是( ) A)变量a的地址 B)变量b的值 C)变量a中的值 D)变量b的地址【解析】在本题程序中,根据“c=&b;b=&a;”可知:c指向b, *c代表存储单元,b指向a,*b代表存储单元,也就是说*c代表存储单元a。【例3】有以下程序运行后的输出结果是( )#include main() int *q,*p,a=10,b=20; q=&p;p=&a;p=&b; printf(c=%d,d=%dn, *p,*q);A)10,20 B)10,10 C)20,10 D)20,20【解析】在本题程序中,q是指向指针的指针变量,p是指向整型的指针变量。&为求地址运算符。语句“q&p;”执行后,将p的地址赋值给指向指针的指针变量q。语句“p&a;”则将变量a的地址赋值给p,p指向a的存储地址,而*p为p指向地址存储的值,由此可知*p和a的值都是10,。同理,“p&b;”执行后*p的值为20。在第一个语句中,已经将p的地址赋值给q,因此p和*q的值相同(都是地址&pp中存储的值),由此推出*p和*q的值相同,都为20。仿真演练,体验探索PART 041、以下程序的运行结果是( )#include main() char *name5=Follow me,BASIC,Great Wall, FORTRAN,Computer; char *p=name; int i; for (i=0; i5; i+) printf(%sn,*p+);2、以下程序的运行结果是( )main() int a5=2,4,6,8,10,*p,*k; p=a; k=&p; printf(%d,*p+); printf(%dn,*k);3、有以下程序段main() int a=5, *b, *c; c=&b; b=&a; 程序在执行了c=&b:b=&a;语句后,表达式:*c的值是( )。A) 变量a的地址 B) 变量b中的值 C) 变量a中的值 D) 变量b的地址4、有以下程序运行后的结果是( )#include int a5=1,3,5,7,9,*p,*pp; p=a; pp=&p printf(“%d”,*(p+); printf(“%3d”,*pp);