《九章指针ppt课件教案.ppt》由会员分享,可在线阅读,更多相关《九章指针ppt课件教案.ppt(111页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院九章指针ppt课件 Still waters run deep.流静水深流静水深,人静心深人静心深 Where there is life,there is hope。有生命必有希望。有生命必有希望C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院 指针指针是是C C语言中最重要的组成部分。利语言中最重要的组成部分。利用用指针指针可以表示可以表示 复杂的数据结构;动态分复杂的数据结构;动态分配内存;灵活处理字符串和数组;直接处配内存;灵活处理字符串和数组;直接处理内存地址;
2、理内存地址;从函数调用中获取多个值等。从函数调用中获取多个值等。C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院对变量值的存取实质上是通过对变量值的存取实质上是通过地址地址进行的。进行的。示意图示意图9.1 指针的概念指针的概念 C语言中,任何一个语言中,任何一个变量名变量名实质上都代表着内实质上都代表着内存中的某一个存储单元,每一个存储单元都有一个存中的某一个存储单元,每一个存储单元都有一个地址地址。C系统能自动将系统能自动将变量名变量名和它的和它的地址地址联系起来。联系起来。变量定义及内存分配实例变量定义及内存分配实例对变量的两种访问方式:对变量的两种
3、访问方式:直接访问直接访问 和和间接访问间接访问inti,j,k;i=3;j=6;k=9;则编译时系统分别为则编译时系统分别为i,j,k各分配各分配2个字节。个字节。如如:2000,2001i2002,2003j2004,2005k例例例例图图图图 内存用户数据区内存用户数据区36920002000200220043010 变量变量 i变量变量 j变量变量 k变量变量 i_ pointer如如:inti=3;printf(“%d”,i);执行是执行是:根据变量名根据变量名i找到找到i的地址的地址(如如:2000),然后,然后从地址从地址2000开始的两开始的两个字节中取出数据个字节中取出数据(
4、即变量的值即变量的值3),再将再将其输出。这种据变量名按变量地址存取变其输出。这种据变量名按变量地址存取变量的值的量的值的方式叫方式叫“直接访问直接访问”方式。方式。说明说明说明说明重点重点重点重点2000i3inti=3;表示将表示将3送送到变量到变量i所占的内存单元中所占的内存单元中重点重点重点重点C语言允许定义和使用一种特殊的变量,语言允许定义和使用一种特殊的变量,这种变量专门用于存放其它变量的这种变量专门用于存放其它变量的地址地址。如前。如前面的变量面的变量i_pointer。如。如果把变量果把变量i的地址赋的地址赋给给i_pointer,即即i_pointer=&i。这。这样就样就可
5、以通过变量可以通过变量i_pointer获取变量获取变量i的地址,的地址,然后再然后再取出取出i的值。这种方式叫的值。这种方式叫“间接访问间接访问”方式。方式。如图所示如图所示:20002000i_pointer3将将3送到变量送到变量i_pointer所所指向指向的内存单元中的内存单元中C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院 指针指针:一个变量的一个变量的地址地址叫该变量的叫该变量的“指针指针”。指针变量指针变量:用于存放其它变量的用于存放其它变量的地址地址的变量。的变量。指向指向:如如 i_pointer=&ii_pointer=&i ,就称
6、,就称i_pointeri_pointer指向变量指向变量i i 目标变量目标变量:指针变量所指向的变量。指针变量所指向的变量。有关指针的几个概念:有关指针的几个概念:C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院说明说明:1.类型说明符类型说明符表示指针变量所指向的变量的类型,表示指针变量所指向的变量的类型,同类型变量的地址才能放到指向该类型变量的指针同类型变量的地址才能放到指向该类型变量的指针变量中。变量中。例如例如2.不能把一个不能把一个整型量整型量或任何其它或任何其它非地址非地址类型的数据类型的数据赋给一个指针变量。赋给一个指针变量。例如例如示例
7、一示例一实例二实例二9.2变量的变量的指针指针和指向变量的和指向变量的指针变量指针变量一、指针变量的定义一、指针变量的定义格式格式:类型说明符类型说明符*标识符标识符如:如:int*pointer_1,*pointer_2;float*fp1,*fp2;例例例例例例例例&i&jpointer_1pointer_2ij如如:inti,j,*pointer_1,*pointer_2;若若:pointer_1=&i;pointer_2=&j;则则:flaotf1;int*p;p=&f1;(不正确不正确)例例例例如如:int*p;p=100;(不合法不合法)但但:p=NULL或或p=0或或p=0则是合
8、法则是合法的,都表示为指的,都表示为指针赋了针赋了“空值空值”。这并不意味着这并不意味着p指指向向地址为地址为0的单元,而是不指向的单元,而是不指向任何单元,但任何单元,但p中有确定的值。中有确定的值。例例例例C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院二、指针变量的引用二、指针变量的引用例例9.1main()inta,b;int*p1,*p2;a=100;b=10;p1=&a;p2=&b;printf(“%d,%dn”,a,b);printf(“%d,%dn”,*p1,*p2);结果结果:100,10100,10&a&b10010p1p2ab*p1*
9、p2“直接访问直接访问”方方式式“间接访问间接访问”方方式式C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院关于关于&与与*运算符的说明运算符的说明:1:&是取地址运算符。是取地址运算符。例如例如2.&,*,+,同优先级,同优先级,按从按从右至左方右至左方向结合。向结合。示例示例1 示例示例2 示例示例3如如:inta,*p1,*p2;p1=&a;则则:&*p1与与&a等效等效p2=&*p1;或或p2=&a;则则:p2也指向变量也指向变量a例子例子例子例子如如:&a,&b等。等。*是指针运算符。是指针运算符。用于定义时用于定义时表示其后的表示其后的标识符标
10、识符是是指针变量指针变量。而。而在程序中在程序中*p则表示指针变量则表示指针变量p所指所指向的变量,即向的变量,即目标变量目标变量。例子例子例子例子例子例子例子例子如如:inta,*p1;p1=&a;则则:*&a与与*p1等效,即等价于变量等效,即等价于变量a。&ap1*p1*&aa如如:inta,*p1;p1=&a;则则:(*p1)+等价于等价于a+但注意但注意*p1+不等价于不等价于(*p1)+因为因为*p1+等价于等价于*(p1+)即先得即先得p1所指向变量的所指向变量的值值,再使指针变量,再使指针变量p1的值自增。的值自增。例子例子例子例子C语语言言程程序序设设计计第第九九章章四川理工
11、学院四川理工学院四川理工学院四川理工学院例例9.2main()int*p1,*p2,*p,a,b;scanf(“%d,%d”,&a,&b);p1=&a;p2=&b;if(ab)p=p1;p1=p2;p2=p;printf(“a=%d,b=%dn”,a,b);printf(“max=%d,min=%dn”,*p1,*p2);如输入如输入:5,9 输出输出:a=5,b=9max=9,min=5数据指针交换示意图数据指针交换示意图 注意事项注意事项进行地址交换进行地址交换本程序是采用交换变量本程序是采用交换变量a和和b的地址来实现两个数的地址来实现两个数的比较的。且比较前后的比较的。且比较前后a,b
12、的值并未发生变化的值并未发生变化重点重点重点重点重点重点重点重点&a&b59&b&a95p1p2ppp1p2abab交换前交换前交换后交换后C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院三、三、指针变量作为函数的参数指针变量作为函数的参数函数调用时,把实际参数的值传递给形式参数。函数调用时,把实际参数的值传递给形式参数。指针变量可以作实际参数,其作用也是将实际参数指针变量可以作实际参数,其作用也是将实际参数的值传递给形式参数,这个时候的值代表是将一个变的值传递给形式参数,这个时候的值代表是将一个变量的量的地址,地址,把把地址地址传送给被调函数的形式参数。
13、传送给被调函数的形式参数。C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院例例9.3swap(int*p1,int*p2)intp;p=*p1;*p1=*p2;*p2=p;main()inta,b,*pointer_1,*pointer_2;scanf(“%d,%d”,&a,&b);pointer_1=&a;pointer_2=&b;if(ab)swap(pointer_1,pointer_2);printf(“n%d,%dn”,a,b);交换目标变量,即值的交换交换目标变量,即值的交换C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工
14、学院四川理工学院若输入若输入:5,9 输出为输出为:9,5&a&b59abpointer_1pointer_2&a&b&a&b59abp1p2pointer_1pointer_2&a&a&b&b95p1pointer_1p2pointer_2ab&a&b95abpointer_1pointer_2(a)(b)(c)(d)本程序采用的是交换本程序采用的是交换a和和b的的值值,而而p1和和p2的值不变。的值不变。同同例例9.2相反相反C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院如果把如果把swap函数改成函数改成:swap(int*p1,int*p2)in
15、t*p;*p=*p1;*p1=*p2;*p2=*p;此句有问此句有问题题C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院swap(intx,inty)intt;t=x;x=y;y=t;55995995abxyabxy(a)(b)main()inta,b;scanf(“%d,%d”,&a,&b);if(ab)swap(a,b);printf(“n%d,%dn”,a,b);C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院说明说明:1.如想通过函数调用得到如想通过函数调用得到n个要改变的值。个要改变的值。(1)在主调函数中设
16、在主调函数中设n个变量,并用个变量,并用n个指针变量个指针变量指向它们。指向它们。(2)将指针变量作将指针变量作实参实参,使,使n个变量的个变量的地址地址传给所传给所调用的函数调用的函数形参形参。(3)通过形参指针变量,改变该通过形参指针变量,改变该n个变量的个变量的值值。(4)主调函数中就可以使用这些改变了值的变量。主调函数中就可以使用这些改变了值的变量。2.不能通过改变形参指针变量不能通过改变形参指针变量本身的值本身的值而使而使实参指实参指针变量的值针变量的值改变。改变。&ap1&aq1函数调用时函数调用时&bq1在被调函数中在被调函数中C语语言言程程序序设设计计第第九九章章四川理工学院四
17、川理工学院四川理工学院四川理工学院3.可以通过改变形参指针变量所可以通过改变形参指针变量所指向指向的变量的值来改的变量的值来改变实参指针变量所变实参指针变量所指向指向的变量的值。的变量的值。5a&ap1&aq1补例补例1:voidpoint(int*q1)q1+=2;main()int*p1,a=4;p1=&a;point(p1);printf(“%dn”,*p1);C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院4a&ap1&aq1补例补例2:voidpoint(int*q1)*q1+=2;main()int*p1,a=4;p1=&a;point(p1)
18、;printf(“%dn”,*p1);C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院swap(int*p1,int*p2)int*p;p=p1;p1=p2;p2=p;main()inta,b,*pointer_1,*pointer_2;scanf(“%d,%d”,&a,&b);pointer_1=&a;pointer_2=&b;if(ab)swap(pointer_1,pointer_2);printf(“n%d,%dn”,a,b);本函数中试图通过改变本函数中试图通过改变形参指针变形参指针变量量的值来使的值来使实参指针变量实参指针变量的值改变的值改变C
19、语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院a&a&b59bpointer_1pointer_2(a)&a&b59abp1p2(b)&b&a59abp1p2(c)a&b&a59bpointer_1pointer_2(d)&a&b59abpointer_1pointer_2(d)C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院exchange(int*q1,int*q2,int*q3)if(*q1*q2)swap(q1,q2);if(*q1*q3)swap(q1,q3);if(*q2*q3)swap(q2,q3);例例
20、9.4swap(int*pt1,int*pt2)intp;p=*pt1;*pt1=*pt2;*pt2=p;C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院main()inta,b,c,*p1,*p2,*p3;scanf(“%d,%d,%d”,&a,&b,&c);p1=&a;p2=&b;p3=&c;exchange(p1,p2,p3);printf(“n%d,%d,%dn”,a,b,c);运行如下运行如下:9,0,10:9,0,10 10,9,0 10,9,C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院C语语言言程程序
21、序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院 9.3 9.3 数组的指针和指向数组的指针变量数组的指针和指向数组的指针变量 C C 语言中,指针变量可以指向变量,也可以指向语言中,指针变量可以指向变量,也可以指向数组数组和和数组元素数组元素。数组的指针数组的指针:数组的数组的起始地址起始地址(首地址首地址 )数组元素的指针数组元素的指针:数组元素的地址数组元素的地址C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院一、指向一维数组的指针变量的定义与赋值一、指向一维数组的指针变量的定义与赋值指向数组的指针变量的定义同指向变量的指针变量
22、的指向数组的指针变量的定义同指向变量的指针变量的定义相同。定义相同。如如:inta10;int*p;若若:p=&a0;则则p指向了指向了a数组的第数组的第0号元素。号元素。由于数组名代表数组的由于数组名代表数组的首地址首地址(即即起始地址起始地址),故故:p=&a0;等价于等价于p=a;也可也可:inta10;int*p=&a0;int*p=a;注意注意int*p=&a0;的含义是将数组的的含义是将数组的首地址首地址赋给赋给指针变量指针变量p,而不是赋给,而不是赋给(*p)。C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院二、二、通过指针引用数组元素通过指
23、针引用数组元素如如:inta10,*p;p=a;则则:(1)pa0的地址的地址p+1a1的地址的地址p+iai的地址的地址(2)*p=a0,*(p+1)=a1,*(p+i)=ai说明说明:1.数组元素在内存中是连续存放的,数组元素在内存中是连续存放的,C语言规定,语言规定,指针变量指针变量p+1指向下一个元素指向下一个元素(不不是简单的加是简单的加1)如数组元素为实型,如数组元素为实型,则则p+1所表示的实所表示的实际地址是际地址是p+1 d=p+1 4(d为一个数组元素所为一个数组元素所占的字节数占的字节数)&C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工
24、学院2.(p+i)表示指向表示指向ai的地址,而的地址,而a+i也表示也表示ai的地址,故的地址,故程序中程序中(p+i)等价于等价于a+i。如如:p+2;a+2;3.指向数组的指针变量可以带下标。指向数组的指针变量可以带下标。如如:pi*(p+i)综上所述综上所述:数组元素的引用可以数组元素的引用可以:(1)下标法下标法:数组名数组名下标下标或或指针变量名指针变量名下标下标(2)指针法指针法:*(p+i)或或*(a+i)(假定假定:inta10,*p=a;)a数组数组pp+1,a+1p+i,a+ip+9,a+9a0a1aia9*(p+i)C语语言言程程序序设设计计第第九九章章四川理工学院四川
25、理工学院四川理工学院四川理工学院例例9.5用三种方法输出数组各元素。用三种方法输出数组各元素。(1)下标法下标法main()inta10,i;for(i=0;i10;i+)scanf(“%d”,&ai);printf(“n”);for(i=0;i10;i+)printf(“%d”,ai);C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院(2)用数组名计算元素地址用数组名计算元素地址main()inta10,i;for(i=0;i10;i+)scanf(“%d”,&ai);printf(“n”);for(i=0;i10;i+)printf(“%d”,*(a+
26、i);C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院(3)用指针变量指向数组元素用指针变量指向数组元素main()inta10,i,*p;for(i=0;i10;i+)scanf(“%d”,&ai);printf(“n”);for(p=a;p(a+10);p+)printf(“%d”,*p);C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院注意几点注意几点:(1)(1)指针变量可以作自增,自减运算。指针变量可以作自增,自减运算。如如:+p p ,p p 而数组名不能作自增,自减运算。而数组名不能作自增,自减运算。如如
27、:a a+,+,a a 等均不合法。因为等均不合法。因为数组名是常量数组名是常量。(2)(2)注意指针变量的当前值。注意指针变量的当前值。如如:例例 9.6 9.6 C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院main()inta10,i,*p;p=a;for(i=0;i10;i+)scanf(“%d”,p+);printf(“n”);for(i=0;i10;i+,p+)printf(“%d”,*p);for(i=0,p=a;i10;i+,p+)或或for(p=a;pa+10;p+)pa数组数组C语语言言程程序序设设计计第第九九章章四川理工学院四川理工
28、学院四川理工学院四川理工学院(3)注意指针变量的运算注意指针变量的运算如如:inta10,i,*p;p=a;则则:a.p+(或或p+=1)表示表示p指向指向a1,此时若执行此时若执行*p则取出则取出a1元素的值。元素的值。b.“*”与与“+”同优先级,自右往左结合。同优先级,自右往左结合。如如:*p+等效于等效于*(p+),即先取即先取p所指向变量的值,所指向变量的值,再使再使p+1。而。而*(p+)与与*(+p)的作用不同。前的作用不同。前者先取者先取*p的值,后使的值,后使p+1;后者是先使后者是先使p+1,再,再取取*p的值的值。c.(*p)+表示使目标变量的值加表示使目标变量的值加1。
29、而不是指针变而不是指针变量的值加量的值加1d.*(p+)等价于等价于ai+*(+p)等价于等价于a+i即先使即先使p自增自增,再作再作*运算。运算。C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院如如:main()inta100,*p;p=a;while(pa+100)printf(“%d”,*p+);main()inta100,*p;p=a;while(pa+100)printf(“%d”,*p);p+;C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院三、数组名作函数参数 数组名作函数参数时,实际上是将实参数组的首地
30、址 传给形参。这样实参数组与形参数组共占同一段内存。使得在调用函数过程中,形参数组中元素值发生变化也 就使实参数组的元素值随之而发生变化。C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院main()f(intarr,intn)intarray10;f(array,10);C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院voidinv(intx,intn)intt,i,j,m=(n1)/2;for(i=0;i=m;i+)j=n1i;t=xi;xi=xj;xj=t;return;可去掉可去掉3 7 9 11 0 6 7 5
31、 4 22 4 5 7 6 0 11 9 7 3imj例例9.7将数组将数组a中中n个整数按相个整数按相反顺序反顺序存放。存放。即将即将第一第一个元素和个元素和最后最后一个元素对换,将第二个同倒一个元素对换,将第二个同倒数第二个对换数第二个对换.即两两对换,直到即两两对换,直到:a(n1)/2与与an(n1)/21对换为止。对换为止。C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院voidmain()staticinti,a10=3,7,9,11,0,6,7,5,4,2;printf(“Theoriginalarray:n”);for(i=0;i10;i+
32、)printf(“%d,”,ai);printf(“n”);inv(a,10);printf(“Thearrayhasbeeninverted:n”);for(i=0;i10;i+)printf(“%d,”,ai);printf(“n”);运行结果运行结果:Theoriginalarray:3,7,9,11,0,6,7,5,4,2Thearrayhasbeeninverted:2,4,5,7,6,0,11,9,7,C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院以上程序也可以改为如下以上程序也可以改为如下:voidinv(int*x,intn)int*p,
33、t,*i,*j,m=(n1)/2;i=x;j=x+n1;p=x+m;for(;i=p;i+,j)t=*i;*i=*j;*j=t;return;a数组数组a0a1.a9370i,xp=x+mj24 C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院main()staticinti,a10=3,7,9,11,0,6,7,5,4,2;printf(“Theoriginalarray:n”);for(i=0;i10;i+)printf(“%d”,ai);printf(“n”);inv(a,10);printf(“Thearrayhasbeeninverted:n”)
34、;for(i=0;i10;i+)printf(“%d”,ai);printf(“n”);C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院intmax,min;voidmax_min_value(intarray,intn)int*p,*array_end;array_end=array+n;max=min=*array;for(p=array+1;pmax)max=*p;elseif(*pmin)min=*p;return;等价于等价于*(array+0)即即array0例例9.8从从10个数中找出其中最大值和最小值个数中找出其中最大值和最小值C语语言言程
35、程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院voidmain()inti,number10;printf(“enter10datan”);for(i=0;i10;i+)scanf(“%d”,&numberi);max_min_value(number,10);printf(“nmax=%d,min=%dn”,max,min);运行结果运行结果:enter10data246803456789100 max=100,min=C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院此例也可改用指针变量来传送地址,程序可改为此例也可改用指针变
36、量来传送地址,程序可改为:intmax,min;voidmax_min_value(int*array,intn)int*p,*array_end;array_end=array+n;max=min=*array;for(p=array+1;pmax)max=*p;elseif(*pmin)min=*p;return;C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院voidmain()inti,number10,*p;p=number;printf(“enter10datan”);for(i=0;i10;i+,p+)scanf(“%d”,p);printf
37、(“the10data:n”);for(p=number,i=0;i10;i+,p+)printf(“%d”,*p);p=number;max_min_value(p,10);printf(“nmax=%d,min=%dn”,max,min);for(p=number;p(number+10);p+)综上所述,对于实参数组想在被调函数中改变综上所述,对于实参数组想在被调函数中改变此数组元素的值,实参与形参的对应关系可以如下此数组元素的值,实参与形参的对应关系可以如下:C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院(1)二者都用数组名二者都用数组名main
38、()f(intx,intn)inta10;f(a,10);特点特点:a和和x数组共用同一段内存单元。数组共用同一段内存单元。(2)实参为数组名,形参用指针变量实参为数组名,形参用指针变量main()f(int*x,intn)inta10;f(a,10);C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院(2)实参为数组名,形参用指针变量实参为数组名,形参用指针变量main()f(int*x,intn)inta10;f(a,10);特点特点:实参将数组的首地址传给形参指针变量,通过指实参将数组的首地址传给形参指针变量,通过指针变量指向数组中的任一元素针变量指向
39、数组中的任一元素,进而作相应的处理。进而作相应的处理。C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院(3)二者都用指针变量二者都用指针变量main()f(int*x,intn)inta10,*p;p=a;f(p,10);特点特点:先使先使p指向指向a数组,再将数组,再将p传给传给x,使使x也指也指向向a数组,从而进行处理。数组,从而进行处理。C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院(4)实参为指针变量,而形参为数组名实参为指针变量,而形参为数组名main()f(intx,intn)inta10,*p;p=a;
40、f(p,10);特点特点:利用指针变量将利用指针变量将a数组的首地址传给数组的首地址传给x数组。使数组。使两数组共用同一段内存单元。利用两数组共用同一段内存单元。利用xi值的变化,值的变化,使使ai的值也发生变化。的值也发生变化。注意注意:在上述四种处理方式中,当用指针变量作实参时,在上述四种处理方式中,当用指针变量作实参时,必须先使指针变量有确定的值,即指向一个已定必须先使指针变量有确定的值,即指向一个已定义的数组。义的数组。C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院四四、二维数组的指针和指向二维数组的指针变量、二维数组的指针和指向二维数组的指针变
41、量1.二维数组和数组元素的地址二维数组和数组元素的地址C语言中二维数组实际上是由若干个按行存放的一语言中二维数组实际上是由若干个按行存放的一维数组构成的。如:维数组构成的。如:inta34;a0a00a01a02a03a1a10a11a12a13a2a20a21a22a23a代表首元素的地址,而此时首元素代表首元素的地址,而此时首元素a0又是一个包含又是一个包含有有4个元素的一维数组。所以个元素的一维数组。所以a(或或a+0)表示二维数组表示二维数组第第0行的地址。同理:行的地址。同理:a+1,a+2分别表示二维数组分别表示二维数组第第1行和第行和第2行的地址。所以,二维数组名是一个行的地址。
42、所以,二维数组名是一个行指行指针针。a0,a1,a2分别表示一维数组名,所以分别表示一维数组名,所以a0代代表表一维数组一维数组a0中第中第0列元素的地址,即列元素的地址,即&a00。C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院同理:同理:a1的值为的值为&a10,a2的值为的值为&a20。二维数组元素的地址可表示为:二维数组元素的地址可表示为:(1)&aij(2)ai+j(3)*(a+i)+j(因为因为ai等价于等价于*(a+i)二维数组元素的引用可表示为:二维数组元素的引用可表示为:(1)aij(2)*(ai+j)(3)*(*(a+i)+j)2.指
43、向二维数组的指针变量指向二维数组的指针变量(1)指向二维数组的指向二维数组的列指针列指针变量变量inta34,*p;C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院如:如:p=a0;或或p=&a00;p=*(a+0);p=*a;则则p是一个指向二维数组是一个指向二维数组a第第0行第行第0列元素的指列元素的指针针变量。变量。(即即p是一个是一个列指针变量列指针变量)此时此时p+1则指向第则指向第0行行第第1列的元素。列的元素。说明:说明:上述上述p=a0;不能写成不能写成p=a;因为尽管因为尽管a0和和a都表示地址且都表示地址且值相同,但二者的值相同,但二者
44、的地址基类型地址基类型不同。不同。即即a0是一个是一个列地址列地址,而,而a是一个是一个行地址行地址。1357246811121314p p+C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院#include“stdio.h”voidmain()inta34=1,2,3,4,9,8,7,6,10,11,5,2;int*p=a0;(或或int*p=&a00;)for(;pa0+12;p+)if(pa0)%4=0)printf(“n”);printf(“%4d”,*p);(2)指向二维数组的指向二维数组的行指针行指针变量变量由于二维数组是由按行存放的一维数组构成
45、,由于二维数组是由按行存放的一维数组构成,C语语言中可以用言中可以用行指针变量行指针变量来引用二维数组元素。来引用二维数组元素。C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院定义格式:定义格式:数据类型数据类型(*标示符标示符)常量常量如:如:int(*p)4;表示表示p所指的对象是有所指的对象是有4个整型元素的数组。个整型元素的数组。inta34,(*p)4;若:若:p=a;则则p是指向是指向a数组第数组第0行行的指针变量,的指针变量,即即p是一个是一个行指针变量行指针变量。此时,此时,p+1则指向则指向a数组第数组第1行,行,p+i则指向则指向a数组
46、第数组第i行。行。所以,所以,*(p+i)+j表示表示a数组数组中第中第i行行j列元素的地址。列元素的地址。而而*(*(p+i)+j)则表示表示则表示表示a数组中第数组中第i行行j列元素的列元素的值值。注意注意不能写成不能写成p=a0。1357246811121314pp+C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院例:例:输出二维数组任意行任意例元素的值。输出二维数组任意行任意例元素的值。voidmain()inta34=1,2,3,4,9,8,7,6,10,11,5,2;int(*p)4,i,j;p=a;scnaf(“i=%d,j=%d”,&i,&
47、j);printf(“a%d,%d=%dn”,i,j,*(*(p+i)+j);3.二维数组名和指向二维数组的指针变量作函数参数二维数组名和指向二维数组的指针变量作函数参数补充例:补充例:用用函数调用方式函数调用方式编写程序找出二维数组编写程序找出二维数组a中每中每行的最小值并输出。要求:行的最小值并输出。要求:(1)二维数组元素的值用随机函数产生二维数组元素的值用随机函数产生(050)之间之间(2)每行中元素的最小值在每行中元素的最小值在line_min()函数中求出。函数中求出。(3)在主函数中输出每行的最小值。在主函数中输出每行的最小值。C语语言言程程序序设设计计第第九九章章四川理工学院四
48、川理工学院四川理工学院四川理工学院 voidmain()1、定义一个二维数组定义一个二维数组2、调调随机函数随机函数对二维数组对二维数组元素元素赋值赋值3、调用调用line_min函数函数4、输出结果到屏幕输出结果到屏幕line_min()1、接收实参接收实参2、求二维数组每行中的最小值求二维数组每行中的最小值C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院方法一、方法一、用用列指针列指针来求解来求解#include“stdlib.h”#defineN3#defineM4voidmain()intaNM,min,i,j;for(i=0;iN;i+)for(
49、j=0;jM;j+)aij=random(50);printf(“%4d”,aij);if(j+1)%4=0)printf(“n”);for(i=0;iN;i+)min=line_min(ai);printf(“a%d:min=%dn”,i,min);C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院line_min(int*p)intj,min;min=*(p+0);for(j=1;j*(p+j)min=*(p+j);returnmin;方法二、方法二、用用行指针行指针来求解来求解C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四
50、川理工学院#include“stdlib.h”#defineN3#defineM4voidmain()intaNM,min,i,j;for(i=0;iN;i+)for(j=0;jM;j+)aij=random(50);printf(“%4d”,aij);if(j+1)%4=0)printf(“n”);for(i=0;iN;i+)min=line_min(a+i);printf(“a%d:min=%dn”,i,min);C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院line_min(int(*p)M)intj,min;min=*(*p);for(j=1;j