c语言指针教案_第1页
c语言指针教案_第2页
c语言指针教案_第3页
c语言指针教案_第4页
c语言指针教案_第5页
已阅读5页,还剩57页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

c语言指针教案内容提要指针的概念;定义指向各种数据类型的指针;

指针做函数的参数;

难点:指针与数组应用用字符数组存取字符串;使用字符串处理函数处理字符串;结构体。

第一节变量的地址和指针第二节指针变量的定义和引用第三节指针与数组第四节指针与字符串第五节指针与结构体

第六节指针与函数

练习题第一节变量的地址和指针一、地址和指针二、访问变量的方式三、指针变量寻找保险箱密码

一个关于特工008寻找保险箱密码的故事…关键点分析得到线索:0217单元的“虎跑号”寄存箱提示地址:1976单元找到目标:“龙井号”寄存箱取出内容:911寻找密码的途径分析密码911存放在某个寄存箱内,如果我们知道这个寄存箱的名字,就能够找到密码如果不知道密码所在的寄存箱名字,知道该寄存箱的地址也照样能够取出密码如果寄存箱的地址也不知道,但是有另外一个地方存放这个寄存箱的地址,就能顺藤摸瓜,间接找到密码密码存放示意图龙井号9111976虎跑号19760217名字虎跑号龙井号地址02171976内容1976911利用指针模拟寻找保险箱密码的过程

获取密码的两种方法

intmain(void){ intkey=911;/*变量key存放密码*/ int*addr;/*变量addr存放地址*/

addr=&key;/*将key的地址赋给addr*/ /*通过变量key输出密码值*/printf("Thekeyis:%d\n",key);/*通过变量key的地址来输出密码值*/ printf("IfIknowtheaddressofthekey,Ialsocangetit:%d\n",*addr);

return0;}Thekeyis:911IfIknowtheaddressofthekey,Ialsocangetit:911

地址和指针

内存单元地址内容变量intx=20,y=1,z=155;printf("%d",x;)直接访问:通过变量名访问间接访问:通过另一个变量访问把变量的地址放到另一变量中使用时先找到后者再从中取出前者的地址100020x10041y1008155z20001000p地址指针变量地址在程序中所定义的变量,编译系统会根据变量的类型,分配一定长度的存储空间。内存中每一个存储单元的有唯一编号。如:

int

a

4个字节

floatb

4个字节62000

2004

2008

a

b

指针

指针就是地址地址和指针

●直接访问方式按变量的地址存取变量的值。

间接访问方式按变量的地址的地址存取变量的值。访问变量的方式20006pa(1000)a(2000)●指针

一个变量的地址称为该变量的指针。如地址2000是变量a的指针。●指针变量

如果有一个变量专门用来存放另一个变量的地址(即指针),称为指针变量。如pa是一个指针变量,pa中的值为指针。指针变量一、指针变量的定义二、指针变量的引用第二节

指针变量的定义和引用

数据类型说明符*标识符;

例如:

int*pt;定义指向整型变量的指针变量合法标识符指针变量名第二节指针变量的定义和引用例如

inta,b;

int*p1,*p2;

p1=&a;p2=&b;&ap1p2ab&b引用第二节指针变量的定义和引用●

C语言中的指针运算符

&:取变量地址运算符*:“指向”运算符或称“间接访问”运算符例如:&a变量a的地址*p指针变量p所指向的变量#include<stdio.h>voidmain(){inta,*pi;floatf,*pf;a=10;f=1.5;pi=&a;pf=&f;printf(“%d,%f\n”,a,f);printf(“%d,%f\n”,*pi,*pf);}例6.1指针变量的使用pipfaf&a&f10#include<stdio.h>voidmain(){inta,b,*p,*p1,*p2;a=3;b=6;p1=&a;p2=&b;p=p1;p1=p2;p2=p;printf("%d%d\n",*p1,*p2);printf("%d%d\n",a,b);}单击鼠标,演示程序的执行过程:p1p2pab&a&b63&a&b&a例6.2交换指针的指向#include<stdio.h>voidmain(){inta,b,temp,*p1,*p2;a=3;b=6;p1=&a;p2=&b;temp=*p1;*p1=*p2;*p2=temp;printf("%d%d\n",a,b);}p1p2tempab&a&b63例6.3交换指针指向的变量值633

一、指向一维数组的指针变量二、*指向二维数组的指针变量第三节指针与数组●定义

inta[5];

int*p;

p=&a[0];或p=a;●说明

指针的类型必须同于数组元素的类型定义指针的同时赋予数组的首地址。例如:inta[8];

int*p=a;指向一维数组的指针变量a[0]a[1]a[2]a[3]a[4]p2000a[0]a[1]a[2]a[3]a[4]通过指针变量来引用一维数组的元素例如:inta[8],i;

int*p=a;●下标法:用a[i]来引用数组a的第i个数组元素,●指针法:用*(a+i),*(p+i)引用数组的第i个数组元素。#include<stdio.h>voidmain(){inta[10],*p,i;for(i=0;i<10;i++)a[i]=i;for(p=a;p<(a+10);p++)printf("%d",*p);}例

数组元素的引用#include<stdio.h>voidmain(){inta[10],i;for(i=0;i<10;i++)a[i]=i;for(i=0;i<10;i++)printf("%d",a[i]);

*(a+i);

}p++使指针p指向数组的下一个元素。*p++等价于*(p++),其作用是先得到p指向变量的值(即*p),然后再使p+1赋给p。*(p++)与*(++p)的作用不同。前者是先取*p的值,然后使指针变量p加1;后者是先使指针变量p的值加1,再取*p。p+n只是地址变化,指针没有移动。

指针运算#include<stdio.h>voidmain(){intx[]={1,2,3,4,5,6,7,8,9,0};int*p=x;printf(“%d\t”,*p++);printf(“%d\t”,*(p+8));printf(“%d\n”,*--p);}练习101

用指针变量来作为函数的参数,根据形式参数和实际参数的用法可以有以下4种形式:实际参数:数组名指针变量形式参数:数组名指针变量指针变量作为函数的参数#include<stdio.h>voidmain(){inta[10]={1,3,5,7,9,11,13,15,17,19};inti,*p;voidinvert(int*p,intn);p=a;printf(“数组交换前的顺序为:\n”);for(i=0;i<10;i++)printf(“%5d”,a[i]);invert(p,10);printf(“\n数组交换后的顺序为:\n”);for(i=0;i<10;i++)printf(“%5d”,a[i]);}例6.7将数组中的n个数逆序存放指针当实参voidinvert(int*p,intn){inti,*q,temp;q=p+n-1;for(i=0;i<n/2;i++){temp=*p;*p=*q;*q=temp;p++;q--;}}函数定义一、字符串的表示形式二、指向字符串指针变量的应用第四节指针与字符串●两种方法用字符数组实现例如:

charstr[]=“Clanguage”;用字符指针实现例如:

char*pstr=“Clanguage”;或char*pstr;pstr=“Clanguage”;字符串的表示形式#include<stdio.h>voidmain(){intstrlenth(char*p);charstr[80];inti,len;char*p;gets(str);p=str;len=strlenth(p);printf(“%5d”,len);}

例6.8写一函数,求一个字符串的长度(c68.cpp)intstrlenth(char*p){intlen=0;while(*p!=‘\0’){len=len+1;p++;}return(len);}

#include<stdio.h>voidmain(){charst[20],*pc;pc=st;scanf(“%s”,pc);printf(“%s\n”,pc);}指向字符串指针变量的应用pc3000例6.9输入一字符串并输出,用字符指针变量来实现。st[0]st[1]st[18]…..w\0…!e#include<stdio.h>voidmain(){chara[80],b[80],*pa,*pb;pa=a;pb=b;gets(pa);while(*pa!=’\0’){*pb=*pa;pa++;pb++;}*pb=’\0’;printf(“%s”,b);}例6.10将字符串a复制到字符串b。\0wel…\0papba[0]b[0]#include<stdio.h>voidmain(){char*s1="Clanguage";s1+=2;printf("%s\n",s1);}

例6.11输出字符串中的部分数据运行结果language#include“stdio.h”voidmain(){voiddel_ch(char*p,charch);charstr[80],*pt,ch;printf(“plsenterastr:\n”);gets(str);pt=str;printf(“plsenterthechardeleted:\n”);ch=getchar();

del_ch(pt,ch);printf(“thenewstirngis:\n%s\n”,str);}

例6.12有一行字符,要求删去指定的字符。例如:“Hehas350$.”如果删去“0”,则变为“Hehas35$”。

voiddel_ch(char*p,charch){char*q=p;for(;*p!=‘\0’;p++)if(*p!=ch){*q=*p;q++;}*q=‘\0’;}welcome\0pqqpp指向结构体变量的指针定义了一个structstud类型,可用下面形式定义一个指向这种类型数据的指针变量:

structstud*p;用指针变量p可以指向任一个属于structstud类型的结构体变量。第五节指针与结构体例6.12-1定义指向结构体的指针变量#include"stdio.h"#include"string.h"structstud{longnum;charname[20];chargender;intage;floatscore;};

voidmain(){

structstudstudent1;structstud*p;p=&student1;student1.num=970101;strcpy(,"LiuLi");student1.gender='M';student1.age=16;student1.score=95.5;

printf("No:%ld\nname:%s\ngender:%c\nage:%d\nscore:%6.2f\n",student1.num,,student1.gender,student1.age,student1.score);printf("\nNo:%ld\nname:%s\ngender:%c\nage:%d\nscore:%6.2f\n",(*p).num,(*p).name,(*p).gender,(*p).age,(*p).score);}程序运行结果如下:No:970101name:LiuLigender:Mage:16No:970101name:LiuLigender:Mage:16

说明

(*p).nump->num

等价

“->”运算符的优先级别最高。

一、指针作函数的参数二、函数返回指针三、函数指针第六节指针与函数

指针变量存放的是地址值,同样可以作为函数的参数来进行“地址传送”。●实际参数为地址常量或指针变量●形式参数为指针变量。指针作函数的参数

voidmain(){inta,b,max;int*pa,*pb;printf("输入a和b:\n");scanf("%d,%d",&a,&b);pa=&a;pb=&b;if(a<b)swap(pa,pb);

printf("max=%d\n",a);}#include<stdio.h>voidswap(int*p1,int*p2)

{inttemp;temp=*p1;*p1=*p2;*p2=temp;}例6.13用函数来实现求两数中的大者swap()能否写成下面这种形式呢?

swap(int*p1,int*p2){int*p;p=p1;p1=p2;p2=p;}

??函数返回指针

定义形式类型说明符*函数名(参数表){函数体}

例如:int*search(int*x,intn){int*p;p=x+n;return(p);}

例6.14对例的功能用返回指针的函数来实现

#include<stdio.h>int*max(int*p1,int*p2){int*r;if(*p1>*p2)r=p1;elser=p2;returnr;}intmain(){inta,b;int*p;printf("输入a和b:\n");scanf("%d,%d",&a,&b);p=max(&a,&b);printf("max=%d",*p);return0;}例6.15解密藏头诗#include<stdio.h>intmain(){char*change(chars[][20],chart[]);inti;chars[4][20],t[10],*p;printf("请输入诗:\n");for(i=0;i<4;i++) scanf("%s",s[i]);

p=change(s,t); printf("解密:\n"); printf("%s\n",p); return0;}

char*change(chars[][20],chart[]){inti;for(i=0;i<4;i++) {t[2*i]=s[i][0]; t[2*i+1]=s[i][1];}t[2*i]='\0';

returnt;}一叶轻舟向东流帆梢轻握杨柳手风纤碧波微起舞顺水任从雅客悠●一个函数在内存中占一片存储空间。在函数被编译时,被分配给一个入口地址,这个入口地址就称为函数的指针。●用一个指针变量指向函数,然后用指向函数的指针变量代替函数名来调用这个函数。函数指针

●形式:

类型说明符(*指针变量名)(参数表);

例如:int(*p)(int,int);

表示定义了一个指向函数的指针变量p,函数的返回值是整型。●函数的调用形式

(*指针变量)(实参表列);

例如:(*p)(a,b);

注意!与int*p()的区别函数指针的定义m=(*p)(a,b);m=min(a,b);练习题1.有以下程序#include<stdio.h>voidmain(){ char*s={“ABC”};

do {printf(“%d”,*s%10);s++; }while(*s);}A)5670B)656667C)567D)ABCC2.有以下程序#include<stdio.h>voidfun(char*s){ while(*s) { if(*s%2==0)printf(“%c”,*s); s++; }}voidmain(){ chara[]={“good”}; fun(a); printf(“\n”);}注意:字母a的ASCII码值为97,程序运行后的输出结果是A)dB)goC)godD)goodA3.#include<stdio.h>voidfun(int*a,int*b){ int*c; c=a;a=b;b=c;}voidmain(){ intx=3,y=5,*p=&x,*q=&y; fun(p,q);printf(“%d,%d,”,*p,*q); fun(&x,&y);printf(“%d,%d\n”,*p,*q);}程序运行后的输出结果是A)3,5,5,3B)3,5,3,5C)5,3,3,5D)5,3,5,3B4.有以下程序#include<stdio.h>intb=2;intfun(int*k){b=*k+b;return(b);}voidmain(){ inta[10]={1,2,3,4,5,6,7,8},i; for(i=2;i<4;i++){b=fun(&a[i])+b;printf(“%d”,b);} printf(“\n”);}程序运行后的输出结果是A)1012B)810C)1028D)1016C5.写出程序运行结果#include<stdio.h>voidp(int*x,inty){++*x;y--;}voidmain

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论