C语言PPT课件第08章指针.ppt
《C语言PPT课件第08章指针.ppt》由会员分享,可在线阅读,更多相关《C语言PPT课件第08章指针.ppt(65页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第7 7章章 指针指针第一节第一节 地址和指针的概念地址和指针的概念第二节第二节 变量的指针和指针变量变量的指针和指针变量第三节第三节 数组指针数组指针第四节第四节 字符串指针字符串指针第五节第五节 函数指针函数指针第六节第六节 返回指针的值返回指针的值第七节第七节 指针数组指针数组第八节第八节 小结小结2第第7 7章章 指针指针指针是指针是C语言中的一个重要的概念,正确而语言中的一个重要的概念,正确而灵活地运用它,可以有效地表达复杂的数据结构;灵活地运用它,可以有效地表达复杂的数据结构;能动态分配内存;能方便地使用字符串、数组、能动态分配内存;能方便地使用字符串、数组、函数;能直接处理内存
2、地址。函数;能直接处理内存地址。可以说,不掌握指针就不掌握可以说,不掌握指针就不掌握C语言。语言。3 两个概念两个概念l内存单元:内存单元:程程序序中中定定义义的的每每个个变变量量,都都在在内内存存中中占占有有一定的空间,称为一定的空间,称为内存单元。内存单元。内存单元地址:内存单元地址:内内存存区区的的每每一一个个字字节节有有一一个个编编号号,称称为为内内存存地地址。址。7-17-1地址和指针的概念地址和指针的概念4 例如程序定义了三个变量例如程序定义了三个变量:Int a,b,c;Int a,b,c;则系统给出三个单元则系统给出三个单元:地址地址1 1 地址地址2 2 地址地址3 37-1
3、7-1地址和指针的概念地址和指针的概念a a b b c c 5实实际际上上一一个个变变量量有有三三个个值值:地地址址、变变量名、值。例:量名、值。例:Int a=3,b=7,c=9;Int a=3,b=7,c=9;地址地址 变量名变量名 值值 地址地址1 1 地址地址2 2 地址地址3 37-17-1地址和指针的概念地址和指针的概念 a 3 a 3 b 7 b 7 c 9 c 9 6l内存单元的大小:内存单元的大小:程程序序中中不不同同类类型型的的变变量量,大大小小也也不不一样。一样。*实型变量:占有实型变量:占有 4 4 个字节。个字节。*整型变量:占有整型变量:占有 2 2 个字节。个字
4、节。*字符变量:占有字符变量:占有 1 1 个字节。个字节。注:注:1 1个字节为个字节为8 8位:位:7-17-1地址和指针的概念地址和指针的概念 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 07 例:程序定义了例:程序定义了3 3个整型个整型 内存用户数据区内存用户数据区变量变量i i、j j、k,k,编译时系统编译时系统分配置分配置20002000和和20012001两个字两个字节给变量节给变量i,2002i,2002和和20032003字字 2000 3 2000 3 变量变量i i 节给节给j,2004j,2004,2000520005给给k k。2002 6 200
5、2 6 变量变量j j则有:变量则有:变量 开始地址开始地址 2004 9 2004 9 变量变量k k i i 2000 2000 .j 2002j 2002 .k 2004k 2004 3010 2000 i-pot 3010 2000 i-pot 单元内的内容就是变量的值单元内的内容就是变量的值 7-17-1地址和指针的概念地址和指针的概念8 对变量的存取是通过地址对变量的存取是通过地址 内存用户数据区内存用户数据区来进行。如果语句中有:来进行。如果语句中有:“k=i+j”,“k=i+j”,则从则从20002000、20012001字节取出字节取出I I值(值(3 3),再从再从 200
6、0 3 2000 3 变量变量i i 20022002,20032003字节取出字节取出j j值值 2002 6 2002 6 变量变量j j(6 6),相加后得(),相加后得(9 9),),2004 9 2004 9 变量变量k k 送给送给k k所占的所占的20042004,.20052005单元。单元。.这种存取方式称为这种存取方式称为 3010 2000 3010 2000 i-pot i-pot “直接访问:方式。直接访问:方式。7-17-1直接访问方式直接访问方式9 也可以采用另一种存取方式,也可以采用另一种存取方式,内存用户数据区内存用户数据区变量变量I I的地址存放在另一个变量
7、的地址存放在另一个变量IpotIpot中,即:中,即:Ipot=&I;Ipot=&I;这样,这样,IpotIpot的值就是的值就是20002000,2000 3 2000 3 变量变量i i 即变量即变量I I的起始地址。要存的起始地址。要存 2002 6 2002 6 变量变量j j取取I I的值,也可以从变量的值,也可以从变量 2004 9 2004 9 变量变量k kIpotIpot中取出中取出I I的地址(的地址(2000)2000).然后到然后到20002000,20012001处取出处取出 .I I的值(的值(3 3)。)。3010 2000 3010 2000 ipot ipot
8、 这种存取方式称为这种存取方式称为 :“间接访问:方式间接访问:方式 7-17-1间接访问方式间接访问方式107-27-2地址和指针的概念地址和指针的概念*什么叫做指针?什么叫做指针?举两个日常例子:举两个日常例子:(1)每个同学的记分表都有这三栏:)每个同学的记分表都有这三栏:编编 号号 姓姓 名名 分数分数 1001 王王 刚刚 70 1002 李李 鹏鹏 78 1003 张张 三三 92那么,要对某个同学记分和查分都是通过编那么,要对某个同学记分和查分都是通过编号进行,编号就是姓名的号进行,编号就是姓名的指针。指针。11l指针:指针:由由于于通通过过地地址址能能找找到到所所需需的的变变量
9、量单单元元,我我们称一个变量的地址为该变量的指针。们称一个变量的地址为该变量的指针。地址地址1 1(指针(指针1 1)地址地址2 2(指针(指针2 2)地址地址3 3(指针(指针3 3)7-17-1地址和指针的概念地址和指针的概念 a 3 a 3 b 7 b 7 c 9 c 9 12指针变量:指针变量:一一个个变变量量,是是用用来来存存放放另另一一个个变变量量的的地地址址,则则它它称为称为指针变量。指针变量。地址和指针的概念地址和指针的概念13l指针变量的定义格式指针变量的定义格式 基本类型基本类型 *指针变量名指针变量名例:例:float *p1;/*float *p1;/*实型指针实型指针
10、*/*/int *p2;/*int *p2;/*整型指针整型指针*/*/char *p3;/*char *p3;/*字符指针字符指针*/*/注意注意“*”“*”号号 不能省略。不能省略。7-2-17-2-1定义一个指针变量定义一个指针变量14例例:通通过过指指针针变变量量的的赋赋值值。必必须须在在变变量量面面前前加上地址赋值符号:加上地址赋值符号:“&”“&”Main()Main()int aint a,*p1;p1;float b,*p2;float b,*p2;char c,*p3;char c,*p3;a=100;b=3.12;c=k;a=100;b=3.12;c=k;p1=&a;/*p
11、1=&a;/*变量变量a a的地址赋给指针的地址赋给指针p1*/p1*/p2=&b;/*p2=&b;/*变量变量b b的地址赋给指针的地址赋给指针p2*/p2*/p2=&b;/*p2=&b;/*变量变量c c的地址赋给指针的地址赋给指针p3*/p3*/7-2-27-2-2指针变量的引用指针变量的引用15指针变量的使用。如果有:指针变量的使用。如果有:int aint a,*p1;p1;a=100;a=100;p1=&a;/*p1=&a;/*变量变量a a的地址赋给指针的地址赋给指针p1*/p1*/则我们用符号:则我们用符号:*p1p1表示所指变量表示所指变量a a。即即*p1=100;p1=1
12、00;7-2-27-2-2指针变量的引用指针变量的引用16同样有:同样有:Float bFloat b,*p2;p2;b=3.12;b=3.12;p2=&b;/*p2=&b;/*变量变量b b的地址赋给指针的地址赋给指针p2*/p2*/则我们用符号:则我们用符号:*p2p2表示所指变量表示所指变量b b。即即*p2=3.12;p2=3.12;7-2-27-2-2指针变量的引用指针变量的引用17因此,只要有:因此,只要有:Float bFloat b,d,*p2;d,*p2;p2=&b;p2=&b;/*/*变变量量b b的的地地址址赋赋给给指指针针p2*/p2*/p2=3.12;p2=3.12;
13、则在程序内,这两条语句是等价的:则在程序内,这两条语句是等价的:d=b;d=b;d=*p;d=*p;7-2-27-2-2指针变量的引用指针变量的引用18例:通过指针变量访问整形变量。例:通过指针变量访问整形变量。Main()Main()int a,b,*p1,*p2;int a,b,*p1,*p2;a=100;b=10;a=100;b=10;p1=&a;/*p1=&a;/*变量变量a a的地址赋给指针的地址赋给指针p1*/p1*/p2=&b;/*p2=&b;/*变量变量b b的地址赋给指针的地址赋给指针p2*/p2*/Printf(“%d,%dn”,a,b);Printf(“%d,%dn”,a
14、,b);Printf(“%d,%dn”,*p1,*p2);Printf(“%d,%dn”,*p1,*p2);结果为:结果为:100 100,1010 100 100,1010 7-2-27-2-2指针变量的引用指针变量的引用19l注意:注意:(1 1)指针变量前面的指针变量前面的“*”“*”,表示该变量的类型为指针表示该变量的类型为指针 型变量。型变量。(2 2)在定义指针变量时必)在定义指针变量时必 须指定基本类型须指定基本类型 原因是:单位字节数不同。原因是:单位字节数不同。实型指针变量一个单位是实型指针变量一个单位是 4 4个字节。个字节。型型指针变量一个单位是型型指针变量一个单位是 2
15、 2个字节。个字节。字符型指针变量一个单位是字符型指针变量一个单位是 1 1个字节。个字节。指针变量的赋值指针变量的赋值 point-2=&f;/*point-2=&f;/*实变量实变量f f的地址赋给指针的地址赋给指针*/*/point-3=&I;/*point-3=&I;/*整变量整变量i i的地址赋给指针的地址赋给指针*/*/point-4=&a;/*point-4=&a;/*字符变量字符变量a a的地址赋给指针的地址赋给指针*/*/7-2-17-2-1定义一个指针变量定义一个指针变量2000200020012001200220022003200320042004200520052006
16、2006实变实变量量f f型变型变量量i i字符字符a a20例:输入例:输入a,ba,b两个整数,按先大后小输出两个整数,按先大后小输出a a和和b b。Main()Main()int a,bint a,b,*p1,*p2;*p1,*p2;Scanf(“%d,%d”,&a,&b);Scanf(“%d,%d”,&a,&b);p1=&a;/*p1=&a;/*变量变量a a的地址赋给指针的地址赋给指针p1*/p1*/p2=&b;/*p2=&b;/*变量变量b b的地址赋给指针的地址赋给指针p2*/p2*/If(ab)If(ab)p=p1;p1=p2;p2=p;p=p1;p1=p2;p2=p;Pri
17、ntf(“na=%d,b=%dn”,a,b);Printf(“na=%d,b=%dn”,a,b);Printf(“max=%d,min=%dn”,*p1,*p2);Printf(“max=%d,min=%dn”,*p1,*p2);输入输入 5 5,9 9 结果为:结果为:a=5,b=9a=5,b=9 max=9,mix=5max=9,mix=57-2-27-2-2指针变量的引用指针变量的引用21当输入当输入a=5,b=9a=5,b=9时,由于时,由于ab,ab,将将p1p1和和p2p2交换交换。如图:如图:注注意意:a a和和b b并并未未交交换换,但但p1p1和和p2p2的的值值改改变变了了
18、。P1P1的为的为&a,a,现为现为&b,p2b,p2原为原为&b,b,现为现为&a a。7-2-27-2-2指针变量的引用指针变量的引用p p&b&b&a&ap2p2a ap1p1p p9 9b b5 5b ba ap2p2p1p19 9&a&a&b&b22l l函数的参数不仅可以是整型、实型、函数的参数不仅可以是整型、实型、字符型等,还可以是指针型。字符型等,还可以是指针型。l l指针变量作为函数参数的作用是:指针变量作为函数参数的作用是:将一个变量的地址传送到另一个函数中。将一个变量的地址传送到另一个函数中。再再举举上上例例:输输入入a,ba,b两两个个整整数数,按按先先大大后后小小输出
19、输出a a和和b b。7-2-37-2-3指针变量作为函数参数指针变量作为函数参数23main()main()int a,bint a,b,*t1,*t2;*t1,*t2;scanf(“%d,%d”,&a,&b);scanf(“%d,%d”,&a,&b);t1=&a;/*t1=&a;/*变量变量a a的地址赋给指针的地址赋给指针t1*/t1*/t2=&b;/*t2=&b;/*变量变量b b的地址赋给指针的地址赋给指针t2*/t2*/If(ab)If(ab)sw(t1,t2);sw(t1,t2);/*/*调用函数调用函数sw,sw,其中其中t1,t2t1,t2为指针变量为指针变量*/*/Prin
20、tf(“na=%d,b=%dn”,a,b);Printf(“na=%d,b=%dn”,a,b);7-2-37-2-3指针变量作为函数参数指针变量作为函数参数24子函数子函数 sw sw 的作用是交换两个变量的作用是交换两个变量a a和和b b的值。的值。Sw(int*p1,int*p2)Sw(int*p1,int*p2)int temp;int temp;temp=*p1;temp=*p1;*p1=*p2;*p1=*p2;*p2=temp;*p2=temp;运行情况如下:运行情况如下:输入:输入:5,9 5,9结果:结果:9,5 9,57-2-37-2-3指针变量作为函数参数指针变量作为函数参
21、数25当当t1=&a,t2=&bt1=&a,t2=&b时时 当调用当调用sw(t1,t2)sw(t1,t2)时时如图:如图:7-2-37-2-3指针变量的引用指针变量的引用&b&b&a&ap2p2a ap1p19 9b b5 5b ba ap2p2p1p19 9&a&a&b&b&b&b&a&at1t1t2t226当执行函数当执行函数swsw(t1,t2)t1,t2)时时 当返回主函数时当返回主函数时7-2-37-2-3指针变量的引用指针变量的引用&b&b&a&at2t2a at1t19 9b b5 5b ba ap2p2p1p19 9&a&a&b&b&b&b&a&at1t1t2t25 5函数调
22、用结束后,函数调用结束后,p1p1和和p2p2不复存不复存在(已释放)在(已释放)27l数组与指针的关系数组与指针的关系每每一一个个数数组组元元素素都都有有地地址址。该该地地址址就就是是数数组组元元素的指针。素的指针。l概念概念假设:假设:int int a a100;100;数组名数组名:数组的标识:数组的标识 a a数数组组元元素素的的地地址址:数数组组中中一一个个具具体体元元素素的的地地址址(&akak)数数组组首首地地址址(数数组组起起始始地地址址):数数组组中中第第一一个个元元素素(0 0号号元元素素)的的地地址址(&a0a0或或用用数数组组的的名名称称 a a 表示)表示)。7-3
23、7-3数组与指针数组与指针28C C语言规定:语言规定:数组名数组名就是数组的就是数组的首地址常量首地址常量。那么下面那么下面关系表达式关系表达式成立:成立:a=&a0例:例:int a10;int a10;/*/*定义定义a a为整型数组为整型数组*/*/int*p;int*p;/*/*定义定义p p为整为整 型指针变量型指针变量*/*/p=&a0;p=&a0;将第一个元素的地址赋给将第一个元素的地址赋给p,p,实际上是实际上是首地址首地址赋给赋给p p。与下条语句等价:与下条语句等价:p=ap=a p p就称为指向数组就称为指向数组a a的的指针变量。指针变量。指向数组的指针指向数组的指针
24、&a0a0a0a0 29C C语语言言规规定定:如如果果指指针针变变量量p p已已指指向向数数组组中中的的一一个个元素,元素,则则p+1p+1指向同一指向同一数组中的数组中的下一个元素。下一个元素。例如:例如:int a4,*p;int a4,*p;p=&a0;p=&a0;则:则:p+1 a1p+1 a1 p+2 a2 p+2 a2 p+3 a3 p+3 a37-37-3指向数组的指针指向数组的指针注:这里的注:这里的p+1p+1是指加上一个单元,是指加上一个单元,不同的变量,单元的大小不同。不同的变量,单元的大小不同。整型指针变量整型指针变量p+1p+1等于等于p p的地址的地址 加上加上2
25、 2个字节。个字节。p+2=p+4p+2=p+4个节。个节。(实型:(实型:p+1=p+4p+1=p+4个字节。个字节。字符型:字符型:p+1=p+1p+1=p+1个字节。个字节。30l例例C5_5001.C:分析程序分析程序。#include include main()main()int a =1,2,3,4,5 ;int a =1,2,3,4,5 ;int x,y,*int x,y,*p p;/*/*指针变量指针变量 p p*/*/p p=&a0;=&a0;x=*(x=*(p+2p+2););y=*(y=*(p+4p+4););printf(*p=%d,x=%d,y=%dn,*p,x,y
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 PPT 课件 08 指针
限制150内