




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、会计学1第第 指针指针(zhzhn)引用和链表引用和链表第一页,共153页。 内存中的一个内存中的一个(y )字节为一个字节为一个(y )存储单元(存储单元( Byte)。)。 存储单元的编号称为地址。存储单元的编号称为地址。 变量的地址是指该变量所在存储区域的第一个变量的地址是指该变量所在存储区域的第一个(y ) 字节(单元)的地址。字节(单元)的地址。9.1 指针指针(zhzhn)和指针和指针(zhzhn)变量变量 9.1.1 指针指针(zhzhn)的概念的概念例:例:int a; float b; char c; 10401044c( char )b( float )1048a( int
2、 )这三个地址这三个地址(dzh)(dzh)就就称为变量称为变量a a、b b、c c的指的指针。针。 第1页/共152页第二页,共153页。指针也是一个数值,C+提供了一种类型(lixng)的变量用于存放地址值,即存放指针,这种变量就是指针变量。 9.1.2 指针(zhzhn)变量的定义指针变量(binling)的定义格式:类型说明符 *指针变量(binling)名;例:例:int *pi ; 定义定义 pi 为为指向指向 int 类类型变量型变量的指针变量的指针变量 float *pf ; 定义定义 pf 为为指向指向 float 类型变量类型变量的指针变量的指针变量int * 为为int
3、型指针类型标识符型指针类型标识符。float * 为为float型指针类型标识符。型指针类型标识符。第2页/共152页第三页,共153页。几点说明:几点说明: 一个指针变量一个指针变量(binling)只能指向同一数据类型的变量只能指向同一数据类型的变量(binling),该,该 数据类型是在定义指针变量数据类型是在定义指针变量(binling)时明确给定的。时明确给定的。 C+语言规定有效数据的指针不指向语言规定有效数据的指针不指向0单元单元(为非为非0值值), 如果指针变量如果指针变量(binling)值为值为0,即,即NULL(在在ios.h中已定义中已定义), 表示空指针,即不指向任何
4、变量表示空指针,即不指向任何变量(binling)。不要把地址值与整数类型值相混淆。不要把地址值与整数类型值相混淆。 例如:地址例如:地址2000与整型量与整型量2000是两个不同的概念。是两个不同的概念。 第3页/共152页第四页,共153页。1、& 取地址取地址(dzh)运算运算 功能:返回变量的内存地址功能:返回变量的内存地址(dzh) 例例9.1 int *p ,m ; /定义定义 p 为指向为指向 int 类型变量的指针类型变量的指针 m=200 ; p=&m ; /将整型变量将整型变量 m 的地址的地址(dzh)值赋给指针变量值赋给指针变量 p9.1.3 有关(yu
5、gun)指针的运算符 & 和 * 其意义其意义(yy)见下一页见下一页!第4页/共152页第五页,共153页。10401040m( int )2000p( int * )200假定变量假定变量(binling)m 的地址是的地址是1040第5页/共152页第六页,共153页。2002、* 间接存取运算间接存取运算 功能功能(gngnng):访问指针指向的变量:访问指针指向的变量例例9.2 int *p , m=200 , n ; p=&m ; p 指向整型变量指向整型变量 m。 n=*p ; 将将p指向的值指向的值(即即m的值的值)赋给赋给 n。 *p=100 ; 将将 100
6、 赋给指针变量赋给指针变量 p 所指向的变量所指向的变量 mpm&m100执行语句执行语句*p=100;n200执行语句执行语句n=*p;通过通过p间接访问间接访问m第6页/共152页第七页,共153页。9.1.4 指针变量的初始化指针变量的初始化 初始化格式初始化格式(g shi):类型说明符:类型说明符 *指针变量名指针变量名=初初始地址值始地址值 ;例:例:char c, *p1 ; p1=&c ; /* 赋值语句,定义后进行赋值语句,定义后进行 */例:例: char c ; char *pc=&c ;/* 指针初始化,定义时进行指针初始化,定义时进行 */两种
7、方式(fngsh)等效第7页/共152页第八页,共153页。9.1.5 直接访问直接访问(fngwn)和间接访问和间接访问(fngwn)在C+中定义的所有(suyu)变量,编译器都会记录它们的属性,便于以后对它们的访问,如在例9.1中定义的两个变量m和p,编译器记录的属性如下表: 表9-1 变量(binling)及其属性 变量名变量名变量类型变量类型 变量地址变量地址 m int1040pint *2000第8页/共152页第九页,共153页。1. 直接存取方式(直接访问(fngwn)) 按变量地址存取变量值的方式称为直接存取方式, 在程序中体现为直接使用变量名来存取变量值2. 间接(jin
8、ji)存取方式(间接(jin ji)访问)如果变量如果变量 p 存放着变量存放着变量 m 的地址,那么的地址,那么,对变量对变量 m 的访问可以首先访问变量的访问可以首先访问变量 p,取得,取得变量变量 m 的地址,然后按该地址进行对的地址,然后按该地址进行对 m 的存取的存取操作操作(cozu), 称为间接存取方式。称为间接存取方式。在程序中体现为通过在程序中体现为通过 p 来存取变量来存取变量 m 的值。的值。例:例:m=5,n=m 直接存取直接存取 m*p=5,n=*p 间接存取间接存取 mp1040m104020005间接存取的前提是什么?第9页/共152页第十页,共153页。总结:总
9、结:&m - 获得变量获得变量 m 的地址。的地址。 *p - 为指针变量为指针变量 p 所指向所指向(zh xin)的内容。的内容。记住:记住:已知已知 int *p , m ; p = &m ; 则则 p &m 等价等价 *p m第10页/共152页第十一页,共153页。例例9.3 变量的直接访问变量的直接访问(fngwn)和间接访问和间接访问(fngwn) #include void main( ) char c=A ; char *cp=&c ; cout c *cp endl; c=B ; cout c *cp endl; *cp=a ; cout c
10、 *cp endl; 输出输出(shch):?:? AA BB aa第11页/共152页第十二页,共153页。例例9.4 变量的直接变量的直接(zhji)访问和间接访问访问和间接访问 int a=1; float b=5.2; char c=A; int *p1; float *p2; char *p3;p1=&a; p2=&b; p3=&c;cout a , b , c endl; cout *p1 , *p2 , *p3 endl; 运行运行(ynxng)结果:?结果:?1, 5.2, A1, 5.2, A续:续:*p1=*p1+1; *p2=*p2+2; *p3=
11、*p3+3; cout a , b , c endl;运行运行(ynxng)结果:?结果:?2, 7.2, D第12页/共152页第十三页,共153页。关于关于(guny)指针使用的几点说明:指针使用的几点说明:指针变量必须通过初始化或赋值获得值后指针变量必须通过初始化或赋值获得值后(即必须明确指向某一变量),才可以利用它(即必须明确指向某一变量),才可以利用它进行间接访问。进行间接访问。若有若有 int m ; int *p = &m ; 划线部分的意义是将划线部分的意义是将m的地址赋给的地址赋给p, 而不是将而不是将m的地址赋给的地址赋给p指向的空间。指向的空间。 上述两个语句的意
12、义等价于上述两个语句的意义等价于: int m ; int *p ; p = &m ; 注意指针变量的指向类型,只有相同类型数注意指针变量的指向类型,只有相同类型数据变量的地址才能赋给该指针变量。即整型变据变量的地址才能赋给该指针变量。即整型变量的地址只能赋给整型指针。如在例量的地址只能赋给整型指针。如在例9.4中,若中,若出现出现 p1 = &b ; 是无意义的。是无意义的。 第13页/共152页第十四页,共153页。关于指针使用的几点说明关于指针使用的几点说明(shumng)(续):(续):同类型指针变量之间可以相互赋值,不同类型的指针变同类型指针变量之间可以相互赋值,不同
13、类型的指针变量一般不能相互赋值,如在例量一般不能相互赋值,如在例9.4中,若出现中,若出现 p1 = p2 ; 是是无意义的。无意义的。 允许将一个整型常数经强制类型转换后赋给指针变量,允许将一个整型常数经强制类型转换后赋给指针变量,如:如: float *fpp ; fpp = (float *)5000 ; 其意义:将其意义:将5000作为一个地址值赋给指针变量作为一个地址值赋给指针变量fpp 。第14页/共152页第十五页,共153页。例例9.5 交换两个交换两个(lin )指针的指向指针的指向p1x10p2y20p1x10p2y20t目标目标int x=10, y=20;int *p1
14、=&x, *p2 =&y, *t;建立初始状态建立初始状态cout *p1 t *p2 endl;t=p1; p1=p2; p2=t;cout *p1 t *p2 endl;输出结果?输出结果?10 2020 10t第15页/共152页第十六页,共153页。例例9.6 通过指针通过指针(zhzhn),交换两个指针交换两个指针(zhzhn)所指向的变量所指向的变量的值的值p1x10p2y20t目标目标int x=10, y=20,t;int *p1 =&x, *p2 =&y;建立初始状态建立初始状态输出结果?输出结果?10 2020 10p1x20p2y10t10
15、cout x , y endl;t=*p1;*p1=*p2; *p2=t;cout x , y endl;第16页/共152页第十七页,共153页。9.1.6 地址地址(dzh)值的输值的输出出 例例9.7 #include void main(void) int a, *p1; float b, *p2; double d, *p3; p1=&a; p2=&b; p3=&d; cout p1= p1 endl; cout p2= p2 endl; cout p3= p3 第17页/共152页第十八页,共153页。 地址地址(dzh)值的输出值的输出(输出十进制地址输出
16、十进制地址(dzh)值值) 例:例:#include void main( ) int a, *p1; float b, *p2; double d, *p3; p1=&a; p2=&b; p3=&d; cout p1= ( int ) p1 endl; cout p2= ( int ) p2 endl; cout p3= int ( p3 ) endl; 输出输出(shch)结果:结果:p1=6684148 p2=6684140 p3=6684132亦可亦可第18页/共152页第十九页,共153页。 指针使用的常见错误指针使用的常见错误 1、使用未初始化的指针变量、使
17、用未初始化的指针变量(binling) void main( ) int x,*p ; x=0 ;*p=x ; . 2、指针变量、指针变量(binling)所指向的数据类型与其定义的类型所指向的数据类型与其定义的类型不符不符 void main( ) float x,y ; int *p ; p=&x ; y=*p ; . 第19页/共152页第二十页,共153页。#include /复习void main( ) int x=10, y ; int *p1=&x ,*p2 ; /指针的定义(dngy)及初始化 p2=&y ; /指针的赋值 *p2 = *p1 + 5 ;
18、 /通过指针间接存取变量 cout *p2 endl;第20页/共152页第二十一页,共153页。撤消撤消例例9.8 基本基本(jbn)类型量作函数类型量作函数参数参数 #include void swap(int x,int y) int t; t=x; x=y; y=t; void main( ) int x=3, y=9; swap(x,y); cout x , yendl; 输出?输出?3x9y实参实参3x9y形参形参传值调用传值调用t933t局部动态局部动态(dngti)变量变量3,9main( )工作工作(gngzu)区区swap1( )工作区工作区9.2 指针作函数参数指针作函数
19、参数9.2.1基本类型量作函数参数基本类型量作函数参数 实参x、y 和形参 x、y是不同的变量,占据不同的存储空间。参数传递时:int x=x,int y=y;第21页/共152页第二十二页,共153页。3x9y撤消撤消例例9.9指针指针(zhzhn)作函数参数作函数参数 #include void swap(int *px,int *py) int t; t=*px;*px=*py;*py=t; void main( ) int x=3,y=9,*p1,*p2; p1=&x; p2=&y; swap(p1,p2); cout x , y1) /* n 是最大公约数是最大公约数
20、*/ *num=*num/n ; *den=*den/n ; /*直接直接(zhji)对主调函数中的实参进行间接访问操作对主调函数中的实参进行间接访问操作*/ 第23页/共152页第二十四页,共153页。例:约简分数例:约简分数(fnsh)(续)(续)#include void main(void) int a=14,b=21; cout “分数分数(fnsh):”; cout a / b endl; cout “约减后:约减后:”; lowterm(&a,&b); cout a / b endl; 输出输出(shch):分数:分数:14/21 约减后:约减后:2/3第24页/
21、共152页第二十五页,共153页。假定:假定: b = = 1000, 且两个且两个(lin )数组连续存放数组连续存放则:则:a = = ?9.3 指针指针(zhzhn)和指向数组的指针和指向数组的指针(zhzhn)9.3.1 一维数组与指针一维数组与指针(zhzhn) 1.数组名数组名- 数组元素在内存数组元素在内存(ni cn)中连续存放,中连续存放, 数组名是该存储区的起始地址,数组名是该存储区的起始地址, 是地址常量。是地址常量。例:例:int a10; float b10; a 是是 a0 元素的起始地址。元素的起始地址。 b 是是 b0 元素的起始地址。元素的起始地址。1040b
22、0b1b2.内存内存.baa0a1a2第25页/共152页第二十六页,共153页。2.指向指向(zh xin)一维数组元素的指针变量一维数组元素的指针变量例:例:int a10; / 假定假定a的值为的值为1040 int *p; / p是指向整型变量是指向整型变量(binling)的指针的指针, a数组的元素为整型变量数组的元素为整型变量(binling), 那么那么 p 可以指向可以指向 a 数组的任意元素。数组的任意元素。p=a;/ 结果结果(ji gu) p=1040,p 指向指向a0p+;/ 结果结果 p=1044p+;/ 结果结果 p=1048p- -;/ 结果结果 p2=1044
23、向下移动一个元素的位置向下移动一个元素的位置若若 p = &a6; 则则 *p 访问访问a6第26页/共152页第二十七页,共153页。3.指针指针(zhzhn)可进行的运算(一般为加、减、比较运算)可进行的运算(一般为加、减、比较运算)(1)指针数值指针数值(shz) (2)指针指针-指针指针 (3)指针指针 比较比较 指针指针(1)指针数值指针数值 运算运算(yn sun)的意义的意义如果:如果:p 是指针,是指针,n 是数值是数值 则:则:pn 表示表示 p 向后向后/向前移动向前移动 n 个元素位置。个元素位置。 即:结果即:结果 p 的值的值n*c若若 p 是是 int 型指
24、针,则型指针,则 c 等于等于 4若若 p 是是 char 型指针,则型指针,则 c 等于等于 1若若 p 是是 float 型指针,则型指针,则 c 等于等于 4 .第27页/共152页第二十八页,共153页。例9.11 用指针间接访问(fngwn)数组元素 #include void main(void) int a10=1, 2, 3, 4, 5, 6, 7, 8, 9, 10 , *p = a ; int sum=0, i ; for( i=0; i10; i+) sum = sum + *(p+i); / *(p+i)piai for( i=0; i10; i+, p+) / 指针变
25、量可进行自加、自减运算 cout *p; cout sum= sum endl;第28页/共152页第二十九页,共153页。 指向指向(zh xin)相同数据类型的指针变量可以相减,其结果相同数据类型的指针变量可以相减,其结果 为两指针所指向为两指针所指向(zh xin)地址之间数据的个数。地址之间数据的个数。例:例:int *px ,*py ,n ,a5 ; px=&a1;py=&a4; n=py-px ; 3个数组元素个数组元素pxpya1a4(2)指针指针 - 指针指针 运算运算(yn sun)的意义的意义结果结果(ji gu):n 值为值为3第29页/共152页第三十页
26、,共153页。 = != = (3)指针指针(zhzhn) 比较比较 指针指针(zhzhn)指针的关系运算指针的关系运算(yn sun)是两个指针所指向的地是两个指针所指向的地址之间的址之间的比较运算比较运算(yn sun),产生的结果为,产生的结果为 0(假)和(假)和 1(真)。(真)。第30页/共152页第三十一页,共153页。例:有定义例:有定义(dngy):double a5,*p1,*p2 ; p1,p2 的指向如图所示。的指向如图所示。 p1=NULL 判断判断p1是否为空指针是否为空指针(zhzhn)?(NULL是系统定义的是系统定义的) 结果:结果:0aa0a1a2a3a4p
27、1p2计算:计算: p1=p2 判断判断(pndun)p1,p2是否指向同一变量?是否指向同一变量? 结果:结果:0 p1p2 判断判断p1的地址是否比的地址是否比p2的地址小?的地址小? 结果:结果:1 p1!=0 判断判断 p1 是否是否不为不为空指针?空指针? 结果:结果:1第31页/共152页第三十二页,共153页。例9.12 改写例9.11,注意指针的比较(bjio)运算。 #include void main(void) int a10=1, 2, 3, 4, 5, 6, 7, 8, 9, 10 , *p ; int sum=0 ; for(p = a ; p a+10; p+)
28、sum = sum + *p ; for(p = a ; p a+10; p+) / 需重新给 p 赋初值 cout *p; cout sum= sum endl;第32页/共152页第三十三页,共153页。以上以上(yshng)定义等价于:定义等价于: int a10,*p; p=a ; a,a0a1.a9p例:int a10,*p ; p=&a0; int a10; int *p=&a0; int a10; int *p=a ;a &a04. 如何如何(rh)获取数组任一元素的地址、任一数组元素的值获取数组任一元素的地址、任一数组元素的值 a 是 int * 类型(
29、lixng)的指针。 第33页/共152页第三十四页,共153页。第第i个元素地址的表示个元素地址的表示(p的初值为的初值为a) : a+i 数组名法数组名法 p+i 指针法指针法 &ai 下标法下标法 &pi 下标法下标法第第i个元素值的表示个元素值的表示(p的初值为的初值为a) : *(a+i) 数组名法数组名法 *(p+i) 指针法指针法 ai 下标法下标法 pi 下标法下标法a9a0a1.a,p.aii个元素个元素通过指针变量和数组名访问元素的重要通过指针变量和数组名访问元素的重要(zhngyo)区别区别:1.指针变量是地址变量,其指向由所赋值确定。指针变量是地址变量,
30、其指向由所赋值确定。2.数组名是地址常量(指针常量),恒定指向数组名是地址常量(指针常量),恒定指向 数组的第数组的第1个元素。个元素。p=a; p+ ; 正确(zhngqu)a=p+2; a+ ;错误a+i第34页/共152页第三十五页,共153页。例9.12 P179 数组元素逆向(n xin)存放#include void main(void) int a10=1, 2, 3, 4, 5, 6, 7, 8, 9, 10, t ; int *p1=a, *p2=a+9 ; while(p1p2) t = *p1; *p1 = *p2; *p2=t; p1+ ; p2 - - ; for(p
31、1 = a; p1 a+10; p1+) cout *p1 t ; cout endl ;第35页/共152页第三十六页,共153页。void reverse(int b , int n) int i, j, t; i=0; j=n-1; while(ij) t=bi; bi=bj; bj=t; i+; j- -; void main(void) int a10=1,2,3,4,5,6,7,8,9,10, i; reverse(a, 10); for(i=0; i10; i+) cout ai t ; cout endl ;图9.3.2一维数组元素一维数组元素(yun s)指针作函数参数指针作
32、函数参数 在被调函数中数组元素(yun s)的值被改变后,自动带回主函数,不需要return语句返回。注意:实参a是一个指针。第36页/共152页第三十七页,共153页。实参实参 amain( ) 函数存储函数存储(cn ch)区内容区内容程序(chngx) a0 a1 a2 . a8 a9 . 例9.14将数组元素逆向(n xin)存放。(续)*(b+0) *(b+1) *(b+2) . *(b+8) *(b+9) b0 b1 b2 . b8 b9b+;areverse( ) 函数存储区内容函数存储区内容传值调用传值调用b在 reverse( ) 函数中,将 b 处理成一个 int 型指针,
33、(相当于:int *b)通过指针 b 访问 a 数组中内容。被调函数中参数的指针,相当于一只手被调函数中参数的指针,相当于一只手第37页/共152页第三十八页,共153页。void reverse(int b , int n) / b是一个是一个(y )指针变指针变量量 int i, j, t; i=0; j=n-1; while(ij) t=*(b+i); *(b+i)=*(b+j); *(b+j)=t; i+; j- -; / 原原 t=bi; bi=bj; bj=t; void main(void) int a10=1,2,3,4,5,6,7,8,9,10, i; reverse(a,
34、10); for(i=0; i10; i+) cout ai t ; cout endl ;通过指针 b 访问 a 数组元素。第38页/共152页第三十九页,共153页。 一维数组名作函数参数一维数组名作函数参数实参和形参的各种实参和形参的各种( zhn)写法写法void f( int b , int n ) . bi /或或 *( b+i ) void main(void) int a10, *p; p=a; f( a , 10 ); 形参可以写成 int *b 或 int b10 或 int b 实参可以写 a 或 p 或 &a0 b 是一个局部指针变量,通过它可以访问它所指向的a
35、 数组的元素。第39页/共152页第四十页,共153页。例例9.15分别分别(fnbi)求数组前十个元素和后十个元素之和求数组前十个元素和后十个元素之和 int fsum(int *array,int n) int i,s=0; for(i=0;in;i+) s+=(*array+) ; return(s); void main(void) int a15= 1,2,3 14,15 ; int shead, stail; shead=fsum(a,10); / 第第 1 次调用次调用(dioyng) stail=fsum(&a5,10); / 第第 2 次调用次调用(dioyng) c
36、out shead , stail endl; a, array第第1次调用次调用&a5, array第第2次调用次调用第40页/共152页第四十一页,共153页。例9.16 求出数组最大元素值和最小元素值void max_min_value (int *array, int n, int *maxp, int *minp) / maxp指向主函数(hnsh)max变量,minp指向主函数(hnsh)min变量 int *p, *array_end; array_end = array + n ; *maxp=*minp=*array; for(p=array+1; p *maxp )
37、 *maxp=*p; else if( *p*minp ) *minp=*p; 第41页/共152页第四十二页,共153页。例9. 16 续void main(void) int i, number10, *p = number, max, min; for(i=0; i *( p+i ) ; / 输入(shr)数组元素值 max_min_value( p, 10, &max, &min ); for(i=0; i10; i+) cout *( p+i ) t ; / 输出数组元素值 cout max value = max min value = min str; /不可输入
38、不可输入(shr)带空格字符串带空格字符串 cin.getline(str,80);/可输入可输入(shr)带空格字符带空格字符串串 cout str; 字符数组赋值:字符数组赋值:strcpy(str, “ABCD”);访问第访问第i个字符个字符 stri, 或或 *(str+i)第第i个字符的地址个字符的地址 &stri, 或或 str+iHello0!str9.3.3 指针(zhzhn)和字符串第43页/共152页第四十四页,共153页。将字符串将字符串“Hello!”的首地址赋给指针的首地址赋给指针变量变量strp。(2) 定义定义(dngy)一个字符指针并令其指向一个字符串一
39、个字符指针并令其指向一个字符串 char *strp=“Hello!” ; “Hello!”的值是该字符串的首地址的值是该字符串的首地址(dzh)(3) 字符数组名字符数组名(str)与字符指针(与字符指针(strp)的区别)的区别(qbi): char str10, *strp; str - 指针常量,不论是否对字符数组赋值,指针常量,不论是否对字符数组赋值, 数组空间已分配,数组空间已分配,str的指向明确。的指向明确。 strp - 指针变量,若不赋初值,则其指向不确定。指针变量,若不赋初值,则其指向不确定。输出字符串:输出字符串:cout strp ;等价于:char *strp ;
40、strp=“Hello!”; 第44页/共152页第四十五页,共153页。 赋值:赋值: char str10, *strp; strcpy(str, “ABC”); str的指向的指向(zh xin)不变,改变的是存储单元不变,改变的是存储单元的内容。的内容。strp=“Hello!”; 将将 strp 指向指向(zh xin)字符串常量字符串常量“Hello!”。strp=str; 将将 strp 指向指向(zh xin)字符串数组字符串数组str。 使用字符串指针使用字符串指针(zhzhn)易犯的错误:易犯的错误:(1) char str10; str=“Hello!”; str是指针是
41、指针(zhzhn)常量,不能给常量赋值。常量,不能给常量赋值。(2) char str10; str =“Hello!”; 不能用赋值语句不能用赋值语句(yj)给数组整体赋值。给数组整体赋值。第45页/共152页第四十六页,共153页。解解1:用字符数组实现:用字符数组实现#include #include void main( ) char a20=“ABCD”, b10=“EFG”; int i, j; i = strlen(a); / i是字符串是字符串a 结尾结尾(jiwi)0的下标的下标 for(j=0; bj!=0; i+,j+) ai=bj; ai=0; cout a endl
42、;例例9.18将字符串将字符串b 的内容的内容(nirng)追加到字符串追加到字符串a 尾部。尾部。输出输出(shch):ABCDEFG可改为:可改为:for(i=0; ai!=0; i+);第46页/共152页第四十七页,共153页。解解2:用字符:用字符(z f)指针实现指针实现#include void main( ) char a20=“ABCD”, b10=“EFG”; char *pa=a, *pb=b; /pa指向指向a ,pb指向指向b while(*pa!=0) pa+;/循环结束后循环结束后,pa指向指向a尾部的尾部的0 while(*pb!=0) *pa=*pb; pa+
43、; pb+; *pa=0; pa=a; cout pa endl ;第47页/共152页第四十八页,共153页。2.字符串指针字符串指针(zhzhn)作函数参数作函数参数例例9.19 int my_strlen(char *s) / 自定义函数自定义函数 int n ; for(n=0 ;*s!=0 ;s+) n+ ; return(n); void main( ) char str =“Hello!” ; cout *str t; cout my_strlen(str) t; cout *str 0 ? 1 : -1; void main( ) char s1 =“Hello!”; char
44、 *s2=“Hello!”; cout my_strcmp(s1, s2) t; cout my_strcmp(“Hi”, s2) ai 所以访问元素所以访问元素aij,也可写成,也可写成 *(*(a+i)+j )a0a1a2a+0a+1a+2a00 a01 a02 a03a10 a11 a12 a13a20 a21 a22 a23第53页/共152页第五十四页,共153页。(2)二维数组中元素二维数组中元素(yun s)aij地址的表示:地址的表示: &aij ai+j *(a+i)+j(3)二维数组中二维数组中元素值元素值的的 引用方法:引用方法: aij *(ai+j) *(*(
45、a+i)+j) (*(a+i)jaa0a+1a+2a0+1 a0+2 a0+3i行行j列列第54页/共152页第五十五页,共153页。例9.22 以下程序(chngx)输入二维数组的值, 并求出二维数组的全体元素之和。 #include void main( ) int a34; int sum=0, i, j; for(i=0; i3; i+) for(j=0; j *(ai+j); /注意二维数组元素的访问方法 for(i=0; i3; i+) for(j=0; j4; j+) sum += *(*(a+i)+j); /B cout sum i j; /输入行标、列下标输入行标、列下标 c
46、out a i j = *(*(p+i)+j) endl; 可等价地写成:可等价地写成: aij pij*(*( a + i )+j )等等第58页/共152页第五十九页,共153页。例例9.24 求二维数组全体求二维数组全体(qunt)元素之和元素之和int total(int(*p)4, int n) /n 行数行数 int i,j, sum=0; for( i=0 ;in;i+) for( j=0 ;j4;j+) sum += *(*(p+i)+j) ; return sum;void main(void) int a34,sum,i,j ; for(i=0;i3;i+) for(j=0
47、; j *(ai+j); sum = total( a, 3 ); cout sum endl;二维数组作参数3. 二维数组名作函数参数第59页/共152页第六十页,共153页。例例9.24 改写改写(gixi) total( )函数函数int total(int(*p)4,int n) /n 行数行数 int i, j, sum=0 ; for( i=0; in; i+, p+ ) for( j=0; j4; j+) sum += *( *p + j ) ; return sum;第60页/共152页第六十一页,共153页。形参二维数组名的三种形参二维数组名的三种(sn zhn)写法写法vo
48、id f( int b34 ) . *(*(b+i)+j) bij void main( ) int a34; f(a); 等价地写成: int b 4 或:int (*b)4在被调函数中b是一个行指针变量,访问元素可用指针形式或下标形式。第61页/共152页第六十二页,共153页。4、将二维数组看成一维数组访问、将二维数组看成一维数组访问(fngwn)(1) 通过元素指针访问通过元素指针访问(fngwn)二维数组元素二维数组元素例例9.25 输出二维数组全体元素的值。输出二维数组全体元素的值。void main(void) int a34=.; int *p ; for(p=a0;pa0+1
49、2;p+) if(p-a0)%4=0) cout endl ; cout setw(4) *p ; cout endl ; 注意数据类型的一致,不能写为p=a;元素指针p的移动范围 注意指针相减运算的含义p第62页/共152页第六十三页,共153页。例例9.26 编写通用编写通用(tngyng)二维数组输出函数。二维数组输出函数。void print(int *p, int row, int col)int i;for(i=0; irow*col; i+, p+)if(i%col=0) coutn;coutsetw(4) *p;cout i j; cout a i j = *(p+i*4+j)
50、 endl; 第66页/共152页第六十七页,共153页。 9.3.5 获得获得(hud)函数处理结果的几种方法函数处理结果的几种方法 1、利用、利用return语句返回值语句返回值 (只能返回一个值只能返回一个值) 例:例:int min(int a, int b) return(ab)?a:b ; min=(ab)?a:b ; void main( ) fun(5, 8); coutmax,minb)?a:b ; *pmin=(aab; fun(a, b, &max, &min); cout“max=” max endl; cout“min=” min endl; 第68页
51、/共152页第六十九页,共153页。(2)数组名作参数)数组名作参数数组名作参数时,传递的是数组首地址,数组名作参数时,传递的是数组首地址,在被调函数中可以通过首指针访问数组元素,在被调函数中可以通过首指针访问数组元素,本质上与普通变量指针作参数是一样的。回顾本质上与普通变量指针作参数是一样的。回顾(hug)例例9.14 void reverse( int b , int n ) 等价于等价于 int *b, int n int t; int *p2 = b+n-1; 下页图下页图 while(b p2) t = *b; *b = *p2; *p2=t; b+; p2- ; void main
52、(void) int a10=1,2,3,4,5,6,7,8,9,10, i; reverse(a, 10); for(i=0; i10; i+) cout ai t ; cout b)?a:b ; mi=(a a b; fun(a, b, max, min); cout“max=” max endl; cout“min=” min endl; 形参变量是实参的别名,形参变量是实参的别名,使用起来使用起来(q li)较方便、直观。较方便、直观。第71页/共152页第七十二页,共153页。9.4 指针指针(zhzhn)数组数组数组元素数组元素(yun s) 的值为:的值为:整数整数 - 整型数组
53、整型数组实数实数 - 实型数组实型数组字符字符 - 字符型数组字符型数组指针指针 - 指针数组指针数组整型指针数组整型指针数组实型指针数组实型指针数组字符型指针数组字符型指针数组数组元素数组元素(yun s)值为指针的数组称为指针数组值为指针的数组称为指针数组9.4.1 指针数组的定义和使用1. 基本概念基本概念第72页/共152页第七十三页,共153页。2. 指针数组的定义和说明指针数组的定义和说明(shumng)定义格式:类型说明定义格式:类型说明(shumng)符符 *指针数组名指针数组名元素个数元素个数例:例:int *p10 ; 数组数组p 的的10个元素个元素 p0, p1 p9
54、都是指向都是指向 int 型数据的指针。型数据的指针。数组的数组的10个元素都是个元素都是 int * 类型的。类型的。 例:例:int a=6, b=8, c=2; int *p10; p0 = &a; p1 = &b; p2 = &c; cout *p0 , *p1 , *p2 endl;p0p1p2acb输出输出(shch):6, 8, 2第73页/共152页第七十四页,共153页。例例9.28利用利用(lyng)指针数组输出另一个数组中各元指针数组输出另一个数组中各元素的值素的值 。#include void main( ) float a5= 2, 4, 6,
55、 8, 10 ; float *p5= &a0, &a1, &a2, &a3, &a4 ; int i; for(i=0; i5; i+) cout *pi t; cout n;a0a1a2a3a4pp0p1p2p3p4输出输出(shch):2 4 6 8 10第74页/共152页第七十五页,共153页。9.4.2 使用使用(shyng)指针数组处理二维数组指针数组处理二维数组 例:例:int a33,*p3,i ; ( p3是指针数组是指针数组 ) for(i=0;i3;i+) pi=ai;通过指针 p 引用数组元素的方式: pij *(pi+j) *
56、(*(p+i)+j) (*(p+i)j说明:说明:p 数组的三个元素数组的三个元素分别是指向分别是指向(zh xin)整型变量的指整型变量的指针(元素指针)。针(元素指针)。p0p1p2pp+1p+2第第0 行行a00a01a02a10a11a12第第1 行行a20a21a22第第2 行行内存内存第75页/共152页第七十六页,共153页。例例9.29输出输出(shch)二维数组全体元素的值二维数组全体元素的值void main(void) int a23=1,2,3,4,5,6; int *pa =a0,a1; int i ,j ; for(i=0;i2;i+) for(j=0;j3;j+)
57、 cout *(pai+j) t; cout n; 运行结果:运行结果:1 2 3 4 5 6第76页/共152页第七十七页,共153页。9.4.3 利用利用(lyng)字符指针数组处理字符串字符指针数组处理字符串namename0name1n a m e 2n a m e 3n a m e 4GeorgeMarySusanTomDavis表示字符串表示字符串George的物理存放位置。的物理存放位置。char *name =George, Mary, Susan, Tom, Davis;括号括号(kuho)中的每一个字符串都是一个地址值。中的每一个字符串都是一个地址值。第77页/共152页第
58、七十八页,共153页。#include #include void main( ) char *name = George, Mary, Susan, Tom, Davis ; char *ptr; int i, j, k, n=5;例例9.30 按字典序将上述按字典序将上述5个字符串排序个字符串排序(pi x),输出。,输出。 此程序主算法是选择法排序此程序主算法是选择法排序(pi x), 通过交换指针的指向来达到排序通过交换指针的指向来达到排序(pi x)的目的。的目的。 第78页/共152页第七十九页,共153页。for(i=0; in1; i+) k=i; for(j=i+1; j0
59、) /字符串比较,字符串比较, k=j; /记住记住(j zh)最小字符串指针的下标。最小字符串指针的下标。 if(k!=i) ptr=namei; namei=namek; namek=ptr; /交换指针数组元素值交换指针数组元素值 for(i=0; in; i+) /输出结果输出结果cout namei endl;字符串比较地址交换第79页/共152页第八十页,共153页。namename0name1n a m e 2n a m e 3n a m e 4GeorgeMarySusanTomDavis结果结果(ji gu)指针的指指针的指向:向:运行(ynxng)结果是:DavisGeor
60、ge MarySusanTom指针数组元素指向的是字符串常数,指针数组元素指向的是字符串常数,每个字符串的长度都不一样,每个字符串的长度都不一样,所以只能通过交换所以只能通过交换(jiohun)指针的指向指针的指向实现排序。实现排序。第80页/共152页第八十一页,共153页。例例9.31改写例改写例9.30,学习如何使用指针数组作函数参数。,学习如何使用指针数组作函数参数。#include #include void main( ) void sort(char * , int), print(char * , int); /函数原型函数原型(yunxng)说明,因为函数定义在后说明,因为函数定义在后 char *name =George, Mary, Susan, Tom, Davis; int n=5 ; sort( name, n); print( name, n); 第81页/共152页第八十二页,共153页。void sort(char *name , int n)/函数函数(hnsh)定义定义,注意参数的写法注意参数的写法char *ptr; int i, j, k;for(i=0; in1; i+) k=i; for(j=i+1; j0 ) k=j; if(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025至2030年中国不锈钢蒸柜电锁警示灯数据监测研究报告
- 影响排便因素排便异常护理兴安盟中等职业教育中心杜晓林课件
- 2025年度花卉租赁及植物租摆与养护技术支持合同
- 二零二五年度汽车销售合同解除通知函示例
- 二零二五年度征收集体土地房屋拆迁补偿协议
- 腹腔感染护理诊断
- 二零二五年度建筑业职工劳动合同履行监督与检查
- 二零二五年度个人司机雇佣与车辆智能化改造合作协议
- 2025年中国电脑鼠标手托盘市场调查研究报告
- 二零二五年度风险投资对赌协议条款
- 蝴蝶兰栽培技术规程
- 筋膜刀的临床应用
- 2024-2030年中国反刍动物饲料行业市场发展趋势与前景展望战略分析报告
- 幼儿园大班《识字卡》课件
- 2024-2030全球与中国宠物医院市场现状及未来发展趋势
- 《研学旅行课程设计》课件-2认识研学旅行的参与方
- 安全警示教育的会议记录内容
- 2024年广东深圳市龙岗坂田街道招考综合网格员招聘笔试冲刺题(带答案解析)
- 部编版小学语文四年级下册第二单元教材分析
- 参考消息电子版在线阅读(角度区)
- 2024年湖南高速铁路职业技术学院高职单招(英语/数学/语文)笔试历年参考题库含答案解析
评论
0/150
提交评论