《C程序设计-第10章-复习讲稿.ppt》由会员分享,可在线阅读,更多相关《C程序设计-第10章-复习讲稿.ppt(81页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第十章第十章第十章第十章The C Programming Language指针10.110.1地址地址和和指针指针的概念的概念10.210.2变量的变量的指针指针和指向变量的指针和指向变量的指针变量变量10.310.3数组与指针数组与指针10.410.4字符串与指针字符串与指针10.510.5指向函数的指向函数的指针指针10.610.6返回指针值的返回指针值的函数函数10.710.7指针指针数组数组和指向指针的和指向指针的指针指针10.810.8有关指针的数据类型和指针运算的小结有关指针的数据类型和指针运算的小结10.110.110.110.1地址和指针的概念地址和指针的概念地址和指针的概念
2、地址和指针的概念先清楚数据在内存中是如何存储和如何读取的。先清楚数据在内存中是如何存储和如何读取的。内存中的每一个字节对应一个编号,即内存中的每一个字节对应一个编号,即“地址地址”。如果在程序。如果在程序中定义了一个变量,在编译时,系统就会给变量分配内存单元。中定义了一个变量,在编译时,系统就会给变量分配内存单元。、按变量地址存取变量值按变量地址存取变量值的方式称为的方式称为“直接访问直接访问”方式。方式。例如:例如:scanfscanf(%d,&i);(%d,&i);printfprintf(%d,i);(%d,i);j=6j=6;k=k=i+ji+j;2 2、另一种存取变量值的方式:、另一
3、种存取变量值的方式:间接访问间接访问”。中,指针变量是一种专门存放地中,指针变量是一种专门存放地址的特殊变量。址的特殊变量。设定义指针变量设定义指针变量i_pointeri_pointer用来存放整用来存放整型变量的地址,它被分配地址为型变量的地址,它被分配地址为(3010)(3010)、(3011)(3011)的两个字节。的两个字节。如果:如果:i_pointeri_pointer ;则则 i_pointeri_pointer的值就是的值就是(2000)(2000)。存取。存取变量的值,可以先找到存放变量的值,可以先找到存放“的地的地址址”的变量的变量i_pointeri_pointer ,
4、从中取出的,从中取出的地址地址(2000)(2000),然后到,然后到2000 2000、20012001字节字节取出的值(取出的值(3 3)。)。10.110.110.110.1地址和指针的概念地址和指针的概念地址和指针的概念地址和指针的概念一个变量的地址称为该变量的一个变量的地址称为该变量的“指针指针”。例如:地址例如:地址20002000是变量的指针。是变量的指针。如果有一个变量专门用来存放另一变量的地如果有一个变量专门用来存放另一变量的地址(即指针),则称该变量为址(即指针),则称该变量为“指针变量指针变量”。例如:例如:i_pointeri_pointer是一个指针变量。是一个指针变
5、量。指针和指针变量的定义:指针和指针变量的定义:指针指针是一个地址,是一个地址,指针变量指针变量是存放地址的变量。是存放地址的变量。要区分要区分“指针指针”和和“指针变量指针变量”两个概念。两个概念。10.110.110.110.1地址和指针的概念地址和指针的概念地址和指针的概念地址和指针的概念下面都是合法的定义:下面都是合法的定义:float float *pointer_pointer_;char char *pointer_pointer_;可以用赋值语句使一个指针变量指向某个变量。如:可以用赋值语句使一个指针变量指向某个变量。如:pointer_pointer_;pointer_poi
6、nter_;为了表示清楚指针变量和它所指向的为了表示清楚指针变量和它所指向的变量之间的联系。变量之间的联系。程序中用程序中用*号(指针运算符号(指针运算符oror间接访问运算符间接访问运算符)表示)表示“指向指向”。10.2 10.2 10.2 10.2 变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量10.10.1.1 定义一个指针变量定义一个指针变量定义指针变量的一般形式为定义指针变量的一般形式为基类型基类型 *指针变量名;指针变量名;定义定义指针变量时要指针变量时要注意两点:注意两点:(1)(1)定义中指针变量前面的
7、定义中指针变量前面的“*”,表示该变量的类型为指针型变量。,表示该变量的类型为指针型变量。例例:float float *pointer_1pointer_1;指针指针变量名变量名是是pointer_1pointer_1 ,而不是,而不是*pointer_1pointer_1 。(2)(2)定义指针变量时必须指定定义指针变量时必须指定基类型基类型。注意:存储的地址的类型必须对应注意:存储的地址的类型必须对应下面的赋值是错误的下面的赋值是错误的 float a;float a;intint *pointer_1;pointer_1;pointer_1=&a;pointer_1=&a;10.2 1
8、0.2 10.2 10.2 变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量10.10.指针变量的引用指针变量的引用 指针变量指针变量中只能存放中只能存放地址(指针),地址(指针),不要将一个整数(或任何其他不要将一个整数(或任何其他非地址类型的数据)赋给一个指针变量。非地址类型的数据)赋给一个指针变量。例例10.10.通过指针变量访问整型变量通过指针变量访问整型变量#include#include voidvoidmain()main()intint ,;,;intint*pointer_*pointer_,*point
9、er_pointer_;100100;1010;pointer_pointer_;pointer_pointer_;printfprintf(%,%,););printfprintf(%,%,*pointer_,*pointer_,*pointer_,*pointer_););10.2 10.2 10.2 10.2 变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量对对“”和和“*”(指针运算符、间接访问运算符)的说明:(指针运算符、间接访问运算符)的说明:如果已执行语句如果已执行语句 pointer_pointer_;(1
10、)(1)*pointer_pointer_的含义是什么?的含义是什么?“”和和“*”优先级同,右结合,故先进行优先级同,右结合,故先进行*pointer_pointer_运算,运算,再执行运算。即再执行运算。即*pointer_pointer_与与相同,表示变量相同,表示变量a a的地址。的地址。如果如果pointer_2pointer_2 *pointer_pointer_ ;它的作用是将(的地址)赋给它的作用是将(的地址)赋给pointer_2pointer_2 。10.2 10.2 10.2 10.2 变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量变量的指针和指向变量的指针
11、变量变量的指针和指向变量的指针变量(2)(2)*的含义是什么?的含义是什么?先做运算,再做先做运算,再做*运算。即所指向的变量,就是变量运算。即所指向的变量,就是变量a a。*和和*pointer_pointer_的作用一样,都等价于变量。的作用一样,都等价于变量。即即*与等价与等价。(3)(3)(*pointer_pointer_)相当于。)相当于。注意括号是必要的,否则就成为了注意括号是必要的,否则就成为了*pointer_pointer_,因,因+和和*为同一为同一优先级,右结合优先级,右结合,因此它相当于,因此它相当于*(pointer_(pointer_)。由于。由于+在在point
12、er_1pointer_1的右侧,是的右侧,是“后加后加”,因此先对,因此先对pointer_pointer_的原值进行的原值进行*运运算,得到的值,然后使算,得到的值,然后使pointer_pointer_的值改变,这样的值改变,这样pointer_pointer_不再不再指向了。指向了。10.2 10.2 10.2 10.2 变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量例例10.2 10.2 输入和两个整数,按先大后小的顺序输出和。输入和两个整数,按先大后小的顺序输出和。#include#include void
13、void mainmain()()intint*1 1,*2 2,*,;,;scanfscanf(,);,);1 1;ifif();();printfprintf(=,=,););printfprintf(max=max=,min=,min=,*,*1,*1,*2 2););/*p1/*p1指向大数指向大数*/10.10.指针变量的引用指针变量的引用指针变量应用举例指针变量应用举例 运行情况如下:运行情况如下:,axax,inin10.2 10.2 10.2 10.2 变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量10.
14、10.3.3 指针变量作为函数参数指针变量作为函数参数例例10.3 10.3 对输入的两个整数按大小顺序输出对输入的两个整数按大小顺序输出 10.2 10.2 10.2 10.2 变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量#include#include void main void main()()void swapvoid swap(intint*1 1,intint*2 2);intint ,;,;intint*pointer_*pointer_,*pointer_pointer_;scanfscanf(,);
15、,);pointer_pointer_ ;pointer_2 pointer_2;ifif()swapswap(pointer_pointer_ ,pointer_2 pointer_2);printfprintf(,);,);void swapvoid swap(intint*1 1,intint*2 2)intint temp temp;temptemp*1 1;*1 1*2 2;*2 2temptemp;10.2 10.2 10.2 10.2 变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量10.10.3.3 指针变
16、量作为函数参数指针变量作为函数参数如果如果 改动改动 例例10.3 10.3 中函数中函数swap swap 的定义,结果如何?的定义,结果如何?#include#include void main void main()()void swapvoid swap(intint x x,intint y y);intint ,;,;intint*pointer_*pointer_,*pointer_pointer_;scanfscanf(,);,);pointer_pointer_ ;pointer_2 pointer_2;ifif()swapswap(*pointer_pointer_ ,*p
17、ointer_2pointer_2 );printfprintf(,);,);void swapvoid swap(intint x x,intint y y)intint temp temp;temptempx x;x xy y;y ytemptemp;&a&b pointer_ pointer_2x ytemp10.2 10.2 10.2 10.2 变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量10.10.3.3 指针变量作为函数参数指针变量作为函数参数如果如果 再改动再改动 例例10.3 10.3 中函数中函数sw
18、ap swap 的定义,结果如何?的定义,结果如何?#include#include void main void main()()void swapvoid swap(intint*1 1,intint*2 2);intint ,;,;intint*pointer_*pointer_,*pointer_pointer_;scanfscanf(,);,);pointer_pointer_ ;pointer_2 pointer_2;ifif()swapswap(pointer_pointer_ ,pointer_2 pointer_2);printfprintf(,);,);void swapv
19、oid swap(intint *p1 *p1,intint *p2 *p2)intint *p *p;p pp1p1;p1p1p2p2;p2p2p1p1;&a&b pointer_ pointer_2p1 p2p重要总结:重要总结:C C中实参变量中实参变量-形参变量之间的数形参变量之间的数据传递是单向的据传递是单向的“值传递值传递”,不,不能通过调用函数来改变实参指针能通过调用函数来改变实参指针变量的值,但可以改变实参指针变量的值,但可以改变实参指针变量所指变量的值。变量所指变量的值。如果想通过函数调用得到如果想通过函数调用得到n n个改变的值,个改变的值,可以:可以:1 1、在主调函数中
20、设、在主调函数中设n n个变量,用个变量,用n n个指针变量指向他们个指针变量指向他们;2 2、然后将、然后将指针变量做实参指针变量做实参,将这,将这n n个变量的地址传给形参个变量的地址传给形参;3 3、通过形参指针变量,改变这通过形参指针变量,改变这n n个变量单元中的值个变量单元中的值;4 4、主调函数中就可以使用这些改变了值的变量、主调函数中就可以使用这些改变了值的变量;10.2 10.2 10.2 10.2 变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量10.3 10.3 10.3 10.3 数组与指针数组与指
21、针数组与指针数组与指针一个变量有地址,一个数组的每个数组元素都在内存中占用存一个变量有地址,一个数组的每个数组元素都在内存中占用存储单元,都有相应的地址。指针变量也可以指向数组元素。所储单元,都有相应的地址。指针变量也可以指向数组元素。所谓谓数组元素的指针就是数组元素的地址。数组元素的指针就是数组元素的地址。定义一个定义一个指向数组元素的指针变量指向数组元素的指针变量的方法。的方法。例如:例如:intint 1010;intint *;注意:注意:指向数组元素的指针变量指向数组元素的指针变量的基类型应与数组元素类型同。的基类型应与数组元素类型同。10.3.1 10.3.1 指向数组元素的指针指
22、向数组元素的指针对指针变量对指针变量p p赋值:赋值:a0a0;使指向数组的第号元素,使指向数组的第号元素,如图如图:intint a10,*p;a10,*p;p pa;a;/*p=a/*p=a和和p=&a0p=&a0等价等价*/注意:数组名代表数组在内存中的起始地注意:数组名代表数组在内存中的起始地址(与第址(与第1 1个元素的地址相同),所以可以个元素的地址相同),所以可以用数组名给指针变量赋值。用数组名给指针变量赋值。10.3.2 10.3.2 通过指针引用数组元素通过指针引用数组元素10.3 10.3 10.3 10.3 数组与指针数组与指针数组与指针数组与指针 若若p p是指向某一数
23、组元素的指针变量,则是指向某一数组元素的指针变量,则*p=p=p=p=常量常量常量常量表示对表示对p p p p所指的数组所指的数组元素赋值。元素赋值。C C规定,如果规定,如果指针变量指针变量p p已指向数组中的一个元素,则已指向数组中的一个元素,则p+1p+1p+1p+1指向同一数指向同一数组中的下一个元素组中的下一个元素(而不是将而不是将p p值简单的加值简单的加1)1),其,其代表的地址是代表的地址是p+1*dp+1*dp+1*dp+1*d,其其中中d d d d是基类型所占用的存储单元的字节数是基类型所占用的存储单元的字节数是基类型所占用的存储单元的字节数是基类型所占用的存储单元的字
24、节数。例如:例如:例如:例如:intintintint 10101010;intintintint *;a0a0a0a0;结论:引用一个数组元素,可以用:结论:引用一个数组元素,可以用:结论:引用一个数组元素,可以用:结论:引用一个数组元素,可以用:(1 1 1 1)下标法,如下标法,如下标法,如下标法,如aiaiaiai 形式;形式;形式;形式;(2 2 2 2)指针法,如指针法,如指针法,如指针法,如*(a+ia+ia+ia+i)或)或)或)或*(p+ip+ip+ip+i)。)。)。)。其中是数组名,是指向数组元素的指其中是数组名,是指向数组元素的指其中是数组名,是指向数组元素的指其中是数
25、组名,是指向数组元素的指针变量,其初值。针变量,其初值。针变量,其初值。针变量,其初值。如果如果如果如果p p p p的初值为的初值为的初值为的初值为&a0&a0&a0&a0,则,则,则,则:p+ip+ip+ip+i和和和和a+ia+ia+ia+i就是就是就是就是aiaiaiai的地址。的地址。的地址。的地址。*(p+ip+ip+ip+i)和和和和*(a+ia+ia+ia+i)就是数组元素就是数组元素就是数组元素就是数组元素aiaiaiai 。是变址运算符。是变址运算符。是变址运算符。是变址运算符。指向数组的指针变量也可以指向数组的指针变量也可以指向数组的指针变量也可以指向数组的指针变量也可以
26、带带带带下标下标下标下标。即:。即:。即:。即:pipipipi 与与与与*(p+ip+ip+ip+i)等价。等价。等价。等价。p pp+1,a+1p+1,a+1p+i,a+ip+i,a+ia9a9p+9,a+9p+9,a+9aiaia2a2a1a1a0a0a a a a数组数组数组数组*(p+i)*(p+i)10.3 10.3 10.3 10.3 数组与指针数组与指针数组与指针数组与指针例例10.5 10.5 输出数组中的全部元素输出数组中的全部元素 设整型数组有设整型数组有1010个元素。输出各元素的值有三种方法:个元素。输出各元素的值有三种方法:10.3.2 10.3.2 通过指针引用数
27、组元素通过指针引用数组元素10.3 10.3 10.3 10.3 数组与指针数组与指针数组与指针数组与指针(1)(1)下标法下标法#include#include void void main main()()intint 1010;intinti i;for(ifor(i=0=0;i10i10;i+)i+)scanfscanf(%d%d,ii););printfprintf(nn););forfor(i=0i=0;i10i10;i+i+)printfprintf(%d%d,ii););10.3.2 10.3.2 通过指针引用数组元素通过指针引用数组元素(2)(2)通过数组名计算数组元素地址,
28、找出元素的值。通过数组名计算数组元素地址,找出元素的值。#include#include voidvoidmainmain()()intint a10;a10;intint ;forfor(i=0i=0;i10i10;i+i+)scanfscanf(,&ii););printfprintf(nn););forfor(i=0i=0;i10i10;i+)i+)printfprintf(,*(a+ia+i)););(3)(3)用指针变量指向数组元素。用指针变量指向数组元素。#include#include void void mainmain()()intint 1010;intint *,;,;f
29、orfor(i=0i=0;i10i10;i+i+)scanfscanf(,&aiai););printfprintf(nn););forfor(p=p=a;pa;p(a+10);p+(a+10);p+)printfprintf(%d%d,*p p););10.3 10.3 10.3 10.3 数组与指针数组与指针数组与指针数组与指针第(第(第(第(1 1 1 1)()()()(2 2 2 2)种方法执行效率同,第()种方法执行效率同,第()种方法执行效率同,第()种方法执行效率同,第(3 3 3 3)中指针变量直接指向元)中指针变量直接指向元)中指针变量直接指向元)中指针变量直接指向元素,不必
30、每次重新计算地址,操作较快。素,不必每次重新计算地址,操作较快。素,不必每次重新计算地址,操作较快。素,不必每次重新计算地址,操作较快。但(但(但(但(2 2 2 2)()()()(3 3 3 3)没有()没有()没有()没有(1 1 1 1)地址法直观。)地址法直观。)地址法直观。)地址法直观。10.3.2 10.3.2 通过指针引用数组元素通过指针引用数组元素10.3 10.3 10.3 10.3 数组与指针数组与指针数组与指针数组与指针使用指针变量指向数组元素时,需要注意:使用指针变量指向数组元素时,需要注意:使用指针变量指向数组元素时,需要注意:使用指针变量指向数组元素时,需要注意:可
31、以通过改变指针变量的值指向不同的数组元素。可以通过改变指针变量的值指向不同的数组元素。但数组名但数组名a+a+是错误的。是错误的。要注意指针变量的当前值。要注意指针变量的当前值。例例10.10.通过指针变量输出数组的通过指针变量输出数组的1010个元素。个元素。有人编写出以下程序,看看是否正确?有人编写出以下程序,看看是否正确?#include#include void mainvoid main()()intint *,i,a10;,i,a10;p=ap=a;forfor(i=0i=0;i10i10;i+i+)scanfscanf(,p+p+););printfprintf(nn););fo
32、rfor(i=0i=0;i10i10;i+,pi+,p+)printfprintf(,*p,*p););程序运行情况:程序运行情况:1 2 3 4 5 6 7 8 9 01 2 3 4 5 6 7 8 9 022153 234 0 0 30036 25202 11631 8259 8237 2848322153 234 0 0 30036 25202 11631 8259 8237 28483显然输出的数值并不是数组中各元素的值显然输出的数值并不是数组中各元素的值 解决办法,在第二个解决办法,在第二个forfor循环之前加一个赋值语句:循环之前加一个赋值语句:;#include#include
33、 void mainvoid main()()intint*,i,a10;,i,a10;p=a p=a;forfor(i=0i=0;i10i10;i+i+)scanfscanf(,p+p+););printfprintf(nn););p=a;p=a;forfor(i=0i=0;i10i10;i+,pi+,p+)printfprintf(,*p,*p););10.3.2 10.3.2 通过指针引用数组元素通过指针引用数组元素10.3 10.3 10.3 10.3 数组与指针数组与指针数组与指针数组与指针使用指针变量指向数组元素时,需要注意:使用指针变量指向数组元素时,需要注意:使用指针变量指向数
34、组元素时,需要注意:使用指针变量指向数组元素时,需要注意:指向数组元素的指针变量,可以指向数组指向数组元素的指针变量,可以指向数组最后一个元素以后的内存单元,虽然没有实最后一个元素以后的内存单元,虽然没有实际意义。际意义。注意指针变量的运算。注意指针变量的运算。1 1)可以进行的算术运算,只有以下几种:)可以进行的算术运算,只有以下几种:pnpn,p+/+pp+/+p,p-/-pp-/-p,p1-p2,p1-p2 pnpn:将指针从当前位置向前(将指针从当前位置向前(+n+n)或回退()或回退(-n-n)n n个个数据单位数据单位,而不是而不是n n个字节。显然,个字节。显然,p+/+pp+/
35、+p和和p-/-pp-/-p是是pnpn的特例(的特例(n=1n=1)。)。p1-p2p1-p2:两指针之间的数据个数,而不是指针的两指针之间的数据个数,而不是指针的地址之差。地址之差。2 2)关系运算)关系运算 表表示示两两个个指指针针所所指指地地址址之之间间、位位置置的的前前后后关关系系:前前者者为为小小,后后者者为大。为大。例例如如,如如果果指指针针p1p1所所指指地地址址在在指指针针p2p2所所指指地地址址之之前前,则则p1p2p1p2的的值值为为1 1(真)。(真)。10.3.2 10.3.2 通过指针引用数组元素通过指针引用数组元素10.3 10.3 10.3 10.3 数组与指针
36、数组与指针数组与指针数组与指针10.3.2 10.3.2 通过指针引用数组元素通过指针引用数组元素10.3 10.3 10.3 10.3 数组与指针数组与指针数组与指针数组与指针注意指针变量的运算。注意指针变量的运算。详细举例:详细举例:)p+p+,作用:使,作用:使p p指向下一个元素。指向下一个元素。)*p+,p+,由于由于*和和+同优先级,右结合,等价于同优先级,右结合,等价于*(p+)(p+)。作用:先得到作用:先得到p p指向的值,后指向的值,后p+p+。)*(p+)(p+)与与*(+p)(+p)不同。不同。)(*p)+(*p)+表示表示p p所指元素的值加所指元素的值加1 1。)如
37、果)如果p p当前指向当前指向a a数组中的第数组中的第i i个元素,则:个元素,则:*(p-)(p-)相当于相当于aiai-*(+p)*(+p)相当于相当于a+ia+i *(-p)*(-p)相当于相当于a-ia-i10.3.310.3.3 用数组名作函数参数用数组名作函数参数10.3 10.3 10.3 10.3 数组与指针数组与指针数组与指针数组与指针f(f(intint arrarr,intint n)n)C C编译时将编译时将arrarr按指针变量处理,相当于将函数按指针变量处理,相当于将函数f f的首部写成的首部写成f(f(intint*arrarr,intint n)n)函数被调用
38、时,系统会建立一个函数被调用时,系统会建立一个指针变量指针变量arrarr来存实参数组传来的来存实参数组传来的地址。地址。sizeof(arrsizeof(arr)用用数数组组名名作作为为函函数数实实参参时时,形形参参本本应应为为指指针针变变量量,为为什什么么允允许许使使用用形参数组的形式?形参数组的形式?因为因为C C中用下标法和指针法都可访问一个数组。许多人愿意用数组名作为中用下标法和指针法都可访问一个数组。许多人愿意用数组名作为形参与实参数组对应。形参与实参数组对应。注意:注意:实参数组名代表一个固定地址实参数组名代表一个固定地址的指针常量,的指针常量,但形参数组不是一个固但形参数组不是
39、一个固定的地址值,而是作为指针变量,在函数的执行期间可以再被赋值。定的地址值,而是作为指针变量,在函数的执行期间可以再被赋值。10.3.310.3.3 用数组名作函数参数用数组名作函数参数10.3 10.3 10.3 10.3 数组与指针数组与指针数组与指针数组与指针例例10.7 10.7 将数组中个整数按相反顺序存放将数组中个整数按相反顺序存放#include#include void void mainmain()()void invvoid inv(intint ,intint );intint ,10=3,7,9,11,0,6,7,5,4,210=3,7,9,11,0,6,7,5,4,
40、2;printfprintf(The original array:The original array:););forfor(i=0i=0;i10i10;i+i+)printfprintf (,aiai););printfprintf(););inv inv(a a,1010););printfprintf(The array has been in The array has been in vertedverted:););forfor(i=0i=0;i10i10;i+i+)printfprintf (,,aiai););printfprintf (););void invvoid in
41、v(intint ,intint )/*/*形参形参x x是数组名是数组名*/intint temp,i,jtemp,i,j,(n-1)/2n-1)/2;forfor(=0=0;=;);)n-1-in-1-i;temptempii;iijj;jjtemptemp;returnreturn;10.3.310.3.3 用数组名作函数参数用数组名作函数参数10.3 10.3 10.3 10.3 数组与指针数组与指针数组与指针数组与指针运行情况如下:运行情况如下:The original arrayThe original array:3 3,7 7,9 9,1111,6 6,7 7,5 5,4 4,
42、2 2,The array has been invertedThe array has been inverted:2 2,4 4,5 5,7 7,6 6,0 0,1111,9 9,7 7,3 3,#include#include void void mainmain()()void invvoid inv(intint ,intint );intint ,10=3,7,9,11,0,6,7,5,4,210=3,7,9,11,0,6,7,5,4,2;printfprintf(The original array:The original array:););forfor(i=0i=0;i10
43、i10;i+i+)printfprintf (,aiai););printfprintf(););inv inv(a a,1010););printfprintf(The array has been in The array has been in vertedverted:););forfor(i=0i=0;i10i10;i+i+)printfprintf (,,aiai););printfprintf (););void invvoid inv(intint*,intint )/*/*形参形参x x为指针变量为指针变量*/intint ,temptemp,*,*,(,(n-1n-1)/2
44、/2;forfor(;(;i+i+,j-j-)temp temp*;*;*temptemp;returnreturn;对例对例10.710.7作改动。形参数组改成指针变量。作改动。形参数组改成指针变量。10.10.3 .3 用数组名作函数参数用数组名作函数参数10.3 10.3 10.3 10.3 数组与指针数组与指针数组与指针数组与指针运行情况如下:运行情况如下:The original arrayThe original array:3 3,7 7,9 9,1111,6 6,7 7,5 5,4 4,2 2,The array has been invertedThe array has b
45、een inverted:2 2,4 4,5 5,7 7,6 6,0 0,1111,9 9,7 7,3 3,归纳起来,如有一个实参数组,想在函数中改变此数组中的元素的归纳起来,如有一个实参数组,想在函数中改变此数组中的元素的值,值,实参与形参的对应关系有以下种情况实参与形参的对应关系有以下种情况:(1)(1)形参和实参都用数组名,如:形参和实参都用数组名,如:void mainvoid main()()void void (intint x,x,intint )intint 1010;(a a,1010););10.10.3 .3 用数组名作函数参数用数组名作函数参数10.3 10.3 10.
46、3 10.3 数组与指针数组与指针数组与指针数组与指针(2)(2)实参用数组名,形参用指针变量。如:实参用数组名,形参用指针变量。如:void mainvoid main()()void void(intint *,intint )intint 1010;f f(a a,1010););(3)(3)实参形参都用指针变量。例如:实参形参都用指针变量。例如:void mainvoid main()()void void(intint*,intint )intint 10,*p=a;10,*p=a;f f(p,10p,10););10.10.3 .3 用数组名作函数参数用数组名作函数参数10.3 1
47、0.3 10.3 10.3 数组与指针数组与指针数组与指针数组与指针(4)(4)实参为指针变量,形参为数组名。如:实参为指针变量,形参为数组名。如:void mainvoid main()()void void f(intf(int x x,intint )intint 10,*p=a10,*p=a;f(p,10);f(p,10);10.10.3 .3 用数组名作函数参数用数组名作函数参数10.3 10.3 10.3 10.3 数组与指针数组与指针数组与指针数组与指针#include#include void mainvoid main()()void invvoid inv(intint*,
48、intint );intint ,arr10arr10,*arrarr;printfprintf(The original array:n The original array:n););forfor(=;1010;i+,pi+,p+)scanfscanf(,);,);printfprintf(nn););arrarr;invinv(,10,10););/*/*实参为指针变量实参为指针变量*/printfprintf(The array has been inverted The array has been inverted:););forfor(arrarr;arrarr1010;p+p+
49、)printfprintf(,*););printfprintf(nn););void invvoid inv(intint*,intint )intint ,temptemp,*,*;(n-1)/2;i(n-1)/2;i;j jx+n-1x+n-1;p p;forfor(;i+,ji+,j-)temp temp*;*;*temptemp;returnreturn;例例10.810.8用实参指针变量改写例用实参指针变量改写例10.710.7 10.10.3 .3 用数组名作函数参数用数组名作函数参数10.3 10.3 10.3 10.3 数组与指针数组与指针数组与指针数组与指针很重要!很重要!
50、如果用指针变量作为实参,必须先使指针变量有确定值,指向一个已确定的单元。用指针变量可以指向一维数组中的元素,也可以指向多维数组用指针变量可以指向一维数组中的元素,也可以指向多维数组中的元素。但多维数组的指针比一维数组的指针要复杂。中的元素。但多维数组的指针比一维数组的指针要复杂。1.1.多维数组元素的地址多维数组元素的地址先回顾一下多维数组的性质先回顾一下多维数组的性质,可以认为二维数组是可以认为二维数组是“数组的数组数组的数组”,例例 :定义定义intint a34 a34=1,3,5,7,9,11,13,15,17,19,21,23=1,3,5,7,9,11,13,15,17,19,21,