您好,欢迎访问三七文档
指针内容提要指针的概念;定义指向各种数据类型的指针;指针做函数的参数;难点:指针与数组应用用字符数组存取字符串;使用字符串处理函数处理字符串;结构体。第一节变量的地址和指针第二节指针变量的定义和引用第三节指针与数组第四节指针与字符串第五节指针与结构体第六节指针与函数练习题第一节变量的地址和指针一、地址和指针二、访问变量的方式三、指针变量寻找保险箱密码一个关于特工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地址指针变量地址在程序中所定义的变量,编译系统会根据变量的类型,分配一定长度的存储空间。内存中每一个存储单元的有唯一编号。如:inta4个字节floatb4个字节65.3200020042008ab指针指针就是地址地址和指针●直接访问方式按变量的地址存取变量的值。●间接访问方式按变量的地址的地址存取变量的值。访问变量的方式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所指向的变量#includestdio.hvoidmain(){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&f1.51010,1.50000010,1.500000#includestdio.hvoidmain(){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交换指针的指向#includestdio.hvoidmain(){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个数组元素。#includestdio.hvoidmain(){inta[10],*p,i;for(i=0;i10;i++)a[i]=i;for(p=a;p(a+10);p++)printf(%d,*p);}例6.6数组元素的引用#includestdio.hvoidmain(){inta[10],i;for(i=0;i10;i++)a[i]=i;for(i=0;i10;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只是地址变化,指针没有移动。指针运算#includestdio.hvoidmain(){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种形式:实际参数:数组名指针变量形式参数:数组名指针变量指针变量作为函数的参数#includestdio.hvoidmain(){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;i10;i++)printf(“%5d”,a[i]);invert(p,10);printf(“\n数组交换后的顺序为:\n”);for(i=0;i10;i++)printf(“%5d”,a[i]);}例6.7将数组中的n个数逆序存放指针当实参voidinvert(int*p,intn){inti,*q,temp;q=p+n-1;for(i=0;in/2;i++){temp=*p;*p=*q;*q=temp;p++;q--;}}函数定义一、字符串的表示形式二、指向字符串指针变量的应用第四节指针与字符串●两种方法用字符数组实现例如:charstr[]=“Clanguage”;用字符指针实现例如:char*pstr=“Clanguage”;或char*pstr;pstr=“Clanguage”;字符串的表示形式#includestdio.hvoidmain(){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);}#includestdio.hvoidmain(){charst[20],*pc;pc=st;scanf(“%s”,pc);printf(“%s\n”,pc);}指向字符串指针变量的应用pc3000例6.9输入一字符串并输出,用字符指针变量来实现。st[0]st[1]st[18]…..w\0…!e#includestdio.hvoidmain(){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…\0pawel…\0pba[0]b[0]#includestdio.hvoidmain(){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定义指向结构体的指针变量#includestdio.h#includestring.hstructstud{longnum;charname[20];chargender;intage;floatscore;};voidmain(){structstudstudent1;structstud*p;p=&student1;student1.num=970101;strcpy(student1.name,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.name,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:16score:95.50No:970101name:LiuLigender:Mage:16score:95.50说明(*p).nump-num等价“-”运算符的优先级别最高。一、指针作函数的参数二、函数返回指针三、函数指针第六节指针与函数指针变量
本文标题:c语言-指针教案
链接地址:https://www.777doc.com/doc-3418660 .html