C语言程序设计_第6章_指针.ppt
《C语言程序设计_第6章_指针.ppt》由会员分享,可在线阅读,更多相关《C语言程序设计_第6章_指针.ppt(87页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第6 6章章 指指 针针C C 语言程序设计语言程序设计北京科技大学北京科技大学 计算机系计算机系北京科技大学2023/4/1 6 6 6 6.1.1.1.1 概述概述概述概述 6 6 6 6.2.2.2.2 指针和指针变量指针和指针变量指针和指针变量指针和指针变量 6 6 6 6.3.3.3.3 指针与数组指针与数组指针与数组指针与数组 6.4 6.4 6.4 6.4 指针和函数指针和函数指针和函数指针和函数 6.5 6.5 6.5 6.5 动态存储分配动态存储分配动态存储分配动态存储分配第第6 6章章 指针指针北京科技大学2023/4/16.1概述概述l l为什么要引入指针的概念?为什么
2、要引入指针的概念?为什么要引入指针的概念?为什么要引入指针的概念?指针可以有效地表示复杂数据结构,如队列、指针可以有效地表示复杂数据结构,如队列、指针可以有效地表示复杂数据结构,如队列、指针可以有效地表示复杂数据结构,如队列、栈、链表等。栈、链表等。栈、链表等。栈、链表等。指针能象汇编语言一样处理内存地址,为动态指针能象汇编语言一样处理内存地址,为动态指针能象汇编语言一样处理内存地址,为动态指针能象汇编语言一样处理内存地址,为动态内存分配提供支持。内存分配提供支持。内存分配提供支持。内存分配提供支持。指针可实现对数组和字符串的方便使用,提高指针可实现对数组和字符串的方便使用,提高指针可实现对数
3、组和字符串的方便使用,提高指针可实现对数组和字符串的方便使用,提高某些子程序的效率。某些子程序的效率。某些子程序的效率。某些子程序的效率。北京科技大学6.1概述概述l l关于指关于指针的原的原则 学习原则学习原则l l一定要学会一定要学会一定要学会一定要学会l l其实通常的应用很简单其实通常的应用很简单其实通常的应用很简单其实通常的应用很简单 使用原则使用原则l l永远要清楚每个指针指向了哪里永远要清楚每个指针指向了哪里永远要清楚每个指针指向了哪里永远要清楚每个指针指向了哪里l l永远要清楚指针的指向位置是什么永远要清楚指针的指向位置是什么永远要清楚指针的指向位置是什么永远要清楚指针的指向位置
4、是什么2023/4/1北京科技大学2023/4/1 main()main()main()main()int a=5;int a=5;int a=5;int a=5;int int int int b;b;b;b;float float float float x=3.5;x=3.5;x=3.5;x=3.5;变量的两个物理意义变量的两个物理意义1 1 1 10 0 0 0010101011002100210021002100310031003100310041004100410041015101510151015101610161016101610171017101710171018101810
5、1810182002200220022002200320032003200320042004200420042005200520052005a a a aB B B Bx x x x变量的内容变量的内容变量的地址变量的地址6.2指针和指针变量指针和指针变量535.0变量的内容变量的内容变量的内容变量的内容变量的地址变量的地址变量的地址变量的地址6 6.2 2.1 1 基本概念基本概念基本概念基本概念北京科技大学变量的地址和变量的内容变量的地址和变量的内容l l变量的地址量的地址 变量所分配存储空间的首地址变量所分配存储空间的首地址l l变量的内容量的内容 变量在所分配的存储空间中存放的数据变量
6、在所分配的存储空间中存放的数据2023/4/1北京科技大学2023/4/1 main()main()main()main()int int int int a a a a,b;b;b;b;float x=35;float x=35;float x=35;float x=35;a=5;a=5;a=5;a=5;b=a+3;b=a+3;b=a+3;b=a+3;10011001100110011002100210021002100310031003100310041004100410041015101510151015101610161016101610171017101710171018101810
7、181018a a a ab b b b5 5 5 5直接将整数直接将整数直接将整数直接将整数 5 5 5 5 存入变量存入变量存入变量存入变量 a a a a 直接直接直接直接将变量将变量将变量将变量 a a a a 的值取的值取的值取的值取出,相加后存入变量出,相加后存入变量出,相加后存入变量出,相加后存入变量b b b b 利用变量名利用变量名利用变量名利用变量名存取数据的方式存取数据的方式存取数据的方式存取数据的方式称为称为称为称为“直接存取直接存取直接存取直接存取”方式。方式。方式。方式。直接存取和间接存取直接存取和间接存取8 8 8 8北京科技大学2023/4/1CC语言语言语言语
8、言还提供了对还提供了对还提供了对还提供了对内存单元的内存单元的内存单元的内存单元的“间接存取间接存取间接存取间接存取”方式方式方式方式p p100110011001100110021002100210021003100310031003100410041004100410151015101510151016101610161016101710171017101710181018101810182004200420042004200520052005200520062006200620062007200720072007a a a ab b b b51001p p10011001a a3 mai
9、n(main(main(main()int a=5,b=3int a=5,b=3int a=5,b=3int a=5,b=3,*,*,*,*p;p;p;p;p=p=p=p=&a;&a;&a;&a;*p=a+b;*p=a+b;*p=a+b;*p=a+b;l l变量的地址称为变量的指针变量的地址称为变量的指针变量的地址称为变量的指针变量的地址称为变量的指针l l存放地址的变量称为指针变量存放地址的变量称为指针变量存放地址的变量称为指针变量存放地址的变量称为指针变量l lp p指向指向指向指向c,cc,c为为为为p p所指向的目标变量。所指向的目标变量。所指向的目标变量。所指向的目标变量。直接存取和
10、间接存取直接存取和间接存取8北京科技大学指针的类型和指针所指向的类型指针的类型和指针所指向的类型inta=5,b;floatx;int*pi;float*pf;l lpi指指针的的类型:型:int*l lpf指指针的的类型:型:float*l lpi所指向的所指向的类型:型:intl lpf所指向的所指向的类型:型:float2023/4/1北京科技大学2023/4/1voidmainvoidmain()()floatx,floatx,*p1*p1=NULL=NULL;float*p2float*p2=&x=&x;inty,*p3inty,*p3=&y=&y;charname20,charna
11、me20,*cp=name;*cp=name;2000200020002000 2002002002004 4 4 420082008200820082012201220122012201620162016201620202020202020202040204020402040 x x x x p1 p1 p1 p1 p2 p2 p2 p2 y y y y p3 p3 p3 p3namenamenamename cpcpcpcp20006.2指针和指针变量指针和指针变量6 6.2 2.2.2 指针变量的定义指针变量的定义指针变量的定义指针变量的定义NULLvoid main()void mai
12、n()void main()void main()float x,*p1,*p2;float x,*p1,*p2;float x,*p1,*p2;float x,*p1,*p2;int y,*p3;int y,*p3;int y,*p3;int y,*p3;char name20;char name20;char name20;char name20;char*cp;char*cp;char*cp;char*cp;指针变量定义的形式指针变量定义的形式指针变量初始化指针变量初始化数据类型数据类型*指针变量名指针变量名20122020北京科技大学6.2指针和指针变量指针和指针变量l l说明:说明:
13、当把一个变量的地址作为初值赋给指针当把一个变量的地址作为初值赋给指针时,该变量必须先给以定义,且该变量时,该变量必须先给以定义,且该变量的数据类型必须与指针的数据类型一致的数据类型必须与指针的数据类型一致 也可把一个已初始化的指针值作为初值也可把一个已初始化的指针值作为初值赋予另一指针赋予另一指针 也可通过初始化定义某种类型的空指针也可通过初始化定义某种类型的空指针2023/4/16 6.2 2.2.2 指针变量的定义指针变量的定义指针变量的定义指针变量的定义北京科技大学2023/4/16.2指针和指针变量指针和指针变量l l取地址运算取地址运算取地址运算取地址运算&变量名或数组元素名变量名或
14、数组元素名变量名或数组元素名变量名或数组元素名 int i,*p;p=&i;intint*p,a10;*p,a10;p=a;p=a;intint*p,a10;*p,a10;p=&a0;p=&a0;intint*p,a10;*p,a10;p=&a5;p=&a5;l l间接存取运算间接存取运算间接存取运算间接存取运算*指针变量或目标变量的地址指针变量或目标变量的地址指针变量或目标变量的地址指针变量或目标变量的地址intint i,*p;i,*p;p=&i;p=&i;*p=0;*p=0;intint*p,a10;*p,a10;p=a;p=a;*p=0;*p=0;intint*p,a10;*p,a10
15、;p=&a0;p=&a0;*p=0;*p=0;6 6.2 2.3 3 指针的基本运算指针的基本运算指针的基本运算指针的基本运算pa指针变量*pa指针pa的目标变量&pa指针变量pa占用存 储区域地址北京科技大学2023/4/12000200020002000200120012001200120022002200220022003200320032003200420042004200420052005200520052006200620062006200720072007200720082008200820082009200920092009a a a ap p p px x x xq q q
16、q20046.2指针和指针变量指针和指针变量6.26.2.3.3 指针的基本运算指针的基本运算指针的基本运算指针的基本运算2000*p=&a;main()main()main()main()int a,*p;int a,*p;int a,*p;int a,*p;float x,*q;float x,*q;float x,*q;float x,*q;p p p p=&a=&a=&a=&a;q q q q=&x=&x=&x=&x;赋值运算赋值运算赋值运算赋值运算5北京科技大学6.2指针和指针变量指针和指针变量l l赋值运算运算 把一个变量的地址赋给一个同类型的指针,把一个变量的地址赋给一个同类型的
17、指针,把一个变量的地址赋给一个同类型的指针,把一个变量的地址赋给一个同类型的指针,如:如:如:如:intinta,*paa,*pa;pa=&apa=&a;/*/*使使使使papa指向变量指向变量指向变量指向变量a*/a*/把一个指针的值赋给另一同类型的指针,如:把一个指针的值赋给另一同类型的指针,如:把一个指针的值赋给另一同类型的指针,如:把一个指针的值赋给另一同类型的指针,如:charc,*s1=&c,*s2charc,*s1=&c,*s2;s2=s1s2=s1;/*/*结果结果结果结果s1s1和和和和s2s2指向同一变量指向同一变量指向同一变量指向同一变量c*/c*/2023/4/16.2
18、6.2.3.3 指针的基本运算指针的基本运算指针的基本运算指针的基本运算北京科技大学6.2指针和指针变量指针和指针变量l l赋值赋值运算运算运算运算 将地址常量如数组名赋给同类型的指针,如:将地址常量如数组名赋给同类型的指针,如:将地址常量如数组名赋给同类型的指针,如:将地址常量如数组名赋给同类型的指针,如:chchar*str,ch80ar*str,ch80;strstr=chch;/*/*使使使使strstr得到字符数组得到字符数组得到字符数组得到字符数组chch的首地的首地的首地的首地址,即址,即址,即址,即strstr指向数组指向数组指向数组指向数组chch*/*/同类型指针算术运算的
19、结果,如果还是地址同类型指针算术运算的结果,如果还是地址同类型指针算术运算的结果,如果还是地址同类型指针算术运算的结果,如果还是地址量的话,可以赋值给同类型的指针。例如:量的话,可以赋值给同类型的指针。例如:量的话,可以赋值给同类型的指针。例如:量的话,可以赋值给同类型的指针。例如:intint*p1,*p2,a20*p1,*p2,a20;p1=ap1=a;p2=p1+5p2=p1+5;p1=p2-3p1=p2-3;2023/4/16.26.2.3.3 指针的基本运算指针的基本运算指针的基本运算指针的基本运算北京科技大学2023/4/1指针变量只指针变量只存放地址存放地址!一个指针变量不能一个
20、指针变量不能指向与其类型不同指向与其类型不同的变量的变量!应在类型相应在类型相同的指针变同的指针变量之间赋值量之间赋值这是正确的!这是正确的!不能给指针赋非地不能给指针赋非地址值!址值!北京科技大学2023/4/1方法方法方法方法1 1 1 1:目标变量值不变,改变指针变量的:目标变量值不变,改变指针变量的:目标变量值不变,改变指针变量的:目标变量值不变,改变指针变量的指向求解。指向求解。指向求解。指向求解。voidvoidvoidvoid main(main(main(main()intintintint a,ba,ba,ba,b,*p1p1p1p1,*p2p2p2p2,*p p p p;p
21、1p1p1p1=&a;a;a;a;p2p2p2p2=&b;b;b;b;scanf(scanf(scanf(scanf(“%d%d%d%d%d%d%d%d”,p1p1p1p1,p2p2p2p2););););if(if(if(if(*p1p1p1p1 *p2p2p2p2)p=p1;p1=p2;p2=pp=p1;p1=p2;p2=pp=p1;p1=p2;p2=pp=p1;p1=p2;p2=p;printf(printf(printf(printf(“a a a a=%=%=%=%d,bd,bd,bd,b=%=%=%=%dndndndn”,a,b,a,b,a,b,a,b););););printf(
22、printf(printf(printf(“maxmaxmaxmax=%=%=%=%d,mind,mind,mind,min=%=%=%=%dndndndn”,*p1p1p1p1,*p2p2p2p2););););【例【例6.1】输入】输入a、b两个整数,两个整数,使用指针变量按大小顺序输出使用指针变量按大小顺序输出这两个整数。这两个整数。a ab bp1p1p2p2p p6 68 86 86 8a=6,b=8a=6,b=8max=8,min=6max=8,min=66.2.3指针的基本运算指针的基本运算(续续)北京科技大学2023/4/1方法方法方法方法2 2 2 2:利用指针变量直接改变目
23、标变量的值。:利用指针变量直接改变目标变量的值。:利用指针变量直接改变目标变量的值。:利用指针变量直接改变目标变量的值。voidvoidvoidvoid main(main(main(main()intintintint a,b,ta,b,ta,b,ta,b,t,*p1p1p1p1,*p2p2p2p2;p1p1p1p1=&a;a;a;a;p2p2p2p2=&b;b;b;b;scanf(scanf(scanf(scanf(%d%d%d%d%d%d%d%d,p1p1p1p1,p2p2p2p2););););if(if(if(if(*p1p1p1p1 *p2p2p2p2)t=t=t=t=*p1p1p
24、1p1;*p1p1p1p1=*p2p2p2p2;*p2p2p2p2=t;=t;=t;=t;printf(printf(printf(printf(a a a a=%=%=%=%d,bd,bd,bd,b=%=%=%=%dndndndn,a,b,a,b,a,b,a,b););););printfprintfprintfprintf(maxmaxmaxmax=%=%=%=%d,mind,mind,mind,min=%=%=%=%dndndndn,*p1p1p1p1,*p2p2p2p2););););a a、*p1*p1b b、*p2*p2p1p1p2p2t t6 68 86 86 8a=8,b=6a
25、=8,b=6max=8,min=6max=8,min=66 68 86 66.2.3指针的基本运算指针的基本运算北京科技大学2023/4/1指针的算术运算指针的算术运算指针的算术运算指针的算术运算 6.2.3指针的基本运算指针的基本运算void main(void main(void main(void main()intintintint a=10,20,30,40,50,60,70,80,90,100;a=10,20,30,40,50,60,70,80,90,100;a=10,20,30,40,50,60,70,80,90,100;a=10,20,30,40,50,60,70,80,90,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言程序设计 指针
限制150内