《《指针与数组》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《指针与数组》PPT课件.ppt(37页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、实验实验15指针概念及应用指针概念及应用15.2.1变量与内存单元变量与内存单元1.指针、地址、内存单元指针、地址、内存单元 内内存存由由很很多多内内存存单单元元组组成成,这这些些内存单元都是用来存放数据的。内存单元都是用来存放数据的。每每个个内内存存单单元元都都有有一一个个编编号号,称称为为地址地址。由于通过地址可以找到对应的由于通过地址可以找到对应的内存单元,也就是说一个地址内存单元,也就是说一个地址“指指向向”它所对应的内存单元,因此地它所对应的内存单元,因此地址被形象化地称为址被形象化地称为“指针指针”。20002000200020002001200120012001200220022
2、00220022003200320032003200420042004200420052005200520052.变量与变量的地址变量与变量的地址 变变量量代代表表了了一一个个内内存存单单元元,是是用用来来存存放放数数据据的。的。假如用下面两个语句定义了两个变量假如用下面两个语句定义了两个变量x和和c:floatx;intc;那那么么x、c都都代代表表内内存存单单元元,分分别别用用来来存存放放一一个单精度实型数和一个整型数。个单精度实型数和一个整型数。main()float x;int y;2000200020002000200120012001200120022002200220022003
3、20032003200320042004200420042005200520052005x x x xy y y y变量的内容变量的内容变量的地址变量的地址 由于变量代表内存单元,因此变量有地址。由于变量代表内存单元,因此变量有地址。变量的地址变量的地址用求地址运算符用求地址运算符“&”求出。求出。如变量如变量x的地址是的地址是&x,变量,变量c的地址是的地址是&c。变量定义后在使用过程中不再重新分配变量定义后在使用过程中不再重新分配内存单元,这个过程中变量的地址是一个常内存单元,这个过程中变量的地址是一个常量。量。15.2.2指针变量指针变量1.指针变量的定义指针变量的定义 变变量量是是内内
4、存存单单元元,不不同同类类型型的的变变量量可可以以存存放放不不同同类类型型的的数数据据,如如整整型型变变量量可可以以存存放放一一个个整整型型数数,实实型变量可以存放一个实型数。型变量可以存放一个实型数。那那么么有有没没有有一一种种变变量量可可以以存存放放一一个个地地址址(指指针针)呢?呢?这种变量就称为这种变量就称为指针变量指针变量。指针变量的定义格式:指针变量的定义格式:类型名类型名*变量名;变量名;如下语句定义了两个指针变量如下语句定义了两个指针变量pt1和和pt2。int*pt1;/*/*定定义义了了指指针针变变量量pt1pt1,其值是一个整型变量的地址其值是一个整型变量的地址 */*/
5、float*pt2;/*/*定定义义了了指指针针变变量量pt2pt2,其值是一个实型变量的地址其值是一个实型变量的地址 */*/注注意意:这这里里定定义义的的指指针针变变量量是是pt1和和pt2,而不是而不是*pt1和和*pt2。2.指针变量的赋值与初始化指针变量的赋值与初始化 指指针针变变量量的的值值是是指指针针,因因此此只只能能将将指指针针赋赋值给指针变量。如:值给指针变量。如:int x,*p1;/*/*此此语语句句定定义义了了2 2个个变变量量:x x、p1,p1,其中其中p1p1是指针变量。是指针变量。*/*/char a,*p2;/*/*此此语语句句定定义义了了2 2个个变变量量:
6、a a、p2,p2,其中其中p2p2是指针变量。是指针变量。*/*/p1=&x;/*/*将将x x的地址赋给的地址赋给p1 */p1 */p2=&a;/*/*将将a a的地址赋给的地址赋给p2*/p2*/注意不能这样赋值:注意不能这样赋值:p2=&x;为什么?为什么?因为因为p2的值只能是字符型变量的地址。的值只能是字符型变量的地址。指指针针变变量量的的初初始始化化就就是是在在定定义义变变量量的的同同时时给变量一个初始值。给变量一个初始值。如如int x,*p=&x;/*/*相当于相当于int x,*p;p=&x;注意这里注意这里&x&x赋给赋给p p而不是而不是*p*/*p*/15.2.3指
7、针的指向指针的指向1.指针变量的值与指针变量的指向指针变量的值与指针变量的指向 如果指针变量如果指针变量p的值是的值是&x,那么,那么p指向指向x。由由于于指指针针变变量量的的值值是是可可以以变变化化的的,因因此此指指针针变变量量随随着着其其值值的的不不同同而而指指向向不不同同的的内内存存单单元元或或变变量量。如:如:int x,y,*p;p=&x;/*p /*p的值是的值是&x&x,因此,因此p p指向指向x*/x*/p=&y;/*p /*p的值改成的值改成&y&y,因而,因而p p也指向了也指向了y*/y*/2.指向运算指向运算 指向运算用运算符指向运算用运算符“*”表示,其格式为:表示,
8、其格式为:*指针变量指针变量 以上表示以上表示“指针变量所指向的变量指针变量所指向的变量”。假如假如p是指针变量,那么是指针变量,那么*p就是就是p指向的变指向的变量。当量。当p的值是的值是&a,即,即p指向指向a时,时,*p就是就是a。p p20002000200020002001200120012001200220022002200220032003200320032004200420042004200520052005200520062006200620062007200720072007a a a ab b b bc c c c532004a a a a和和和和b b b b相加的结果
9、相加的结果相加的结果相加的结果(*p p p p=a a a a+b b b b)存放存放存放存放到变量到变量到变量到变量p p p p所指向的所指向的所指向的所指向的内存单元内存单元内存单元内存单元中去。中去。中去。中去。此时此时此时此时c c c c称为指针变量称为指针变量称为指针变量称为指针变量p p p p的的的的目标变量目标变量目标变量目标变量。p p20042004c cp=&c8 main()main()main()main()int a=5,b=3,c,*p;int a=5,b=3,c,*p;int a=5,b=3,c,*p;int a=5,b=3,c,*p;p=&c;p=&c
10、;p=&c;p=&c;*p=a+b;*p=a+b;*p=a+b;*p=a+b;变量的地址称为变量的指针变量的地址称为变量的指针变量的地址称为变量的指针变量的地址称为变量的指针 存放地址的变量称为指针变量存放地址的变量称为指针变量存放地址的变量称为指针变量存放地址的变量称为指针变量3.运算符运算符“*”的三种含义的三种含义C语语言言中中运运算算符符“*”在在不不同同的的地地方方表表示示不不同同的的含含义义:(1)“*”的位置在两个量的中间,表示的位置在两个量的中间,表示“相乘相乘”。如:如:a*b 2*x+1(2)“*”出出现现在在变变量量定定义义语语句句或或函函数数的的形形参参列列表表中中,表
11、示变量是指针类型。表示变量是指针类型。如:如:int*x;/*/*表示表示x x是指针类型是指针类型*/*/void fun(int*u)void fun(int*u)函数体函数体/*/*表示表示u u是指针类型是指针类型*/*/(3)“*”的的位位置置在在一一个个变变量量的的前前面面(但但不不是是(2)的的情况),表示指向运算。情况),表示指向运算。如:如:*x=5;b=*t;(*u)+;printf(%d,*p);15.2.4指针与数组指针与数组1.数组的指针表示数组的指针表示C语语言言规规定定,数数组组名名代代表表了了数数组组的的首首地地址址,是是数数组组首首个个元元素素的的地地址址,它
12、它是是一一个个常常量量。换换言言之之,数数组组名名是是一一个个指指针针,指指向向数数组组的的第第一一个元素。个元素。如如int x20;那么那么x就是就是&x0,*x就是就是x0。c语语言言中中还还规规定定:如如果果某某个个指指针针p指指向向数数组组的的某某个个元元素素,则则p+1指指向向数数组组的的下下一一个元素。个元素。由由此此得得出出:假假如如x是是数数组组名名,x+i就就是是&xi,*(x+i)就就是是xi。事事实实上上,在在C语语言言中中,xi就就是是处处理理成成*(x+i)进进行行运运算算的。的。2.用指针变量指向数组元素用指针变量指向数组元素 可以定义指针变量指向数组元素。如:可
13、以定义指针变量指向数组元素。如:float x10;float*p;p=x;/*p /*p指向指向x0 */x0 */p=x+2;/*p /*p指向指向x2 */x2 */p+;/*p /*p指向指向x3 */x3 */可可以以使使用用指指针针变变量量代代替替下下标标访访问问所所有有数数组组元素,如元素,如float x10;float*p;for(p=x;p=p+9;p+)scanf(%f,p);/*/*输入每个元素输入每个元素 */*/for(p=x;p=p+9;p+)printf(%ft,*p);/*/*输出每个元素输出每个元素 */*/15.2.5指针与字符串指针与字符串1.字符串的指
14、针表示字符串的指针表示 字字符符串串存存放放在在字字符符型型数数组组中中,可可以以象象数数组组一一样样用用指指针针的的形形式式访访问问字字符符串串中中的的字字符符。假假如有:如有:char str20=visualc+;那么,那么,str是字符串的首地址,是字符串的首地址,*str就是就是str0,即字符串中的首字符,即字符串中的首字符v;*(str+2)就是就是str2,即字符,即字符s。2.使用指针变量指向字符串中的字符使用指针变量指向字符串中的字符 与与数数组组类类似似,使使用用指指针针变变量量可可以以方方便便访访问问字字符串中的字符,如:符串中的字符,如:char str20=visu
15、alc+;char*p;p=str;/*p /*p指向字符串中的首字符指向字符串中的首字符v */v */p+;/*/*指指针针往往后后移移动动一一个个位位置置,指指向向第第二个字符二个字符 */*/p-;/*/*指针往前移动一个位置指针往前移动一个位置 */*/3.使用指针变量代替下标遍历字符串使用指针变量代替下标遍历字符串 下下面面给给出出使使用用指指针针变变量量遍遍历历字字符符串串中中每每个字符的方法,如个字符的方法,如char x10=abcd;char*p;for(p=x;*p!=0;p+)printf(%ct,*p);/*/*输出每个字符输出每个字符 */*/4.关于字符串的若干提
16、法关于字符串的若干提法 字字符符串串是是指指以以0结结束束的的一一串串字字符符,我我们们可可用用字字符符型型数数组组来来存存放放字字符符串串,也也可可以以用一个指针变量指向字符串。如:用一个指针变量指向字符串。如:char x30=abcd,*p;p=x;这时字符串这时字符串abcd有如下几种提法:有如下几种提法:(1)由由于于abcd存存放放在在数数组组x中中,因因此此被被称称为为“存存放在放在x中的字符串中的字符串”;(2)由由于于数数组组名名x就就是是首首地地址址,指指向向字字符符串串abcd的的首首字字符符,因因此此abcd也也是是“指指针针x指指向向的的字字符符串串”;(3)p也指向
17、字符串也指向字符串“abcd”的首字符,因此的首字符,因此“abcd”也是也是“指针指针p指向的字符串指向的字符串”。习惯上,习惯上,“指针指针x指向的字符串指向的字符串”常被简称为常被简称为“字符串字符串x”。在后面描述中,如果遇到。在后面描述中,如果遇到“字符串字符串s”的名称实际上就是的名称实际上就是“指针指针s指向的字符串指向的字符串”。5.字符指针被看成是字符串字符指针被看成是字符串*如如上上所所述述,“字字符符指指针针p”可可以以看看成成是是“p所所指指的的字字符符串串”,也也就就是是说说,一一个个指指针针可可以以当当成成字字符符串串使使用用。如如:char*p=abcd;/*/*
18、定义指针变量指向定义指针变量指向abcdabcd的第一个字符的第一个字符*/*/gets(p);/*/*输输入入一一个个字字符符串串,放放入入以以p p为为首首地地址址的内存空间中的内存空间中*/*/p3=w;/*/*改变一个字符改变一个字符,相当于相当于*(p+3)=w*/*(p+3)=w*/printf(%s,p);/*/*输出以输出以p p为首地址的字符串为首地址的字符串*/*/说明:上述第一个语句说明说明:上述第一个语句说明p是一个指针变量,指是一个指针变量,指向字符串向字符串abcd。但后面的。但后面的3个语句都把个语句都把p当成字符串当成字符串使用。使用。又如:又如:char ss
19、30=abcdefgh,*p;p=ss+3;/*p /*p指向字符指向字符d*/d*/printf(%sn,ss);/*/*输输出出ssss所所指指的的字字符符串串 */*/printf(%sn,p);/*/*这这里里p p被被看看成成是是字字符符串串,输出输出p p所指的字符串所指的字符串*/*/其运行结果:其运行结果:此此例例也也把把指指针针p当当成成字字符符串串进进行行输输出出,但但输输出出的的不不是是原原先先的的整整个个字字符符串串,而而是是p所所指指的的字字符符开开始始的的字字符符串串。在在这这里里我我们们可可以以再再次次体体会会“p所指的字符串所指的字符串”的真正含义。的真正含义。
20、指针可以当成字符串使用,体现了指针可以当成字符串使用,体现了C语言中语言中字符指针在使用上的灵活性。但是不能用字符字符指针在使用上的灵活性。但是不能用字符指针完全代替字符型数组,其原因是字符指针指针完全代替字符型数组,其原因是字符指针不一定指向字符串所在的空间,或者指针所指不一定指向字符串所在的空间,或者指针所指的字符串空间可能不够,因此初学者要小心使的字符串空间可能不够,因此初学者要小心使用。用。15.3编程范例编程范例 例例1 1 使使用用指指针针间间接接访访问问变变量量。定定义一一个个指指针变量量p p和和两两个个整整型型变量量a a、b b,不不对a a、b b直直接接赋值,利利用用p
21、 p使使得得a a、b b的的值分分别是是100100、200200,输出出a a、b b的的值。例例2利利用用指指针针代代替替下下标标进进行行数数组组编编程程:从从键键盘盘输输入入8个个整整数数放放入入数数组组,然然后后将将每每个个奇奇数数加加1,每每个个偶偶数数减减1,最后输出数组的所有元素。,最后输出数组的所有元素。例例3使使用用指指针针代代替替下下标标编编程程:输输入入一一个个字字符符串串,将将最后一个字符变为与第一个字符交换。最后一个字符变为与第一个字符交换。练习题:1、执行下面的程序段后,、执行下面的程序段后,ab的值为(的值为()。)。(A)220(B)210(C)200(D)1
22、90int*var,ab;ab=200;var=&ab;ab=*var+10;2、若若有有定定义义:intx,*pb;则则正正确确的的赋赋值值表表达达式式是是()。)。(A)pb=&x;(B)pb=x;(C)*pb=&x;(D)*pb=*xBA3、以下程序的输出结果是(、以下程序的输出结果是()(A)1(B)1(C)16(D)1main()int*p=a,a10=11,12,13,14,15,16,17,18,19,10;printf(“%dn”,*(p+5);C C4、下面程序的输出结果是、下面程序的输出结果是A)11;B)12;C)19;D)20;main()inta=11,12,13,1
23、4,15,16,17,18,19,20,*p;p=a;printf(”%dn”,*p+9););D D5、若若有有以以下下定定义义,则则对对a数数组组元元素素的的正正确确引引用用是是_。inta5,*p=a;A)*&a5B)a+2C)*(p+5)D)*(a+2)6、若有以下定义,则、若有以下定义,则p+5表示表示_。intx20,*p=x;A)元素元素x5的地址的地址B)元素元素x5的值的值C)元素元素x6的地址的地址D)元素元素x6的值的值D AD A7、有以下程序、有以下程序main()chara=programming,b=language;char*p1,*p2;inti;p1=a;p
24、2=b;for(i=0;i7;i+)if(*(p1+i)=*(p2+i)printf(c,*(p1+i);输出结果是输出结果是_。A)gmB)rgC)orD)gaD D以以下下函函数数功功能能是是把把两两个个整整数数指指针针所所指指向向的的存存储储单元中的内容进行交换。请填空。单元中的内容进行交换。请填空。exchange(int*x,int*y)intt;t=*y;*y=_;*x=_;*xt下下面面程程序序利利用用指指向向一一维维数数组组的的指指针针变变量量输输出出下标为下标为3的整数倍的数据,有的整数倍的数据,有3处错误,请改正。处错误,请改正。main()intx9=0,1,2,3,4,
25、5,6,7,8,9int*p;for(p=x;px+9;p+1)if(p-x)%3=0)printf(“%2d”,p);printf(“n”);x9应改为应改为x10for(p=x;px+10;p+)printf(“%2d”,*p);15-10 编写程序,输入一个字符串,统计字符编写程序,输入一个字符串,统计字符串中与最后一个字符相同的字符有几个。要求使串中与最后一个字符相同的字符有几个。要求使用指针代替下标进行编程。用指针代替下标进行编程。#include main()char x30,*p,t;int count=0;gets(x);for(p=x;*p!=0;p+);p-;t=*p;fo
26、r(p=x;*p!=0;p+)if(*p=t)count+;printf(%d,count);15-11以下程序的功能是先求一个数组的最以下程序的功能是先求一个数组的最大元素的指针大元素的指针pmax,然后将最大元素与最后一,然后将最大元素与最后一个元素互换,最后输出互换后的数组元素。个元素互换,最后输出互换后的数组元素。main()int a10=5,6,2,5,89,4,6,21,46,16,*p,*pmax,temp;*pmax=*a;for(p=a;p*pmax)pmax=p;for(p=a;pa+10;p+);p-;temp=*pmax;*pmax=*p;*p=temp;for(p=
27、a;p=A&*q1=a&*q2=z)*q2=;printf(%st%st%sn,s1,s2,s3);15-13 编写程序,已知一数组的元素为编写程序,已知一数组的元素为10,20,30,40,100,200,300,400,将数组元素逆,将数组元素逆序存放,最后输出逆序存放后的数组元素。要求序存放,最后输出逆序存放后的数组元素。要求使用指针进行编程。使用指针进行编程。#include#include main()main()int int a8=10,20,30,40,100,200,300,400,a8=10,20,30,40,100,200,300,400,*p,t,i=0;*p,t,i=0;for(p=a;p=a+3;p+)for(p=a;p=a+3;p+)t=*p;*p=*(a+7-i);*(a+7-i)=t;i+;t=*p;*p=*(a+7-i);*(a+7-i)=t;i+;for(p=a;p=a+7;p+)printf(%d ,*p);for(p=a;p=a+7;p+)printf(%d ,*p);
限制150内