C语言教程第八章.ppt

上传人:牧羊曲112 文档编号:6503878 上传时间:2023-11-07 格式:PPT 页数:55 大小:357KB
返回 下载 相关 举报
C语言教程第八章.ppt_第1页
第1页 / 共55页
C语言教程第八章.ppt_第2页
第2页 / 共55页
C语言教程第八章.ppt_第3页
第3页 / 共55页
C语言教程第八章.ppt_第4页
第4页 / 共55页
C语言教程第八章.ppt_第5页
第5页 / 共55页
点击查看更多>>
资源描述

《C语言教程第八章.ppt》由会员分享,可在线阅读,更多相关《C语言教程第八章.ppt(55页珍藏版)》请在三一办公上搜索。

1、第八章,指针,1/55,8.1 指针的概念8.2 指针变量的定义和引用8.3 指针与数组8.4 指针与字符串8.5 指针数组与指向指针的指针8.6 返回指针值的函数8.7 本章要点小结8.8 本章程序举例,2/55,8.1 指针的概念,一、数据的存取,1、内存地址,内存的每个字节都有一个编号,这个编号称为“内存地址”。,程序中的每个数据都对应着内存中的一个地址,从该地址开始的一个或多个字节用来存放该数据。,int i,j,k;,i,j,k,2、内存单元的地址和内存单元的内容的区别:,若i=3,j=5;,从图中可以看出它们的区别。,3/55,程序编译后已经没有i、j、k这些变量名了,而是将变量名

2、转换为变量的地址,计算机通过内存地址对变量进行存取。,二、直接访问和间接访问,1、直接访问方式:,、i=3;,、j=i+2;,、printf(%d,i);,、scanf(%d,、k=i+j;如何执行?,按变量的地址存取变量的方式,2、间接访问方式:,语言中可以定义整型变量、实型变量、字符型变量,各自存放相应类型的数据;另外还可以定义和使用一种特殊类型的变量,用来存放变量的地址。,4/55,假设已经定义变量 ip 用来存放整型变量的地址,它被分配到内存单元3000和3001。,ip,通过执行语句:ip=将整型变量i 的地址存放到变量ip中,即ip的值为变量i所对应的内存单元的起始地址2000。,

3、2000,现在要存取i的值可以这样做:先找到存放i的地址的内存单元地址(3000和3001),从中取出变量i的地址(2000),然后再对2000和2001单元进行存取这就称为间接访问。,3、关于“指向”的含义:,变量ip的值为2000,即变量i的地址,这样就在ip和i之间建立了一种联系:,5/55,通过变量ip知道变量i的地址,从而找到变量i的内存单元,因此说变量ip指向变量i,用箭头表示这种“指向”关系。,4、为了表示将数值10送到变量i中,可以有两种表示方法:,、将10送到变量i所标志的单元中;,10,、将10送到变量ip所指向的单元中;,10,6/55,三、指针与指针变量,通过地址能找到

4、所需的变量单元,可以说:地址“指向”该变量单元。因此,把一个变量的地址称为该变量的“指针”。,如果一个变量专门用来存放另一个变量的地址,则称它为“指针变量”。指针变量的值(即指针变量中存放的值)是指针(地址)。,注意区分“指针”和“指针变量”这两个概念。,四、说明,、程序中定义的每个变量在编译后都占有各自的内存单元,系统是通过内存地址对变量进行存取的;,7/55,、数据所占有的内存单元个数是由其数据类型决定的;,、首地址:即第一个单元的地址;,、表示地址的数与整数的区别;,、变量i、j的地址可能相邻,也可能不相邻,是由系统分配的,我们不必关心。,8/55,8.2 指针变量的定义和引用,8.2.

5、1 概述,1、指针运算符:*,为了表示指针变量和它所指向的变量之间的联系,用“*”表示指向的关系。,如:ip代表指针变量,*ip表示ip所指向的变量。即*ip也代表一个变量。,9/55,例:,、若:ip=&i;,i=5;,*ip=5;,结论:*ip与i等价。,、x=i+1;,x=*ip+1;,2、取地址运算符:&,它与一个变量连用,以得到该变量的内存地址。,3、说明:,、取地址运算符只能作用于变量:,不能作用于常量、表达式或寄存器变量:,、不能把整数赋值给一个指针变量:ip=3000;,、不能把一个指针变量的值赋值给一个整型变量:x=ip;,10/55,8.2.2 指针变量的定义与赋值,一、指

6、针变量的定义,1、格式:,类型名*指针变量名;,其中:、“*”表示定义的是指针变量;、“类型名”用来指定该指针变量可以指向的变量的类型;,2、例:,int i,*ip;,int*p1,*p2;,float x,*xp;,char*cp1,*cp2;,3、说明:,、“*”只表示定义的变量为指针变量,但指针变量名中并不包含“*”;*是指针变量的标志,不可丢掉;,、指针变量定义时,指定了它所指向的变量的数据类型;,ip=,p1=,xp=,cp1=,xp=,11/55,指针变量定义时必须指定其所指向的变量的数据类型,而且使用过程中只能指向同一种类型的变量。,、指针变量定义后,系统为变量分配一个存储单元

7、,用来存放地址;根据存储单元的长度分为大存储模式(长指针,4 Byte)和小存储模式(短指针,2 Byte);,、指针变量定义后,若不赋值,其值是不确定的。,二、指针变量的赋值,1、赋值语句:,int i,j,*p1,*p2;,p1=,char ch,*cp1,*cp2;,cp1=,2、初始化:,int x=4;,int x;x=4;,int i,*p1=,int i,*p1;p1=,12/55,3、说明:,、指针变量定义后,若不赋值,其值是不确定的;,、可以给指针变量赋空值(NULL),使指针变量不指向任何变量;,ip=NULL;,#define NULL 0,、指针变量的值为空值(NULL

8、)与未对指针变量赋值,意义不同;,、只能是同类型变量的地址进行赋值;,int i,*ip;char ch,*cp;,ip=,ip=,、可以将数组名或函数名赋给某些类型的指针变量;,int a10,*ip;,ip=,ip=a;,、不能将一个整型量(或任何其它非地址类型的数据)赋给一个指针变量;,int*ip;,ip=3000;,13/55,4、分析有关指针的程序时,画图是很好的方法:,若有:int i,*p;,p=,i=5;,int i,*p;,p=,&i,i=5;,5,8.2.3 指针变量的引用,int a,*p1,*p2;p1=,int a,*p1,*p2;,p1=,&a,printf(%x

9、,p1);,p2=p1;,&a,*p1=3;,3,printf(%d,*p1);,14/55,1、两个运算符:&和*,&:取地址运算符;,*:指针运算符(间接访问符);,2、说明:,、&既可作用于一般变量,也可作用于指针变量;,、*只能作用于指针变量;,、表达式中的*p与变量定义中的*p含义不同;,int i,*p=,、int a,*p=,int a,*p;p=,int a,*p;*p=,3、指针变量可以进行的操作:,int a,*p1,*p2;,、赋值:,p1=,p2=p1;,、输出:,printf(%x,p1);,、取内容:,*p1=5;,a=5;,printf(%d,*p1);,15/5

10、5,例8.1,#include void main()int a1=11,a2=22;int*p1,*p2;p1=,&a1,&a2,*p1,*p2,&a1,*p2,*p2,多个指针可以指向同一个存储单元。但在某一时刻,一个指针变量只能指向一个存储单元,因为指针变量在某一时刻只能存放一个变量的地址值。,Eg801.cpp,16/55,例8.2,#include void main()int a1=11,a2=22;int*p1,*p2,*p;p1=,&a1,&a2,*p1,*p2,&a1,&a2,*p1,*p1,&a1,*p2,*p2,使两个指针交换指向,Eg802.cpp,17/55,例8.3

11、,#include void main()int a1=11,a2=22,t;int*p1,*p2;p1=,&a1,*p1,&a2,*p2,11,22,11,交换两个指针变量所指向变量的值,Eg803.cpp,18/55,反映了指针变量的引用方法:,、将变量的地址赋给指针变量(p1=&a1),、将一个指针变量赋给另一个指针变量(p2=p1),、通过指针变量间接访问它所指向的变量(*p1),4、*和&运算符的进一步说明:,、若有:p1=则*p1等价于a;,&*p1,&(*p1),&a,、*&a,*(&a),*p,a,、(*p)+,等价于:a+,不同于:*p+,*p+,*(p+),19/55,8.

12、2.4 指针作为函数参数,题目:输入两个整数a、b,按大小顺序输出。,#include void swap(int x,int y)int temp;temp=x;x=y;y=temp;void main()int a,b;printf(nInput a,b:);scanf(%d%d,注意:语言中的函数调用采用“传值”方式,即单向传递方式。,即:主调函数可以将实参的值传递给被调函数的形参,但不能通过改变形参的值而改变实参的值。,Eg804.cpp,20/55,#include void swap(int*px,int*py)int temp;temp=*px;*px=*py;*py=temp;

13、void main()int a,b,*p1,*p2;printf(nInput a,b:);scanf(%d%d,&a,&b,8,5,Eg805.cpp,21/55,#include void swap(int*px,int*py)int*temp;*temp=*px;*px=*py;*py=*temp;void main()int a,b,*p1,*p2;printf(nInput a,b:);scanf(%d%d,*temp是指针变量temp所指向的变量,但temp中并无确定的地址值,其值不确定;*temp所指向的单元也不确定。因此,对*temp赋值可能会破坏系统的正常工作状况。,应该将

14、*px的值赋给一个整型变量,用整型变量作为临时存储空间实现*px和*py的交换。,22/55,#include void swap(int*px,int*py)int*p;p=px;px=py;py=p;void main()int a,b,*p1,*p2;printf(nInput a,b:);scanf(%d%d,&a,&b,&b,&a,Eg806.cpp,23/55,如果想通过函数调用得到几个要改变的值,可以:,、在主调函数中设n个变量;,、将n变量的地址作为实参传给所调用的函数的形参;,、通过形参指针变量,改变该n个变量的值;,、主调函数就可以使用这些改变了的值;,例8.5 编写函数,

15、求一维数组中的最大值和最小值。,void search(int x,int n),int*pmax,int*pmin,*pmax=*pmin=x0;,for(i=1;in;i+),if(*pmaxxi)*pmax=xi;,if(*pminxi)*pmin=xi;,int a20,max,min;for(i=0;i20;i+)scanf(%d,search(a,20,Eg807.cpp,24/55,8.3 指针与数组,8.3.1 指向数组元素的指针变量,1、几个概念,、一个变量有地址,称变量的地址为该变量的指针;,、每个数组都有一个起始地址,数组的起始地址称为数组的指针;,、一个数组包含若干元素

16、,每个数组元素都在内存中占用一定的存储单元,即都有相应的地址,数组元素的地址称为数组元素的指针;,、指针变量可以指向变量,当然也可以指向数组和数组元素;,、数组元素的指针变量就是专门用来存放数组元素地址的变量。,2、定义:,类型名*指针变量名,int a10;int*p;,int a10,*p;,25/55,3、赋值:,p=,&a0,4、说明:,、语言中的数组名代表数组首地址,即第0号元素的地址;,p=,p=a;,、定义时可以进行初始化:,int*p=,int*p;p=,int*p;*p=,int*p=a;,26/55,8.3.2 通过指针访问一维数组,1、数组元素的引用:,int a10,*

17、p;,p=a;,*p=5;,a0=5;,p=,*p=5;,a3=5;,2、语言规定:无论数组的数据类型如何,若指针变量p已指向数组中的某一元素,则p+1指向同一数组中的下一个元素(而不是将p简单的加1),例如:,、int x10,*p=x;,对于指向整型数组的指针变量p,p+1意味着使p在原值的基础上加2个字节,以使它指向下一元素;,、float x10,*p=x;,对于指向float型数组的指针变量p,p+1意味着使p在原值的基础上加4个字节,以使它指向下一元素;,27/55,总之:设d是一个数组元素所占的字节数,则p+i表示指针移动了i个元素,而它实际的地址变化为:p+i*d。,3、在使用

18、指针变量引用数组时,应注意以下问题:,、给指针赋初值的方法:,p=a;或p=,、p+1或a+1实际上表示数组元素a1的地址(&a1);则p+i或a+i表示数组的第i个元素的地址(&ai);,、*(p+i)或*(a+i)表示p+i或a+i所指向的数组元素,即ai;,、指向数组的指针变量也可以带下标;如:pi与*(p+i)等价;,、若p已经指向某个数组元素ai,则p+j表示指向数组元素ai+j;,综上,可以用两种方法来引用一个数组元素:,、下标法:用ai或pi来引用数组a中的第i号元素;,、指针法:用*(p+i)或*(a+i)来引用数组中的第i号元素;,可见:任何由数组下标完成的操作都能由指针来实

19、现;,ai,*(p+i),&ai,p+i,Eg808.cpp,28/55,4、在使用指针变量时,要注意以下几个问题:,、可以使用p+使指针变量p的值不断改变:,for(p=a;p(a+10);p+)printf(%4d,*p);,for(p=a;a(p+10);a+)printf(%4d,*a);,、在程序运行期间,要始终注意指针变量当前所指向的是哪一个元素;,Eg809.cpp,29/55,可以执行p+等操作使p指向不同的数组元素,通过*p访问不同的数组元素。但要始终注意p当前所指向的是哪一个数组元素!,通过指针在函数间传递一维数组:,编译系统都是将形参数组名作为指针变量来处理的。,f(in

20、t x,int n);,f(int*x,int n);,可以通过xi、*(x+i)来访问实参数组元素。,要求实参为指向数组首元素的指针:,a 或 p,f(a,10);,f(p,10);,(p=a;),30/55,小结,int a10,*p;p=a;或 p=,p为指向数组元素的指针,语言规定:数组名表示数组的首地址,即第0个元素的地址;即数组名是指向数组第0个元素的指针常量。,a+i,p+i,表示数组第 i 个元素的地址(&ai),即指向第 i 个元素的指针,*(a+i),*(p+i),表示数组的第 i 个元素(ai),ai,pi,表示数组的第 i 个元素(ai),数组第 i 个元素地址的表示方

21、法:,&ai,a+i,p+i,&pi,数组第 i 个元素的表示方法:,ai,*(a+i),*(p+i),pi,31/55,8.3.3 通过指针在函数间传递一维数组,1、数组元素作为函数参数:,void swap(int x,int y);,swap(a1,a2);,2、数组名作为函数参数:,void f(int x,int n);,f(a,10);,数组名代表数组首地址。用数组名作实参,调用函数时是把数组首地址传递给形参,而不是把数组的值传给形参。,x,x0,x1,x2,x3,x4,x5,x6,x7,x8,x9,实际上能够接受并存放地址值的只能是指针变量,编译系统都是将形参数组名作为指针变量来

22、处理的。,void f(int*x,int n);,若在函数调用期间改变了数组某一存储单元的内容,则在函数调用完毕后,已改变的值被保留下来。,Eg810.cpp,32/55,变量名与数组名作函数参数时的比较:,变量名,变量的值,不能,数组名或指针变量,数组的起始地址,能,需要说明的是:语言的函数调用都是采用“值传递”方式;当用变量名作函数参数时传递的是变量的值;用数组名作函数参数时,由于数组名代表的是数组首地址,因此传递的是数组首地址,所以要求形参为指针变量。,例题:有一个一维数组score,内放10个学生成绩,求平均成绩。,3、指针变量可替代数组名作为函数的参数:,、指针变量可以作为函数的形

23、参;,、指针变量可以作为函数的实参;,Eg811.cpp、Eg812.cpp,33/55,归纳起来,实参与形参的对应关系有:,、形参和实参都用数组名:,f(int x,int n);,f(a,10);,把实参数组首地址传给形参作为形参数组首地址;,、实参用数组名,形参用指针变量:,f(int*x,int n);,f(a,10);,把实参数组首地址传给形参(指针变量),函数中用指针访问实参数组,、形参和实参都用指针变量:,f(int*x,int n);,f(p,10);,函数调用前应先给实参指针变量赋值(如:p=a),、实参为指针变量,形参为数组名:,f(int x,int n);,f(p,10

24、);,实参通过指针变量为形参提供数组首地址;,34/55,8.4 指针与字符串,存放字符串的字符数组是一种特殊的数组,即以0作为结束标志。在访问字符串时候,以0作为结束条件。,8.4.1 通过指针访问字符串,一、有关概念:,1、字符串的指针:,对应的字符数组在内存中存放的首地址;,2、指向字符串的指针变量:,专门用来存放字符数组首地址的变量;,3、字符数组指针变量的定义与赋值:,char*p,str30;,p=str;,p=,二、字符串的表示形式:,1、用字符数组实现:,void main()static char s=I love China!;printf(%sn,s);,35/55,2、

25、用字符指针指向一个字符串:,static char s=I love China!;char*p;p=s;printf(%sn,p);,对于指向字符的指针变量,除了可以把字符数组名(指向字符的指针常量)赋给它外,还可以将一个字符串常量赋给它。,char*cp;cp=Hello,world!;,也可以在定义时赋初值:,char*cp=Hello,world!;,语言在处理字符串常量时,在内存中开辟连续的存储单元,存放字符串中的各字符和字符串结束标志0。,对指针变量赋值的作用是:将字符串在内存中的首地址赋给指针变量。,Eg813.cpp,36/55,不同于用字符串常量对字符数组赋初值:,char

26、ca=Hello,world!;,其作用是:将字符串中的各字符和结束标志0存放到数组ca的各元素中,数组的首地址用数组名ca表示。,例8.8:将字符数组a中的字符串复制到字符数组b中。,、下标法:,#include void main()char a=Hello,World!,b20;int i;for(i=0;ai!=0;i+)bi=ai;bi=0;printf(%sn,b);,、指针法:,#include void main()char a=Hello,World!,b20;char*pa=a,*pb=b;for(;*pa!=0;pa+,pb+)*pb=*pa;*pb=0;printf(%

27、sn,b);,Eg814.cpp,37/55,三、字符数组与字符指针变量的比较:,、字符数组由若干个元素组成,每个元素中存放着一个字符;而字符指针变量中存放的是地址,不是将字符串放到字符指针变量中;,、赋值方式:,char str20;str20=I love China!;,char*ps;ps=I love China!;,、对字符指针变量赋初值:,char*s=I love China!;,char*s;s=I love China!;,char str=I love China!;,char str14;strcpy(str,I love China!);,、字符指针变量是可以改变的。

28、,char s20,*ps;,38/55,8.4.2 通过指针在函数间传递字符串,将一个字符串从一个函数传递到另一个函数,可以用地址传递的方法,即用字符数组名、指向字符串的指针变量或其它字符地址表达式作参数。,1、用字符数组作实参,main()char a=abcdefg;char b=12345;copy_string(a,b);,void copy_string(char to,char from)int i=0;while(fromi!=0)toi=fromi;i+;toi=0;,2、用字符指针变量作实参,char*a=abcdefg;char*b=12345;copy_string(a

29、,b);,void copy_string(char*to,char*from)for(;*from!=0;from+,to+)*to=*from;*to=0;,Eg815.cpp,39/55,3、可以对copy_string函数作下列简化:,、,void copy_string(char*to,char*from)while(*to=*from)!=0)to+;from+;,while(*to=*from),、,void copy_string(char*to,char*from)while(*to+=*from+)!=0),;,while(*to+=*from+),、,void copy_

30、string(char*to,char*from)while(*from!=0)*to+=*from+;,*to=0;,while(*from),40/55,、,void copy_string(char*to,char*from)for(;(*to+=*from+)!=0;);,、,void copy_string(char*to,char*from)for(;(*to+=*from+););,4、对copy_string函数的调用形式:,char s120=12345,s2=How are you!;,copy_string(s1,s2);,s1:How are you!,copy_str

31、ing(s1,s2+2);,s1:w are you!,copy_string(s1+2,s2);,s1:12How are you!,Eg816.cpp,41/55,8.5 指针与多维数组,、数组是具有相同数据类型数据的集合。数组的每个元素又可以是一个数组。,、根据语法规定:如果 x 指向某一维数组,则xi与*(x+i)等价,&xi与x+i等价。,8.5.1 通过指针访问多维数组,一、多维数组的地址:,1、多维数组的性质,static int a34=1,3,5,7,9,11,13,15,17,19,21,23;,可以认为a是具有3个元素的一维数组:a0、a1、a2;,a0,a1,a2,每个

32、元素又是具有4个整型元素的一维数组。,42/55,2、数组名a表示地址,a0,a1,a2,从二维数组的角度来看,a为二维数组名,表示整个二维数组的首地址。,若把a看成一维数组,每个数组元素a0、a1、a2占_个字节。,8,a表示a0的地址(&a0:2000);,a+1表示的地址();,a+1,&a1,a1,&a1:,2008,a+2表示的地址();,a+2,&a2,a2,&a2:,2016,a+1表示:a+81=2008,a+2表示:a+82=2016,a+i表示:a+8i,a+i表示ai的地址&ai,即第i行的地址,它是指向一维数组的指针。,43/55,3、ai表示地址,a0,a1,a2,a

33、0、a1、a2是一维数组名。,a0是一维数组a0的首地址,即第0行一维数组中第0列元素的地址(&a00);即a0的值为&a00;,a1是一维数组a1的首地址,即第1行一维数组中第0列元素的地址(&a10);即a1的值为&a10;,a2是一维数组a2的首地址,即第2行一维数组中第0列元素的地址(&a20);即a2的值为&a20;,因此,ai是第i行首元素的地址(指针),它是指向数组元素的指针。,44/55,4、ai+j表示地址:,ai是第i行首元素的地址。,a0+1表示第0行第1列元素的地址;,&a01,a0+2表示第0行第2列元素的地址;,&a02,a2+3表示第2行第3列元素的地址;,&a2

34、3,第i行第j列元素的地址(&aij);,5、*(a+i)表示地址:,*(a+i)等价于ai,第i行首元素的地址,6、*(a+i)+j表示地址:,*(a+i)+j等价于ai+j,第i行第j列元素的地址,7、数组元素aij的表示:,ai+j,*(),*(a+i),+j,*(),*(a+i),(),j,若i=0,a0j可表示为:,*(a0+j)、*(*a+j)、(*a)j,若j=0,ai0可表示为:,*(ai)、*(*(a+i)、(*(a+i)0,45/55,8、(a+i)与*(a+i)的比较:,(a+i)等价于&ai,*(a+i)等价于ai,、都表示地址:a+i表示第i行的地址(指针),*(a+

35、i)表示第i行首元素的地址,、它们指向的数据类型不同:a+i指向一个一维数组(二维数组的一行、行指针);*(a+i)指向数组元素;,若进行操作:,(a+i)+1:使指针移动一维数组所占字节总数(一行、8字节),*(a+i)+1:使指针移动一个数组元素所占内存字节总数(2字节),9、对ai性质的进一步说明:,ai从形式上看是a数组中第i个元素。,如果a是一维数组名,则ai代表a数组第i个元素所占的内存单元。ai是有物理地址的,占内存单元。,如果a是二维数组,则ai代表一维数组名。ai本身并不占实际的内存单元,它也不存放a数组中各个元素的值;它只是一个地址。,a、a+i、ai、*(a+i)、*(a

36、+i)+j、ai+j都是地址,*(ai+j)、*(*(a+i)+j)是二维数组元素aij的值。,46/55,10、关于&ai的说明:,、不要把&ai简单的理解为ai单元的物理地址,因为并不存在ai这个变量。它只是一种地址的计算方法,能得到第i行的首地址;,、&ai和ai的值是一样的,但它们的含义不同:,&ai或a+i指向行,而ai或*(a+i)指向列。,当列下标j为0时,&ai和ai(即ai+j)值相等,即指向同一位置。,、*(a+i)只是ai的另一种表示形式,不要简单的认为是“a+i所指单元的内容”。,对于二维数组:a+i=ai=*(a+i)=&ai=&ai0,它们的地址相等。,例:输出二维

37、数组有关的值。,二、指向多维数组的指针变量,1、指向数组元素的指针变量,与指向一维数组元素的指针变量一样,它用来专门存放某个数组元素的内存地址。或者说,用于指向某个数组元素,定义方法与指向某种类型变量的指针变量一样。,Eg817.cpp、Eg818.cpp,47/55,2、指向一维数组的指针变量,定义:类型名(*指针变量名)n,如:int(*p)4,int a4;,、*p有4个元素,每个元素为整型;即p所指的对象是有4个整型元素的数组。p为行指针。,、p只能指向一个包含4个元素的一维数组,p的值就是该一维数组的首地址。p不能指向一维数组中的元素;,、p+i表示二维数组中第i行的地址;*(p+i

38、)+j表示第i行第j列元素的地址;*(*(p+i)+j)即数组元素aij。,例:输出二维数组中任一行任一列元素的值。,scanf(%d%d,Eg819.cpp,48/55,8.5.2 通过指针在函数间传递多维数组,用数组名作实参,则是将二维数组首行的指针常量(二维数组名)传递给了作为函数形参的指针变量,该指针变量就指向了二维数组的第0行。,例:求3行4列二维数组中的最大元素。,方法一、,int max_value(int(*pa)4,int n)int m=pa00;for(i=0;in;i+)for(j=0;j4;j+)if(mpaij)m=paij;return(m);,(*(pa+i)+

39、j),(*(pa+i)j,int max_value(int pa 4,int n),int max_value(int 4,int),int max_value(int(*)4,int),方法二、,int max_value(int*p,int n)int m=*p;for(i=0;im)m=*p;return(m);,Eg820.cpp、Eg821.cpp,49/55,8.11 本章小结,一、有关指针的数据类型:,int*p,p为指向整型数据的指针变量,char*p,p为指向字符型数据的指针变量,int(*pa)n,pa为指向一维数组的指针变量(指向具有n个元素的一维数组),指针变量在定义

40、时必须写成如上形式,但在作函数形参时可写成几种等价形式:,int*p;可写成:int p;,char*cp;可写成:char cp;,int(*pa)5;可写成:int pa5;,50/55,二、指针运算小结:,1、指针变量加(减)一个整数,例如:p+、p-、p+i、p-i、p+=i、p-=i等,语言规定:一个指针变量加(减)一个整数并不是简单地将指针变量加(减)一个整数,而是将它所指向的变量所占用的内存单元字节数相加(减)。,p+i,p+i*d,2、指针变量的赋值,int i,a10,*p,*p1,*p2;,p=,p=a;,p2=,p1=p2;,注意:,、不能把整数赋值给指针变量;,、也不能

41、把指针变量的值赋值给整型变量;,51/55,3、指针变量可以有空值,即该指针变量不指向任何变量,p=NULL;,#define NULL 0,注意:,、p的值为NULL与未对p赋值不同;,、任何指针变量或地址均可以与NULL作相等或不等的比较。,if(p=NULL),if(p!=NULL),4、两个指针变量可以相减,如果两个指针变量指向同一个数组的元素,则两个指针变量之差是两个指针之间元素的个数。,p1=a+5;p2=,p1-p2=4,注意:两个指针变量相加无实际意义。,52/55,5、两个指针变量的比较,两个指针指向同一个数组的元素,则可以进行比较,指向前面元素的指针变量“小于”指向后面元素

42、的指针变量。,void invert(int x,int n)int*p1,*p2,t;p1=x;p2=x+n-1;for(;p1p2;p1+,p2-)t=*p1;*p1=*p2;*p2=t;,p1!=p2,注意:如果p1和p2不指向同一数组则比较无意义。,53/55,本章作业一,一、书面作业,1、编写一个函数:void fun(int*x,int n,int*odd,int*even)函数的功能是分别求出数组中所有奇数之和以及所有偶数之和。形参n给出数组中元素的个数;利用指针odd返回所有奇数之和,利用指针even返回所有偶数之和。数组元素在主函数中随机产生(小于20)。,2、定义长度为10

43、的整型一维数组,编写函数将数组中的元素按逆序存放,在主函数中输出结果。,、实参和形参都用指针变量,、实参用指针变量,形参用数组名,二、上机作业,调试作业1、2,习题解答p.170 实验14 4,习题解答p.170 实验15 1,54/55,本章作业四,一、书面作业,1、编写函数,将字符串s1中的第m个字符开始的全部字符复制成另一个字符串s2。要求在主函数中输入字符串s1及m的值并输出复制结果,在被调函数中完成复制。,2、编写程序,输入星期号,输出相应的英文星期名。例如,输入3,则输出Wednesday;要求用指针数组处理。,二、上机作业,调试作业1、2,习题解答p.170 实验15 1,55/55,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号