c语言指针课件.pptx
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《c语言指针课件.pptx》由会员分享,可在线阅读,更多相关《c语言指针课件.pptx(81页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、特特 点点能直接对内存地址操作能直接对内存地址操作,使用灵活使用灵活实现动态存储管理实现动态存储管理可以使程序简洁、紧凑、高效可以使程序简洁、紧凑、高效用间接访问的方式改变数据的逻辑顺序用间接访问的方式改变数据的逻辑顺序调用函数时可实现变量的引用传递调用函数时可实现变量的引用传递第1页/共81页地址和指针的地址和指针的概念概念变量的地址和变量的值变量的地址和变量的值int i=3;float j=6;double k=9;36.09.0变量变量i变量变量j变量变量k2200220622022214 程序中定义的变量程序中定义的变量,系统根据它的系统根据它的类型给它分配一定长度的内存单元类型给它
2、分配一定长度的内存单元,该该内存单元的起始地址即为变量的地址。内存单元的起始地址即为变量的地址。该该内存单元的内容就是变量的值。内存单元的内容就是变量的值。第2页/共81页直接访问和间接访问直接访问和间接访问直接访问:直接访问:用变量名直接从它对应的地址存取内容。用变量名直接从它对应的地址存取内容。如如:int x=5,y=8,z=0;z=x+y;580变量变量x变量变量y变量变量z22002202220413直接从直接从 x 和和 y 对应的地址对应的地址2200和和2202取出内容取出内容5和和8然后相加将结果然后相加将结果13存入存入变量变量 z 对应的地址对应的地址2204的单元中。的
3、单元中。第3页/共81页间接访问间接访问定义一个存放地址的变量定义一个存放地址的变量p(p的地址的地址1500),将将x的地址的地址2200存放在变量存放在变量 p 中。通过中。通过变量变量p取出地址取出地址2200,再按此再按此地址存取其中的内容地址存取其中的内容,就间接就间接的完成了对的完成了对x的存取。的存取。当当p的内容改为的内容改为2202时时,通过通过变量变量p取出地址取出地址2202,再按此再按此地址地址,存取的就是变量存取的就是变量y的内的内容。容。p就是指针变量就是指针变量580变量x变量y变量z22002202220422001500变量p2202第4页/共81页指针变量的
4、定义指针变量的定义一般形式一般形式:基类型名基类型名 *指针变量名指针变量名说明说明:基类型名基类型名:指针变量所指向的变量的类型名称指针变量所指向的变量的类型名称指针变量名指针变量名:所定义的指针变量的名称所定义的指针变量的名称*:表示它后面的变量名是指针类型表示它后面的变量名是指针类型功能功能:(1)定义该指针变量名为指向基类型的指针变量定义该指针变量名为指向基类型的指针变量,为为该变量分配存储单元该变量分配存储单元,其长度等于存储地址的字节数。其长度等于存储地址的字节数。(2)基类型确定用指针变量基类型确定用指针变量“间接间接”存取数据的存储单存取数据的存储单元个数和存储形式。该变量只能
5、指向基类型数据。元个数和存储形式。该变量只能指向基类型数据。第5页/共81页指针变量的初始化指针变量的初始化用用 =&变量名变量名 来给指针变量赋初值。选项中的变量名必须来给指针变量赋初值。选项中的变量名必须是已定义过的是已定义过的,其类型必须与基类型一致。表示将它对应的地其类型必须与基类型一致。表示将它对应的地址值赋给所定义的指针变量。址值赋给所定义的指针变量。例如例如:int x,p=&x;int x,*p=&x;int x;float*p=&x;可以用赋值语句给指针变量赋值:可以用赋值语句给指针变量赋值:float y,*py;py=&y;第6页/共81页指针变量的引用指针变量的引用引用
6、指针变量的指针值引用指针变量的指针值与引用其它与引用其它类型的变量一样类型的变量一样直接用它的变量名直接用它的变量名引用指针变量所指向的变量时引用指针变量所指向的变量时,用用“*指针变量名指针变量名”注意:注意:指针变量的值与它所指向变量的值指针变量的值与它所指向变量的值之间的差别之间的差别指针变量只有正确赋值后才能通过它访问指向的变量。指针变量只有正确赋值后才能通过它访问指向的变量。xint x;pp=&x;&xint *p;*p*p=5;5第7页/共81页指针变量的运算指针变量的运算1.&:取地址运算符取地址运算符,取右边变量的地址取右边变量的地址2.*:指指向向运算符运算符(间接访问运算
7、符间接访问运算符),访问指针变量右边所指向的变量。访问指针变量右边所指向的变量。&a是变量是变量a的地址的地址*p 是指针变量是指针变量p指向的变量。指向的变量。说明:“&”和“*”都是单目运算符,它们的优先级 相同,按自右而左方向结合。第8页/共81页如果已定义 float a,*p=&a;则则 *p是变量是变量 a&*p 是变量是变量a的地址的地址 p&*p 等价于等价于 p而而&a是变量是变量a的地址的地址 p*&a是是p所指向的变量所指向的变量 a*&a等价于等价于a第9页/共81页注意注意(1).指针变量定义和引用指向变量的指针变量定义和引用指向变量的“*”含义有差别。含义有差别。(
8、2).不能引用没有赋值的指针变量不能引用没有赋值的指针变量,不要误认为不要误认为p定义后定义后 变量变量*p就已存在就已存在,必须给必须给p正确赋值后正确赋值后,变量变量*p才存在。才存在。(3).p=&a;是给指针变量是给指针变量p 赋值赋值,*p=3;是给是给p指向的变量指向的变量 赋值。两者含义完全不同。赋值。两者含义完全不同。(4).给指针变量赋值必须用同类型的指针。给指针变量赋值必须用同类型的指针。(5).指针变量只存放地址指针变量只存放地址,地址值是无符号整数地址值是无符号整数,但不能直但不能直 接用整型量接用整型量(或其它非地址量或其它非地址量)赋值给指针变量。赋值给指针变量。i
9、nt*p1=2200;第10页/共81页给变量赋值的两种方法给变量赋值的两种方法1.直接访问直接访问用变量名用变量名如如:int i;i=5;2.间接访问间接访问通过指向变量通过指向变量i的地址的指针变量的地址的指针变量 p 赋值赋值如:如:int i,*p;p=&i;*p=5;第11页/共81页取地址运算符取地址运算符&和指向运算符和指向运算符*的应用的应用main()int m,n;int*p=&m,*q=&n;printf(Input m,n:);scanf(%d%d,p,&n);printf(m=%d&m=%Xn,m,&m);printf(*p=%d p=%Xn,*p,p);print
10、f(n=%d&n=%Xn,n,&n);printf(*q=%d q=%Xn,*q,q);运行结果:Input m,n:123 456 m=123&m=FFD6*p=123 p=FFD6n=456&n=FFD8*q=456 q=FFD8第12页/共81页 int x,y;xyp1pp2 int*p,*p1,*p2;p1=&x;p2=&y;&x&y86 x=8;y=6;printf(min=%d,max=%dn,*p1,*p2);p1=p2;&y if(xy)p=p1;&x p2=p;&xmain()运行结果运行结果:min=6,max=8例:例:通过交换指针变量值按大小顺序输出通过交换指针变量值
11、按大小顺序输出第13页/共81页指针变量作为函数的参数指针变量作为函数的参数以指针类型为函数的参数以指针类型为函数的参数,作用作用是将变量是将变量的地址传入函数。的地址传入函数。第14页/共81页int x,y;int*pt1;*pt2;x=8;y=6;pt1=&x;pt2=&y;if(xy)swap(pt1,pt2);printf(x=%d,y=%dn,x,y);swap(int*p1,int*p2)p=*p1;*p1=*p2;*p2=p;int p;p8pt1pt2xy main()&x&yp1p2&x&y8668运行结果:x=6,y=8int x,y;int*pt1;*pt2;x=8;y
12、=6;pt1=&x;pt2=&y;if(xy)swap(pt1,pt2);swap(int*p1,int*p2)p=*p1;*p1=*p2;*p2=p;int p;printf(x=%d,y=%dn,x,y);第15页/共81页指针与数组指针与数组C语言中规定语言中规定数组名是指针类型的符号常量数组名是指针类型的符号常量,该符号常量值该符号常量值等于数组首元素的地址等于数组首元素的地址(简称数简称数组首地址组首地址),它的它的类型是指向数组元素的指针类型类型是指向数组元素的指针类型。即即数组名是指向该数组首元素的指针常量数组名是指向该数组首元素的指针常量。第16页/共81页指向数组元素的指针指
13、向数组元素的指针1.定义指向数组元素的指针变量定义指向数组元素的指针变量定义指向数组元素的指针变量与定义指向变量的指针变量的定义指向数组元素的指针变量与定义指向变量的指针变量的方法相同方法相同.如如:int a10;int*p;p=&a0;由于数组名是指向由于数组名是指向0号元素的指针类型符号常量号元素的指针类型符号常量,所以所以a与与&a0相等相等。p=&a0;p=a;两句等价两句等价p=a不是把不是把a的各元素赋给的各元素赋给p注意数组名与指针变量的区别注意数组名与指针变量的区别第17页/共81页指针运算指针运算 指针变量可以加减一个整数指针变量可以加减一个整数,两个同类型指针可以两个同类
14、型指针可以 相减相减得到一个整数。得到一个整数。指针变量每增减指针变量每增减1,地址值增减量等于所指向地址值增减量等于所指向的变量类型的字节数的变量类型的字节数sizeof(type),将它称作地址步进单位将它称作地址步进单位d。当当指针变量指向数组元素指针变量指向数组元素时时,指针变量每加减指针变量每加减1,表示指针前表示指针前后移动后移动1个元素个元素,地址值增减地址值增减d。如如:int a10,*p;p=a;p+;p+=3;第18页/共81页注意:指针变量的运算顺序。+*p,*p+,*(+p),(*p)+四者之间的差别:四者之间的差别:+*p先给先给p指向的变量加指向的变量加1,然后取
15、其值然后取其值(*p)+先取先取p指向的变量值指向的变量值,然后该变量值加然后该变量值加1*p+取取p所指向变量的值所指向变量的值,然后然后p增增1*+pP先增先增1,然后取然后取p所指向变量的值所指向变量的值第19页/共81页main()main()int a4=1,2,3,4,b,c,d,e;int a4=1,2,3,4,b,c,d,e;int*p=a;int*p=a;b=*p+;b=*p+;printf(printf(“n%d,%d,n%d,%d,”,b,*p);,b,*p);c=*+p;c=*+p;d=+*p;d=+*p;printf(printf(“%d,%d%d,%d”,c,d);
16、,c,d);运行结果运行结果1,2,3,41,2,3,4第20页/共81页通过指针引用数组元素通过指针引用数组元素在在 int a10,*p=a;定义的情况下定义的情况下:(1)p+i或或a+i就是就是ai的地址的地址。都要进行。都要进行a+id的运算。的运算。(2)*(p+i)或或*(a+i)就是就是p+i或或a+i所指向的数组元素所指向的数组元素ai。数组元素中的数组元素中的“”是变址运算符是变址运算符,相当于相当于*(+),ai 相当于相当于*(a+i)。(3)指向数组元素的指针变量也可带下标指向数组元素的指针变量也可带下标,如如 pi与与*(p+i)等价。等价。所以所以,ai,*(a+
17、i),pi,*(p+i)四种表示法全部等价。四种表示法全部等价。(4)注意注意p与与a的差别的差别,p是变量是变量a是符号常量是符号常量,不能给不能给a赋值赋值,语句语句a=p;a+;都是错的。都是错的。第21页/共81页p&a0a9a1a2aia0p+1,a+1p+2,a+2 p+i,a+ip+9,a+9a引用数组元素可用引用数组元素可用:1)下标法下标法,如如ai,pi。2)指针法指针法,如如*(p+i)或或*(a+i),其中其中p是是指向数指向数组组a a的元素的指针变量。的元素的指针变量。第22页/共81页main()int a10;int*p,i;for(p=a;p(a+10);p+
18、)scanf(%d,p);printf(n);for(i=0;i10;i+)printf(%d,ai);for(i=0;i10;i+)printf(%d,*(a+i);p=a;/*不能省略不能省略*/for(i=0;i10;i+,p+)printf(%d,*p);for(p=a;p(a+10);p+)printf(%d,*p);例例.输入输入/输出数组全部元素输出数组全部元素第23页/共81页用字符型指针访问字符数组和字符串用字符型指针访问字符数组和字符串【例【例9.59.5】用字符型数组名和】用字符型数组名和字符指针变量字符指针变量 两种方法整体输入两种方法整体输入/输出字符串。输出字符串。
19、main()char s81=Hello!,*p=s;char*ps=Welcome to you!;printf(%sn,s);printf(%sn,ps);gets(s);printf(%sn,s);gets(p);printf(%sn,s);第24页/共81页字符指针变量和字符数组的区别字符指针变量和字符数组的区别(1)存储的内容不同存储的内容不同:字符数组存储着字符串的内容字符数组存储着字符串的内容,而字符指针变量而字符指针变量存放的是字符串首元素的地址存放的是字符串首元素的地址,不是它的内容。不是它的内容。(2)分配的内存单元不同分配的内存单元不同:字符数组分配一段有确定地址的内存。
20、而指针变字符数组分配一段有确定地址的内存。而指针变量只分配存放地址的内存单元量只分配存放地址的内存单元,该指针变量可以该指针变量可以指向一个字符型数据指向一个字符型数据,但若未赋初值但若未赋初值,则它并未指向则它并未指向一个明确的地址。此时它指向的变量并不存在。一个明确的地址。此时它指向的变量并不存在。第25页/共81页(3)赋值方法不同赋值方法不同:对字符数组只能在定义时整体赋初值对字符数组只能在定义时整体赋初值,不能用赋值语句不能用赋值语句整体赋值。赋值语句只能对各个元素分开赋值。整体赋值。赋值语句只能对各个元素分开赋值。如如:char s16;s=I am a student.;char
21、 s16=I am a student.;对字符指针变量对字符指针变量,可以采用下面方法赋值可以采用下面方法赋值:char*p;p=I am a student.;(4)指针变量的值是可以改变的指针变量的值是可以改变的,字符数组名是地址常量其值是不能改变的。字符数组名是地址常量其值是不能改变的。第26页/共81页数组或指针变量作函数参数如如:main()f(int a,int n)int array10;.f(array,10).第27页/共81页由于由于数组名代表数组名代表首地址首地址,能接收并存放地址值的只能能接收并存放地址值的只能是指针变量。故编译系统将形参是指针变量。故编译系统将形参数
22、组名作为数组名作为指针变量指针变量来处理。例中函数首部来处理。例中函数首部 f(int a,int n)可写成可写成 f(int*a,int n)两种完全等价。两种完全等价。第28页/共81页 归纳起来归纳起来,如果有一个数组如果有一个数组,想在被调用的函数中想在被调用的函数中改变其元素的值改变其元素的值,实参与形参的对应关系有以下四种实参与形参的对应关系有以下四种:(1).实参和形参都用数组名。实参和形参都用数组名。(2).实参用数组名实参用数组名,形参用指针变量。形参用指针变量。(3).实参用指针变量实参用指针变量,形参用数组名。形参用数组名。(4).实参和形参都用指针变量。实参和形参都用
23、指针变量。实质都是实质都是地址值的传递地址值的传递第29页/共81页【例【例9.7】通过调用函数通过调用函数,将整型数组的所有元素将整型数组的所有元素加加10。参数传递用四种方法实现。参数传递用四种方法实现。void add(int b,int n)int i;for(i=0;in;i+)bi+=10;main()int i,a10=1,2,3,4,5,6,7,8,9,10;add(a,10);for(i=0;i10;i+)printf(%4d,ai);void add(int*p,int n)int*pend=p+n;for(;ppend;p+)*p+=10;main()int i,a10=
24、1,2,3,4,5,6,7,8,9,10;add(a,10);for(i=0;i10;i+)printf(%4d,ai);void add(int b,int n)int i;for(i=0;in;i+)bi+=10;main()int i,a10=1,2,3,4,5,6,7,8,9,10;int*q=a;add(q,10);for(i=0;i10;i+)printf(%4d,ai);void add(int*p,int n)int*pend=p+n;for(;ppend;p+)*p+=10;main()int i,a10=1,2,3,4,5,6,7,8,9,10;int*q=a;add(q,
25、10);for(i=0;i10;i+)printf(%4d,ai);第30页/共81页用字符数组或指针做函数参数传递字符串用字符数组或指针做函数参数传递字符串将字符串从一个函数传递到另一个函数将字符串从一个函数传递到另一个函数,可以用可以用地址传递地址传递的方法的方法,即用即用字符数组名字符数组名或用字符指针变量或用字符指针变量作参数。在被调用的函作参数。在被调用的函数中可以改变字符串中的内容数中可以改变字符串中的内容,在主调函数在主调函数中可以得到改变了的字符串。中可以得到改变了的字符串。第31页/共81页【例【例9.89.8】字符串复制函数主要功能的实现。字符串复制函数主要功能的实现。(1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 指针 课件
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内