C语言程序设计_第6章_指针.ppt
第第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为什么要引入指针的概念?为什么要引入指针的概念?为什么要引入指针的概念?为什么要引入指针的概念?指针可以有效地表示复杂数据结构,如队列、指针可以有效地表示复杂数据结构,如队列、指针可以有效地表示复杂数据结构,如队列、指针可以有效地表示复杂数据结构,如队列、栈、链表等。栈、链表等。栈、链表等。栈、链表等。指针能象汇编语言一样处理内存地址,为动态指针能象汇编语言一样处理内存地址,为动态指针能象汇编语言一样处理内存地址,为动态指针能象汇编语言一样处理内存地址,为动态内存分配提供支持。内存分配提供支持。内存分配提供支持。内存分配提供支持。指针可实现对数组和字符串的方便使用,提高指针可实现对数组和字符串的方便使用,提高指针可实现对数组和字符串的方便使用,提高指针可实现对数组和字符串的方便使用,提高某些子程序的效率。某些子程序的效率。某些子程序的效率。某些子程序的效率。北京科技大学6.1概述概述l l关于指关于指针的原的原则 学习原则学习原则l l一定要学会一定要学会一定要学会一定要学会l l其实通常的应用很简单其实通常的应用很简单其实通常的应用很简单其实通常的应用很简单 使用原则使用原则l l永远要清楚每个指针指向了哪里永远要清楚每个指针指向了哪里永远要清楚每个指针指向了哪里永远要清楚每个指针指向了哪里l l永远要清楚指针的指向位置是什么永远要清楚指针的指向位置是什么永远要清楚指针的指向位置是什么永远要清楚指针的指向位置是什么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 00101010110021002100210021003100310031003100410041004100410151015101510151016101610161016101710171017101710181018101810182002200220022002200320032003200320042004200420042005200520052005a a a aB B B Bx x x x变量的内容变量的内容变量的地址变量的地址6.2指针和指针变量指针和指针变量535.0变量的内容变量的内容变量的内容变量的内容变量的地址变量的地址变量的地址变量的地址6 6.2 2.1 1 基本概念基本概念基本概念基本概念北京科技大学变量的地址和变量的内容变量的地址和变量的内容l l变量的地址量的地址 变量所分配存储空间的首地址变量所分配存储空间的首地址l l变量的内容量的内容 变量在所分配的存储空间中存放的数据变量在所分配的存储空间中存放的数据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;10011001100110011002100210021002100310031003100310041004100410041015101510151015101610161016101610171017101710171018101810181018a 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语言语言语言语言还提供了对还提供了对还提供了对还提供了对内存单元的内存单元的内存单元的内存单元的“间接存取间接存取间接存取间接存取”方式方式方式方式p p100110011001100110021002100210021003100310031003100410041004100410151015101510151016101610161016101710171017101710181018101810182004200420042004200520052005200520062006200620062007200720072007a a a ab b b b51001p p10011001a a3 main(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所指向的目标变量。所指向的目标变量。所指向的目标变量。所指向的目标变量。直接存取和间接存取直接存取和间接存取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,charname20,*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 main()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说明:说明:当把一个变量的地址作为初值赋给指针当把一个变量的地址作为初值赋给指针时,该变量必须先给以定义,且该变量时,该变量必须先给以定义,且该变量的数据类型必须与指针的数据类型一致的数据类型必须与指针的数据类型一致 也可把一个已初始化的指针值作为初值也可把一个已初始化的指针值作为初值赋予另一指针赋予另一指针 也可通过初始化定义某种类型的空指针也可通过初始化定义某种类型的空指针2023/4/16 6.2 2.2.2 指针变量的定义指针变量的定义指针变量的定义指针变量的定义北京科技大学2023/4/16.2指针和指针变量指针和指针变量l l取地址运算取地址运算取地址运算取地址运算&变量名或数组元素名变量名或数组元素名变量名或数组元素名变量名或数组元素名 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;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 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赋值运算运算 把一个变量的地址赋给一个同类型的指针,把一个变量的地址赋给一个同类型的指针,把一个变量的地址赋给一个同类型的指针,把一个变量的地址赋给一个同类型的指针,如:如:如:如: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.26.2.3.3 指针的基本运算指针的基本运算指针的基本运算指针的基本运算北京科技大学6.2指针和指针变量指针和指针变量l l赋值赋值运算运算运算运算 将地址常量如数组名赋给同类型的指针,如:将地址常量如数组名赋给同类型的指针,如:将地址常量如数组名赋给同类型的指针,如:将地址常量如数组名赋给同类型的指针,如:chchar*str,ch80ar*str,ch80;strstr=chch;/*/*使使使使strstr得到字符数组得到字符数组得到字符数组得到字符数组chch的首地的首地的首地的首地址,即址,即址,即址,即strstr指向数组指向数组指向数组指向数组chch*/*/同类型指针算术运算的结果,如果还是地址同类型指针算术运算的结果,如果还是地址同类型指针算术运算的结果,如果还是地址同类型指针算术运算的结果,如果还是地址量的话,可以赋值给同类型的指针。例如:量的话,可以赋值给同类型的指针。例如:量的话,可以赋值给同类型的指针。例如:量的话,可以赋值给同类型的指针。例如: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指针变量只指针变量只存放地址存放地址!一个指针变量不能一个指针变量不能指向与其类型不同指向与其类型不同的变量的变量!应在类型相应在类型相同的指针变同的指针变量之间赋值量之间赋值这是正确的!这是正确的!不能给指针赋非地不能给指针赋非地址值!址值!北京科技大学2023/4/1方法方法方法方法1 1 1 1:目标变量值不变,改变指针变量的:目标变量值不变,改变指针变量的:目标变量值不变,改变指针变量的:目标变量值不变,改变指针变量的指向求解。指向求解。指向求解。指向求解。voidvoidvoidvoid main(main(main(main()intintintint a,ba,ba,ba,b,*p1p1p1p1,*p2p2p2p2,*p p p p;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)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(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:利用指针变量直接改变目标变量的值。:利用指针变量直接改变目标变量的值。:利用指针变量直接改变目标变量的值。:利用指针变量直接改变目标变量的值。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=*p1p1p1p1;*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=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,100;intintintint i,*i,*i,*i,*ptrptrptrptr,*,*,*,*p1p1p1p1,*p2p2p2p2;ptrptrptrptr=a;=a;=a;=a;for(i=0;i10;i+)for(i=0;i10;i+)for(i=0;i10;i+)for(i=0;i10;i+)(*(*(*(*ptrptrptrptr)+;)+;)+;)+;ptrptrptrptr+;+;+;+;p1=p2=a;p1+=5;p2+;p1=p2=a;p1+=5;p2+;p1=p2=a;p1+=5;p2+;p1=p2=a;p1+=5;p2+;printf(printf(printf(printf(aaaa=%=%=%=%unununun”,a,a,a,a););););printf(printf(printf(printf(“p1p1p1p1=%u,*p1=%dn=%u,*p1=%dn=%u,*p1=%dn=%u,*p1=%dn,p1p1p1p1,*p1p1p1p1););););printf(printf(printf(printf(“p2=%u,*p2=%dnp2=%u,*p2=%dnp2=%u,*p2=%dnp2=%u,*p2=%dn”,p2,*p2);,p2,*p2);,p2,*p2);,p2,*p2);printf(printf(printf(printf(p1-p2=%dnp1-p2=%dnp1-p2=%dnp1-p2=%dn”,p1-p2);,p1-p2);,p1-p2);,p1-p2);printfprintfprintfprintf(“*(p1+2)=%d,(*p1)+2=%*(p1+2)=%d,(*p1)+2=%*(p1+2)=%d,(*p1)+2=%*(p1+2)=%d,(*p1)+2=%dndndndn”,*(p1+2),(*p1)+2);,*(p1+2),(*p1)+2);,*(p1+2),(*p1)+2);,*(p1+2),(*p1)+2);a=1245016p1=1245036,*p1=61p2=1245020,*p2=21p1-p2=4*(p1+2)=81,(*p1+2)=63指针加减运算要点:指针加减运算要点:指针加减运算要点:指针加减运算要点:两个指针变量不能做加法运算。两个指针变量不能做加法运算。只有当指针变量指向数组时,并且只有当只有当指针变量指向数组时,并且只有当运算结果仍指向同一数组中的元素时,指针运算结果仍指向同一数组中的元素时,指针的加减运算才有意义。的加减运算才有意义。指针加减运算的结果不以字节为单位,而指针加减运算的结果不以字节为单位,而是以数据类型的大小(即是以数据类型的大小(即sizeof(类型类型))为单)为单位。位。只有当两个指针变量指向同一数组时,进只有当两个指针变量指向同一数组时,进行指针相减才有实际意义。行指针相减才有实际意义。*(p1+n)与与(*p1)+n是两个不同的概念是两个不同的概念。ptrptr016016016016020020020020024024024024028028028028032032032032036036036036040040040040044044044044048048048048052052052052a0a0a0a0 a1a1a1a1a2a2a2a2a3a3a3a3a4a4a4a4a5a5a5a5a6a6a6a6a7a7a7a7a8a8a8a8a9a9a9a93020104050p1p1p2p260708090100312111415161718191101北京科技大学2023/4/1指针的关系运算指针的关系运算指针的关系运算指针的关系运算 404404404404405405405405406406406406407407407407408408408408409409409409410410410410411411411411412412412412413413413413a0a0a0a0a1a1a1a1a2a2a2a2301050p1p1p2p2 指向同一数组的两个指针可以进行关系指向同一数组的两个指针可以进行关系运算运算 指针与一个整型数据比较是没有意义的,指针与一个整型数据比较是没有意义的,不同类型指针变量之间的比较是非法的。不同类型指针变量之间的比较是非法的。NULL NULL可以与任何类型指针进行可以与任何类型指针进行=、!=!=的的运算,用于判断指针是否为空指针。运算,用于判断指针是否为空指针。6.2.3指针的基本运算指针的基本运算北京科技大学6.2指针与指针变量指针与指针变量2023/4/16 6.2 2.4 4 指针作为函数参数指针作为函数参数指针作为函数参数指针作为函数参数【例【例【例【例6 6.3 3】从键盘任意输入两从键盘任意输入两从键盘任意输入两从键盘任意输入两个整数,编程将其交换后个整数,编程将其交换后个整数,编程将其交换后个整数,编程将其交换后再重新输出。再重新输出。再重新输出。再重新输出。北京科技大学2023/4/1void swap(int*p1,int*p2)int temp;printf(“调用中交换前:调用中交换前:*p1=%d,*p2=%dn”,*p1,*p2);temp=*p1;*p1=*p2;*p2=temp;printf(“调用中交换后:调用中交换后:*p1=%d,*p2=%dn”,*p1,*p2);void main()int x1,x2;scanf(“%d%d”,&x1,&x2);printf(“1:x1=%d,x2=%d”,x1,x2);swap(&x1,&x2);printf(“2:x1=%d,x2=%d“,x1,x2);void swap(int x,int y)int temp;printf(“调用中交换前:调用中交换前:x=%d,y=%dn”,x,y);temp=x;x=y;y=temp;printf(“调用中交换后:调用中交换后:x=%d,y=%dn”,x,y);void main()int x1,x2;scanf(“%d%d”,&x1,&x2);printf(“1:x1=%d,x2=%d”,x1,x2);swap(a,b);printf(“2:x1=%d,x2=%d”,x1,x2);方法方法 1方法方法 2 编写函数实现两数的互换20101:x1=20,x2=10调用中交换前:x=20,y=10调用中交换后:x=10,y=202:x1=20,x2=1020101:x1=20,x2=10调用中交换前:*p1=20,*p2=10调用中交换后:*p1=10,*p2=202:x1=10,x2=20北京科技大学2023/4/1主调函数主调函数被调函数被调函数void main()void main()intint x1,x2;x1,x2;scanf(“%d%d”,&x1,&x2);scanf(“%d%d”,&x1,&x2);printf(“1:printf(“1:x1=%d,x2=%dn”,x1,x2);x1=%d,x2=%dn”,x1,x2);swap(x1,x2);swap(x1,x2);printf(“2:x1=%d,x2=%dn”,x1,printf(“2:x1=%d,x2=%dn”,x1,x2);x2);void void swap(swap(intint x,x,intint y y)int temp;int temp;printf(“printf(“调用中交换前:调用中交换前:调用中交换前:调用中交换前:x=%d,y=%dn”,x,y);x=%d,y=%dn”,x,y);temp=x;x=y;y=temp;temp=x;x=y;y=temp;printf(printf(调用中交换后:调用中交换后:调用中交换后:调用中交换后:x=%d,y=%dn,x,y);x=%d,y=%dn,x,y);2020 x1x2实实 参参形形 参参1010 xyx1x2方法方法 1xy北京科技大学2023/4/1主调函数主调函数被调函数被调函数main()main()intint x1,x2;x1,x2;scanf(“%d%d”,&x1,&x2);scanf(“%d%d”,&x1,&x2);p printf(1:x1=%d,x2=%dn,rintf(1:x1=%d,x2=%dn,x1,x2);x1,x2);swap(&x1,&x2);swap(&x1,&x2);printf(“2:printf(“2:x1=%d,x2=%dn”,x1=%d,x2=%dn”,x1,x2);x1,x2);void void swap(swap(intint*p1,*p1,intint*p2*p2)int temp;int temp;printf(printf(调用中交换前:调用中交换前:调用中交换前:调用中交换前:*p1=%d,*p2=%dn,*p1,*p2);*p1=%d,*p2=%dn,*p1,*p2);temp=*p1;*p1=*p2;*p2=temp;temp=*p1;*p1=*p2;*p2=temp;printf(printf(调用中交换后:调用中交换后:调用中交换后:调用中交换后:*p1=%d,*p2=%dn,*p1,*p2);*p1=%d,*p2=%dn,*p1,*p2);&x1&x1实实 参参形形 参参&x2&x2*p1*p2x1x1x2x2方法方法 2p1p220 x1x210北京科技大学2023/4/1void swap(int*p1,int*p2)int *p;printf(调用中交换前:调用中交换前:*p1=%d,*p2=%dn,*p1,*p2);p=p1;p1=p2;p2=p;printf(调用中交换后:调用中交换后:*p1=%d,*p2=%dn,*p1,*p2);void main()int x1,x2;scanf(“%d%d”,&x1,&x2);printf(“1:x1=%d,x2=%dn”,x1,x2);swap(&x1,&x2);printf(“2:x1=%d,x2=%dn”,x1,x2);方法方法 3编写函数实现两数的互换20101:x1=20,x2=10调用中交换前:*p1=20,*p2=10调用中交换后:*p1=10,*p2=202:x1=20,x2=10北京科技大学2023/4/1主调函数主调函数被调函数被调函数main()main()intint x1,x2;x1,x2;scanf(“%d%d”,&x1,&x2);scanf(“%d%d”,&x1,&x2);printf(“1:x1=%d,x2=%dn”,printf(“1:x1=%d,x2=%dn”,x1,x2);x1,x2);swap(&x1,&x2);swap(&x1,&x2);printf(“2:x1=%d,x2=%dn”,printf(“2:x1=%d,x2=%dn”,x1,x2);x1,x2);void swap(int*p1,int*p2)void swap(int*p1,int*p2)int *p;int *p;printf(“printf(“调用中交换前调用中交换前调用中交换前调用中交换前:*p1=%d,*p2=%dn”,*p1,*p2);*p1=%d,*p2=%dn”,*p1,*p2);p=p1;p1=p2;p2=p;p=p1;p1=p2;p2=p;printf(printf(调用中交换后:调用中交换后:调用中交换后:调用中交换后:*p1=%d,*p2=%dn,*p1,*p2);*p1=%d,*p2=%dn,*p1,*p2);&x1&x1实实 参参形形 参参&x2&x2p1p2x1x1x2x2方法方法3p1p220 x1x210&x1p北京科技大学2023/4/1数组名是该数组的指针数组名是该数组的指针数组名是该数组的指针数组名是该数组的指针 a a a a&a0,a+1&a0,a+1&a0,a+1&a0,a+1&a1,&a1,&a1,&a1,a+4,a+4,a+4,a+4&a4&a4&a4&a4 数组元素的下标表示法:数组元素的下标表示法:数组元素的下标表示法:数组元素的下标表示法:a0,a1,a0,a1,a0,a1,a0,a1,aiaiaiai,a4,a4,a4,a4 数组元素的指针表示法:数组元素的指针表示法:数组元素的指针表示法:数组元素的指针表示法:*(a+0),*(a+1),*(a+0),*(a+1),*(a+0),*(a+1),*(a+0),*(a+1),*(,*(,*(,*(a+ia+ia+ia+i),),),),*(a+4),*(a+4),*(a+4),*(a+4)6.3指针与数组指针与数组6 6.3.13.1 指针与一维数组指针与一维数组指针与一维数组指针与一维数组1.1.建立指针与一维数组的联系建立指针与一维数组的联系建立指针与一维数组的联系建立指针与一维数组的联系 例如:例如:例如:例如:intintintint a5;a5;a5;a5;a0a0a4a4a a北京科技大学2023/4/1用用p p表示数组元素表示数组元素l l 下标法:下标法:p0,p1,p0,p1,p9,p9 l l 指针法:指针法:*(p+0),*(p+1),*(p+0),*(p+1),*(p+9),*(p+9)a0a0a9a9p p p p2 2.通过指针引用数组元素通过指针引用数组元素通过指针引用数组元素通过指针引用数组元素例如:例如:例如:例如:intintintint a10,*p;a10,*p;a10,*p;a10,*p;p=p=p=p=a;a;a;a;(或或或或 p=&a0;p=&a0;p=&a0;p=&a0;)a a6.3.1指针与一维数组指针与一维数组北京科技大学2023/4/1【例例例例6 6.4.4】用指针变量引用数组元素,完成给数组元素赋值并用指针变量引用数组元素,完成给数组元素赋值并用指针变量引用数组元素,完成给数组元素赋值并用指针变量引用数组元素,完成给数组元素赋值并输出数组元素。输出数组元素。输出数组元素。输出数组元素。#include#include void main()void main()intint *p,b5,i;*p,b5,i;p=b;p=b;/*/*建立指建立指建立指建立指针针针针和数和数和数和数组组组组关关关关联联联联*/for(i=0;i5;i+)for(i=0;i5;i+)*p+=i;*p+=i;p=b;p=b;/*/*注意要把指注意要把指注意要把指注意要把指针针针针重新指向数重新指向数重新指向数重新指向数组组组组首地址首地址首地址首地址*/for(i=0;i5;i+)for(i=0;i5;i+)printf(b%dprintf(b%d=%=%dt,idt,i,*p+);,*p+);printf(nprintf(n););6.3.1指针与一维数组指针与一维数组(续续)运行结果:b0=0b1=1b2=2b3=3b4=4北京科技大学6.3.1指针与一维数组(续)指针与一维数组(续)l l使用指针法访问数组元素需注意几个问题:使用指针法访问数组元素需注意几个问题:作为数组名的指针常量值不可改变作为数组名的指针常量值不可改变,而而指针是地址变量,其值可以改变。指针是地址变量,其值可以改变。利用指针变量访问数组元素,要考虑数利用指针变量访问数组元素,要考虑数组越界问题。组越界问题。在数组元素的下标表示法中如果采用指在数组元素的下标表示法中如果采用指针变量,其下标可以出现负值。针变量,其下标可以出现负值。在指针变量运算中需要特别注意单目运在指针变量运算中需要特别注意单目运算符的右结合性。算符的右结合性。2023/4/1北京科技大学6.3.1指针与一维数组指针与一维数组2023/4/13 3.数组名与函数参数数组名与函数参数数组名与函数参数数组名与函数参数【例【例6.5】从键盘输入从键盘输入5 5个整数,个整数,找出其中的最大数(用函数实找出其中的最大数(用函数实现),并输出。现),并输出。p a0 a1 aN-1主调函数被调函数北京科技大学#include#include#defineN10#defineN10intintmax1(intp,max1(intp,intintn)/*n)/*形参形参形参形参为为数数数数组组名名名名*/*/intint i,maxi,max;max=p0;max=p0;for(ifor(i=1;in;i+)/*=1;in;i+)/*求最大求最大求最大求最大值值*/*/if(maxif(max pipi)max=)max=pipi;return(maxreturn(max););/*/*返回最大返回最大返回最大返回最大值值*/*/intintmax2(int*p,max2(int*p,intintn)/*n)/*形参形参形参形参为为指指指指针针*/*/intint i,maxi,max,*q;,*q;q=p;q=p;max=*q;max=*q;for(;qfor(;qp+n;qp+n;q+)+)/*/*求最大求最大求最大求最大值值*/*/if(maxif(max*q)max=*q;*q)max=*q;return(maxreturn(max););/*/*返回最大返回最大返回最大返回最大值值*/*/2023/4/1北京科技大学voidmain()voidmain()intint i,aNi,aN;intintmax;/*mean()max;/*mean()函数定函数定函数定函数定义义在前,可不予声明在前,可不予声明在前,可不予声明在前,可不予声明*/*/for(ifor(i=0;iN;i+)=0;iN;i+)/*/*输输入数入数入数入数组组*/*/scanf(%d,&aiscanf(%d,&ai););max=max1(a,N);/*max=max1(a,N);/*调调用形参用形参用形参用形参为为数数数数组组名的名的名的名的max1()max1()函数函数函数函数*/*/*max=max2(a,N);*/*