第九章指针.ppt
《第九章指针.ppt》由会员分享,可在线阅读,更多相关《第九章指针.ppt(48页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第九章第九章第九章第九章第九章第九章 指针指针指针指针指针指针 10-110-1 指针及其引用指针及其引用10-210-2 指针与函数指针与函数10-310-3 数组与指针数组与指针10-410-4 指针与字符串指针与字符串10-510-5 指针数组指针数组10-610-6 多级指针多级指针10-710-7 应用实例应用实例第九章第九章第九章第九章第九章第九章 指针指针指针指针指针指针intintintint a,b,c;a,b,c;a,b,c;a,b,c;a=1;a=1;a=1;a=1;b=2;b=2;b=2;b=2;c=ac=ac=ac=a +b;+b;+b;+b;一、指针与指针变量一、指
2、针与指针变量程序片段程序片段 20002000200020002002200220022002200420042004200420062006200620062008200820082008a a a ab b b bc c c c1直接将整数直接将整数直接将整数直接将整数 1 1 1 1 存入变量存入变量存入变量存入变量 a a a a 2直接将整数直接将整数直接将整数直接将整数 2 2 2 2 存入变量存入变量存入变量存入变量 b b b b3 直接直接直接直接将变量将变量将变量将变量 a a a a、b b b b 的值的值的值的值取出,相加后存入变量取出,相加后存入变量取出,相加后存入
3、变量取出,相加后存入变量 c c c c 利利用用变变量量名名,直直利利用用变变量量名名,直直接接存存取取变变量量值值的的方方式式接接存存取取变变量量值值的的方方式式称称为为称称为为“直直接接访访问问直直接接访访问问”。第一节第一节 指针与引用指针与引用第九章第九章第九章第九章第九章第九章 指针指针指针指针指针指针 C C 语言提供对内存单元的语言提供对内存单元的语言提供对内存单元的语言提供对内存单元的“间接访问间接访问间接访问间接访问”p_c2000200020002000200220022002200220042004200420042006200620062006200820082008
4、200820102010201020102012201220122012a a a ab b b bc c c c122008a a a a和和和和b b b b相加的结果,相加的结果,相加的结果,相加的结果,*p_cp_cp_cp_c=a a a a+b b b b存存存存放到变量放到变量放到变量放到变量p_cp_cp_cp_c所指出的所指出的所指出的所指出的地址地址地址地址中去。中去。中去。中去。变量的地址称为变量的指针变量的地址称为变量的指针变量的地址称为变量的指针变量的地址称为变量的指针存放地址的变量称为指针变量存放地址的变量称为指针变量存放地址的变量称为指针变量存放地址的变量称为指针
5、变量p_cp_c20082008cp_c=&c3 int int int int a=1,b=2,c,*p_c;a=1,b=2,c,*p_c;a=1,b=2,c,*p_c;a=1,b=2,c,*p_c;p_c=&c;p_c=&c;p_c=&c;p_c=&c;*p_c=a+b;*p_c=a+b;*p_c=a+b;*p_c=a+b;第一节第一节 指针与引用指针与引用第九章第九章第九章第九章第九章第九章 指针指针指针指针指针指针二、指针变量的说明二、指针变量的说明 指针变量说明的格式与一般变量说明的格指针变量说明的格式与一般变量说明的格式一致。式一致。数据类型说明符数据类型说明符 *变量名变量名例:
6、例:int int x=2,y,x=2,y,*pxpx;x x,y y是是一般变量一般变量,pxpx为指针型变量为指针型变量 这里,这里,*的作用就是通知系统,变量的作用就是通知系统,变量pxpx是指是指针变量。针变量。被说明为指针的变量只能保存地址量。被说明为指针的变量只能保存地址量。前例:前例:前例:前例:intintintint a=1,b=2,c,*p_c;a=1,b=2,c,*p_c;a=1,b=2,c,*p_c;a=1,b=2,c,*p_c;p_c=&c;p_c=&c;p_c=&c;p_c=&c;第一节第一节 指针与引用指针与引用第九章第九章第九章第九章第九章第九章 指针指针指针指
7、针指针指针三、指针的引用和运算三、指针的引用和运算C C语言提供一对与地址有关的运算符:语言提供一对与地址有关的运算符:*与与&。例:例:int int x=2,y,x=2,y,*pxpx;pxpx=&x;x;取变量取变量x x的地址赋值给指针的地址赋值给指针pxpx y=*y=*pxpx;y=x;y=x;y=*y=*pxpx*100;*100;y=x*100;y=x*100;*pxpx=10;=10;x=10;x=10;2 2x xffd8ffd8pxpxffdcffdcff9dff9dy yffdaffda2 2 2 22002001010第一节第一节 指针与引用指针与引用第九章第九章第九
8、章第九章第九章第九章 指针指针指针指针指针指针 *运算符的意义运算符的意义在数据类型说明中出现在数据类型说明中出现“*变量名变量名”说明说明*后的变量是一个指针变量。后的变量是一个指针变量。例如前例的:例如前例的:int int x=2,y,*x=2,y,*pxpx;在表达式中出现在表达式中出现“*变量名变量名”说明到说明到*后变量中的地址取出内容参加运算。后变量中的地址取出内容参加运算。例如前例的:例如前例的:y=x*100;y=x*100;赋值号的左值是赋值号的左值是“*变量名变量名”将赋值号的右值送到将赋值号的右值送到*后的变量指示的地址单后的变量指示的地址单元中。元中。例如前例的:例如
9、前例的:*pxpx=10;=10;第一节第一节 指针与引用指针与引用第九章第九章第九章第九章第九章第九章 指针指针指针指针指针指针四、指针变量的初始化四、指针变量的初始化 在在说明指针变量的时候赋初值。说明指针变量的时候赋初值。int int x=2,y,*x=2,y,*pxpx=&x;=&x;用赋值语句为指针变量赋初值。用赋值语句为指针变量赋初值。int int x=2,y,*x=2,y,*pxpx;pxpx=&x;=&x;五、引用指针变量五、引用指针变量第一节第一节 指针与引用指针与引用第九章第九章第九章第九章第九章第九章 指针指针指针指针指针指针main()main()main()mai
10、n()intintintint *p1p1p1p1,*p2p2p2p2,*p p p p,a,b;,a,b;,a,b;,a,b;scanfscanfscanfscanf(“%d%d%d%d%d%d%d%d”,&a,a,a,a,&b);b);b);b);p1p1p1p1=&a;a;a;a;p2p2p2p2=&b;b;b;b;if(ab)if(ab)if(ab)if(ay)return(x);if(xy)return(x);if(xy)return(x);if(xy)return(x);else return(y);else return(y);else return(y);else return
11、(y);main()main()main()main()int int int int maxmaxmaxmax(),a,b,c;(),a,b,c;(),a,b,c;(),a,b,c;intintintint (*p)(*p)(*p)(*p)();p p p p =maxmaxmaxmax;scanfscanfscanfscanf(“%d%d”,&a,&b);(“%d%d”,&a,&b);(“%d%d”,&a,&b);(“%d%d”,&a,&b);c=c=c=c=(*p)(*p)(*p)(*p)(a,b);(a,b);(a,b);(a,b);printfprintfprintfprintf(“
12、max=%d”,c);(“max=%d”,c);(“max=%d”,c);(“max=%d”,c);二、用函数指针变量调用函数二、用函数指针变量调用函数1 1 1 1.函数名是函数的入口地址。函数名是函数的入口地址。函数名是函数的入口地址。函数名是函数的入口地址。用指针变量储存此地址。用指针变量储存此地址。用指针变量储存此地址。用指针变量储存此地址。2 2 2 2.说明指向函数的指针变量:说明指向函数的指针变量:说明指向函数的指针变量:说明指向函数的指针变量:“(*(*(*(*p)p)p)p)”说明说明说明说明p p p p是指针变是指针变是指针变是指针变量,量,量,量,由于优先级的问题,由于
13、优先级的问题,由于优先级的问题,由于优先级的问题,此处此处此处此处()()()()是必须的。是必须的。是必须的。是必须的。“()()()()”指出是指向函数的,指出是指向函数的,指出是指向函数的,指出是指向函数的,“intintintint”说明函数的返回说明函数的返回说明函数的返回说明函数的返回值值值值 是整型的,是整型的,是整型的,是整型的,“intintintint*p();*p();*p();*p();”何意何意何意何意3 3 3 3.用指针变量调用函数。用指针变量调用函数。用指针变量调用函数。用指针变量调用函数。/*/*1*/*/*/*2*/*/*/*3*/*/第二节第二节 指针与函
14、数指针与函数第九章第九章第九章第九章第九章第九章 指针指针指针指针指针指针 指向函数的指针变量可以作为函数的参数指向函数的指针变量可以作为函数的参数,主调函数需要调用不同的函数求解问题。主调函数需要调用不同的函数求解问题。三、用指向函数的指针变量做函数的参数三、用指向函数的指针变量做函数的参数例:梯形法求定积分的函数例:梯形法求定积分的函数例:梯形法求定积分的函数例:梯形法求定积分的函数s=hs=hs=hs=h (f(a)+f(b)/2(f(a)+f(b)/2(f(a)+f(b)/2(f(a)+f(b)/2+f(a+h)f(a+h)f(a+h)f(a+h)+f(a+2h)f(a+2h)f(a+
15、2h)f(a+2h)+f(a+(n-1)h)f(a+(n-1)h)f(a+(n-1)h)f(a+(n-1)h)integral(fintegral(fintegral(fintegral(f,上界上界上界上界a a a a,下界下界下界下界b b b b)求求求求第一项第一项第一项第一项;h=(b-a)/n;h=(b-a)/n;h=(b-a)/n;h=(b-a)/n;for(i=1;in;i+)for(i=1;in;i+)for(i=1;in;i+)for(i=1;in;i+)s=s+s=s+s=s+s=s+f f f f (a+i*h)(a+i*h)(a+i*h)(a+i*h);y y y
16、y =s s s s *h;h;h;h;return(y);return(y);return(y);return(y);如何解决如何解决如何解决如何解决integralintegralintegralintegral函数适用于不同的被积函数适用于不同的被积函数适用于不同的被积函数适用于不同的被积函数?函数?函数?函数?float(*f)(float(*f)(float(*f)(float(*f)(),a,b;a,b;a,b;a,b;被积函数被积函数被积函数被积函数(*f)(*f)(*f)(*f)(a+i*h)(a+i*h)(a+i*h)(a+i*h)通过指向函数的指通过指向函数的指通过指向函数
17、的指通过指向函数的指针变量调用函数针变量调用函数针变量调用函数针变量调用函数第二节第二节 指针与函数指针与函数第九章第九章第九章第九章第九章第九章 指针指针指针指针指针指针 数组元素是内存的一个单元,数组元素是内存的一个单元,故指向数组元素的指针变量的故指向数组元素的指针变量的性质和指向变量的指针变量是性质和指向变量的指针变量是一样的。一样的。例如:例如:intint a10,a10,*p*p;p=&a0;p=&a0;也可以在说明语句对指针赋也可以在说明语句对指针赋初值:初值:例如:例如:intint a10,a10,*p=&a0;p=&a0;一、通过指针引用一维数组的元素一、通过指针引用一维
18、数组的元素a0a0a9a9p p执行语句:执行语句:p=&a1;第三节第三节 数组与指针数组与指针第九章第九章第九章第九章第九章第九章 指针指针指针指针指针指针引用数组元素的方式引用数组元素的方式下标方式下标方式 a3=1;a3=1;下标运算符下标运算符 做两件事:做两件事:1.1.计算元素的地址计算元素的地址 a+2*a+2*该数据类型长度。该数据类型长度。2.2.对计算出的地址赋值或取内容。对计算出的地址赋值或取内容。指针方式指针方式 *(p+3)=1p+3)=1;1.1.小括号内进行地址运算,小括号内进行地址运算,2.2.*运算实现赋值或取内容。运算实现赋值或取内容。第三节第三节 数组与
19、指针数组与指针第九章第九章第九章第九章第九章第九章 指针指针指针指针指针指针数组名数组名数组名数组名是地址,指向数组的是地址,指向数组的是地址,指向数组的是地址,指向数组的指针变量指针变量指针变量指针变量是地址。通过指是地址。通过指是地址。通过指是地址。通过指针变量也可以引用数组元素。针变量也可以引用数组元素。针变量也可以引用数组元素。针变量也可以引用数组元素。p p p p =&a0&a0&a0&a0 等效于等效于等效于等效于 p p p p =a a a a。二、数组名和指向数组的指针变量二、数组名和指向数组的指针变量p+1p+1a0a0a9a9p pa1a1 .1 12 23 34 45
20、 56 67 78 89 91010p+2p+2p+3p+3p+4p+4p+5p+5.p+9p+9for(i=0;i10;i+)for(i=0;i10;i+)printfprintf(“%dn%dn”,aiai););for(i=0;i10;i+)for(i=0;i10;i+)printfprintf(“%dn%dn”,*(p+ip+i););=a aa+1a+1a+2a+2a+3a+3a+4a+4a+5a+5.a+9a+9p0p0p1p1p2p2p3p3p4p4p5p5.p9p9for(i=0;i10;i+)for(i=0;i10;i+)printfprintf(“%dn%dn”,*,*(a
21、+ia+i););for(i=0;i10;i+)for(i=0;i10;i+)printfprintf(“%dn%dn”,pipi););=数组名数组名数组名数组名和指向数组的和指向数组的和指向数组的和指向数组的指针变量指针变量指针变量指针变量的区别:的区别:的区别:的区别:指针变量指针变量指针变量指针变量p p p p是是是是变量变量变量变量可以赋值可以赋值可以赋值可以赋值,数组名数组名数组名数组名a a a a是地址是地址是地址是地址常量常量常量常量不能赋值。不能赋值。不能赋值。不能赋值。第三节第三节 数组与指针数组与指针第九章第九章第九章第九章第九章第九章 指针指针指针指针指针指针例例:
22、main(main()int int a a=1,2,3,4,5,6=1,2,3,4,5,6 ;int int*p p;p p =a a;printfprintf(“%d d”,*p p););printfprintf(“%dndn”,*(+p+p ););printfprintf(“%d d”,*+p+p););printfprintf(“%dndn”,*(p-p-););p p +=3;3;printfprintf(“%d%dn%d%dn”,*p p,*(a a +3 3 ););a0a0a1a1a2a2a3a3a4a4a5a5p p1 12 23 34 45 56 6123354例例例例
23、C10C10C10C10_301_301_301_301第三节第三节 数组与指针数组与指针第九章第九章第九章第九章第九章第九章 指针指针指针指针指针指针多维数组名多维数组名的性质的性质 多维数组名是数组的多维数组名是数组的首地址首地址。例如:例如:i intnt a a3344;数组数组名名a a在程序中是数组的首地址。在程序中是数组的首地址。那么,那么,a a00、a a11、a a22 呢?呢?也是地址量。也是地址量。把二维数组名,可把二维数组名,可理解理解成下面的图。成下面的图。四、指向多维数组的指针变量四、指向多维数组的指针变量a a00a a11a a22a aa a0000a a1
24、010a a2020a a0101a a1111a a2121a a0202a a1212a a2222a a0303a a1313a a2323a a第三节第三节 数组与指针数组与指针第九章第九章第九章第九章第九章第九章 指针指针指针指针指针指针?a a a a 、a a a a0000 是是是是 a a a a00000000的地址,是第一行的首地址。的地址,是第一行的首地址。的地址,是第一行的首地址。的地址,是第一行的首地址。a a0000a a1010a a2020a a0101a a1111a a2121a a0202a a1212a a2222a a0303a a1313a a23
25、23a a00a a11a a22a aa+1a+1a+1a+1、a a a a1111是是是是 a a a a11110000的地址,是第二行的首地址。的地址,是第二行的首地址。的地址,是第二行的首地址。的地址,是第二行的首地址。*a a a a是是是是a a a a0000的的的的内容内容内容内容,*a a a a 是是是是 a a a a00000000。a a a a 是是是是二二二二维数组,经过维数组,经过维数组,经过维数组,经过两两两两次次次次操作,才能访问到数组元素。操作,才能访问到数组元素。操作,才能访问到数组元素。操作,才能访问到数组元素。所以根据所以根据所以根据所以根据C
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第九 指针
限制150内