1 / 9
文档名称:

C语言程序设计---指针-样本教案.doc

格式:doc   大小:86KB   页数:9页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

C语言程序设计---指针-样本教案.doc

上传人:吴老师 2024/5/12 文件大小:86 KB

下载得到文件列表

C语言程序设计---指针-样本教案.doc

文档介绍

文档介绍:该【C语言程序设计---指针-样本教案 】是由【吴老师】上传分享,文档一共【9】页,该文档可以免费在线阅读,需要了解更多关于【C语言程序设计---指针-样本教案 】的内容,可以使用淘豆网的站内搜索功能,选择自己适合的文档,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此文档到您的设备,方便您编辑和打印。、一维数组指针、、数组、字符串的指针变量重点:、、一维数组的指针变量的引用定义变量时,系统会为变量开辟相应数量的内存单元存储数据,是否可以通过内存单元对应的内存地址来访问内存单元中存储的数据呢?如果可以的话,如何来实现呢?一、间接访问与直接访问举例:翻开A抽屉方法直接访问:将A钥匙带在身上,需要时直接翻开间接访问:将A钥匙放在B抽屉,需要时,翻开B抽屉取出A钥匙,翻开A抽屉。二、:指针就是地址。:计算机内部存储器由很多内存单元组成,每个内存单元都有自己唯一的地址编码,称内存单元地址。,内存单元的地址就是变量的地址;当变量占用连续的假设干个内存单元时,最前面一个单元的地址就是该变量的地址。例:inti=3;floatf;内存单元地址整型变量i200132024。。。2024单精度变量f20242024变量i的地址:2001,变量f的地址:2024由于地址起到寻找操作对象的作用,像一个指向对象的指针,所以常把地址称为“指针〞。。数组类型不同,每个数组元素占用的内存单元数也不同。数组占用的总单元数=数组长度×每个数组元素占用的内存单元数。数组元素a[i]的地址=数组首地址+i×数组元素的数据类型所占用的内存单元数例:inta[3]={1,2,3};地址内存单元13000300130023003300430053006整型数组元素a[0]23整型数组元素a[1]整型数组元素a[2]三、:存放内存地址的变量称为“指针变量〞。,定义的同时可以赋初值。【格式】存储类型数据类型*指针变量名1[=初值1],…;【功能】定义指向指定“数据类型〞或数组的假设干个指针变量,同时给这些变量赋初值。例:inta;int*p=&a;floatf1,f[10],*p1=&f1,*p2=f;〔1〕给指针变量赋值【格式】指针变量=地址表达式例:inti,*p;p=&i;〔2〕直接引用指针变量名例:inti,j,*p=&i,*q;q=p;scanf〔“%d,%d〞,q,&j〕;〔3〕通过指针变量来引用它所指向的变量【格式】*指针变量名注意:这种引用方式要求指针变量必须有值。例如:inti=1,j=2,k,*p=&i;k=*p+j;四、取地址运算符与指针运算符取地址运算符〔&〕:取运算对象的地址。如&a指针运算符〔*〕:取所指向的变量或数组元素。例如:int*p,a;p=&a;那么*p==a为真。五、指向一维数组的指针变量的使用如何将指针变量指向数组的首地址?〔1〕初始化:数据类型*指针变量=数组名〔2〕程序中赋值:指针变量=数组名〔3〕假设指针变量指向某数组元素:*指针变量=&数组名[下标]〔1〕当指针变量指向数组的首地址,引用数组元素的方法引用“数组元素[0]〞:*〔指针变量+0〕或*指针变量引用“数组元素[i]〞:*〔指针变量+i〕〔2〕当指针变量指向下标为i的数组元素,引用数组元素的方法引用“数组元素[i]〞:*〔指针变量+0〕或*指针变量引用“数组元素[i-k]〞:*〔指针变量-k〕引用“数组元素[i+k]〞:*〔指针变量+k〕〔3〕当指针变量指向数组首地址,对下标i的数组元素引用方法①*〔指针变量+i〕②*〔数组名+i〕③指针变量[i]④数组名[i]〔1〕指针变量算术运算指针变量+整数指针变量-整数++指针变量--指针变量指针变量++指针变量--指针变量1-指针变量2〔2〕指针变量的关系运算指针变量1关系运算符指针变量2六、:将字符指针变量p指向“abcd〞方法一:初始化形式数据类型*指针变量=字符串常量char*p=“abcd〞;方法二:赋值语句指针变量=字符串常量char*p;p=“abcd〞;〔1〕处理整个字符串输出字符串printf〔“%s〞,指针变量〕;输入新的字符串代替原字符串scanf〔“%s〞,指针变量〕;〔2〕处理字符串中的单个字符第i个字符的表示方法:*〔指针变量+i〕,方法同处理一维数组元素。注意:字符数组元素的类型是字符型。七、小结指向变量、一维数组、字符串的指针变量的定义和应用。八、作业数组名的特殊性实例讲解举例注意:数组名是否可以进行这些运算??指向二维数组的指针变量的引用指向函数的指针变量的引用指向二维数组的指针变量指向函数的指针变量前面学习了通过指针访问一维数组,那么如何通过指针对二维数组进行访问呢?二维数组中隐含着怎样的地址关系呢?一、指针表示二维数组二维数组元素的地址inta[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};二维数组a[3][4]可看成由3个一维数组a[0]、a[1]、a[2]组成,每个一维数组由4个元素组成。如以下图所示。2313579131115171921a[0]a[1]a[2]aa+1a+2a[0]a[0]+1a[0]+2a[0]+323a代表二维数组首元素的地址,a[0]、a[1]、a[2]是一维数组名,而C语言规定数组名代表数组首元素的地址,即a[0]等价于&a[0][0]、a[1]等价于&a[1][0]、a[2]等价于&a[2][0]。2、使用指针表示二维数组元素进一步分析:a[0]等价于&a[0][0],a[0]+1等价于&a[0][1],a[0]+2等价于&a[0][2],a[0]+3等价于&a[0][3]。因为a[0]和*〔a+0〕等价,a[1]和*〔a+1〕等价,a[i]和*〔a+i〕等价,因此:a[0]+1等价*(a+0)+1等价&a[0][1]a[1]+2等价*(a+1)+2等价&a[1][2]注意:不要将*(a+1)+2错写成*〔a+1+2〕。进一步分析:因为&a[0][1]等价a[0]+1等价*(a+0)+1,那么*(*(a+0)+1)或*(*a+1)等价a[0][1]的值。*(a[i]+j)或*(*a+i)+j〕等价a[i][j]的值二、如何使用指针变量指向二维数组?当定义了二维数组和同类型的指针变量后,可使这个指针变量:①指向二维数组的首地址②指向二维数组中某个一维数组③〔1〕让指针变量指向二维数组的某个元素的方法初始化:数据类型*指针变量=&数组名[下标1][下标2]赋值:指针变量=&数组名[下标1][下标2]〔2〕二维数组元素的引用方法*指针变量【例1】输入2行3列的矩阵元素,存入二维数组,再按行列格式输出main(){inta[2][3],*p,i,j;for(i=0;i<2;i++)for(j=0;j<3;j++){p=&a[i][j];scanf(“%d〞,p);}for(i=0;i<2;i++){printf(“\n〞);for(j=0;j<3;j++){p=&a[i][j];printf(“%10d〞,*p);}}}〔1〕让指针变量指向二维数组首地址的方法初始化:①数据类型*指针变量=二维数组名②数据类型*指针变量=&二维数组名[0][0]赋值:①指针变量=二维数组名②指针变量=&二维数组名[0][0]〔2〕二维数组元素的引用方法*〔指针变量+i*列数+j〕【例2】使用指向二维数组首地址的指针变量重编上个例1main(){inta[2][3],*p,i,j;for(i=0;i<2;i++)for(j=0;j<3;j++)scanf(“%d〞,p+i*3+j);for(i=0;i<2;i++){printf(“\n〞);for(j=0;j<3;j++)printf(“%10d〞,*(p+i*3+j));}}:①定义指针变量数据类型〔*指针变量〕[m]说明:m是二维数组的列长该指针变量表达不出二维数组“维〞的概念。注意scanf注意printf该指针变量表达了二维数组“维〞的概念。②用初始化或赋值方法将指针变量指向二维数组的首地址数据类型〔*指针变量〕[m]=二维数组名〔初始化〕指针变量=二维数组名〔赋值〕注意:〔〕不能丢,不能写成“*指针变量[m]〞;[]运算符高于*③二维数组中第i行对应的一维数组首地址的表示*〔指针变量+i〕〔2〕二维数组元素的引用方法数组元素地址:*〔指针变量+行下标〕+列下标数组元素引用:*〔*〔指针变量+行下标〕+列下标〕其中:*〔指针变量+行下标〕是行下标对应的一维数组的首地址。例:inta[2][3],〔*p〕[3]=a;说明:定义二维数组a[2][3]和指向具有3个元素的一维数组指针变量p,并使p指向二维数组a的首地址。对应二维数组中2个一维数组的首地址表示如下:二维数组中的一维数组指针变量表示一维数组的首地址a[0]*〔p+0〕a[1]*〔p+1〕二维数组元素的引用格式:数组元素a[0][0]a[0][1]a[0][2]引用格式*(*(p+0)+0)*(*(p+0)+1)*(*(p+0)+2)数组元素a[1][0]a[1][1]a[1][2]引用格式*(*(p+1)+0)*(*(p+1)+1)*(*(p+1)+2)【例3】用指向二维数组中一维数组的指针变量重新编写例1main(){inta[2][3],(*p)[3]=a;inti,j;for(i=0;i<2;i++)for(j=0;j<3;j++)scanf(“%d〞,*(p+i)+j);for(i=0;i<2;i++){printf(“\n〞);for(j=0;j<3;j++)printf(“%10d〞,*(*(p+i)+j));}}三、、浮点型、字符型、指针类型的数据。指针类型做函数参数的作用是将一个地址值传送到函数中。【例4】编写一函数,通过函数调用显示一个字符串。Main(){voiddisp();char*p=〞Cisaprogramminglanguage.〞;disp(p);}voiddisp(char*q);{printf(“%s\n〞,q);}返回值为地址当函数返回指针类型数据时,应当在定义函数时对返回值的类型进行说明。比较int(*fp)();和int*fp();格式:根本类型*函数名〔形式参数表〕〔*指针函数的指针变量名〕〔〕;例如:int〔*fp〕〔〕;注意:〔〕:〔1〕将函数的入口地址〔函数名〕赋给指向函数的指针变量〔2〕用指向函数的指针变量〔连同圆括号〕代替函数名使用四、:当某个数组被定义为指针类型,称该数组为指针数组。注意:指针数组是指针类型的,对其元素所赋的值必须是地址值。格式:存储类型数据类型*指针数组名[长度]={初值}…例如:inta,b,c,*p[3]={&a,&b,&c};定义指针型数组p,其3个元素p[0]、p[1]、p[2]分别指向a,b,c。,可利用它来引用所指向的普通变量或数组元素,可对其赋值,也可参加运算。【例5】输入5个字符串存入一个二维数组中,定义一个指针数组,使其元素分别指向这5个字符串并输出。main(){chars[5][20],*p[5];inti;for(i=0;i<5;i++)p[i]=s[i];for(i=0;i<5;i++)scanf(“%s〞,p[i]);for(i=0;i<5;i++)printf(“%s\n〞,p[i]);}【例6】输入a和b两个整数,调用函数swap对a,b从大到小排序,然后输出。swap(int*p1,int*p2){inttemp;if(*p1<*p2){temp=*p1;*p1=*p2;*p2=temp;}}main(){inta,b,*pa,*pb;printf(“\nPleaseinputa,b:\n〞);scanf(“%d,%d〞,&a,&b);pa=&a;pb=&b;swap(pa,pb);printf(“%d,%d〞,a,b);}五、多级指针什么是多级指针定义:指向指针变量的指针变量,称为多级指针。常使用的多级指针是二级指针。【格式】存储类型数据类型**指针变量名={初值},…【功能】定义指向“数据类型〞指针变量的二级指针变量,同时给二级指针变量赋初值。例如:inta,*p1=&a,**p2=&p1;*p1代表变量a,*p2代表指针变量p1,**p2代表变量a。举例说明二级指针的应用。六、小结指向二维数组的指针变量的引用、指向二维数组的行指针变量的引用;指向函数的指针变量的引用;指针数组和多级指针。七、作业分析程序运行过程