《C语言第7章指针第1讲.ppt》由会员分享,可在线阅读,更多相关《C语言第7章指针第1讲.ppt(50页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第第第7 7 7 7章章章章 指针指针指针指针(一一一一)12023/1/162内容提要内容提要 指针概述指针概述指针概述指针概述指针的概念指针的概念指针的概念指针的概念为什么引入指针的概念为什么引入指针的概念为什么引入指针的概念为什么引入指针的概念指针变量作为函数参数指针变量作为函数参数指针变量作为函数参数指针变量作为函数参数字符指针作为函数参数字符指针作为函数参数字符指针作为函数参数字符指针作为函数参数 指针和数组间的关系指针和数组间的关系指针和数组间的关系指针和数组间的关系一维数组的地址和指针一维数组的地址和指针一维数组的地址和指针一维数组的地址和指针二维数组的地址和指针二维数组的地址
2、和指针二维数组的地址和指针二维数组的地址和指针2023/1/163为什么引入指针的概念为什么引入指针的概念 铁杆铁杆铁杆铁杆C/C+C/C+程序员最挚爱的武器:指针程序员最挚爱的武器:指针程序员最挚爱的武器:指针程序员最挚爱的武器:指针 C/C+C/C+的高效、高能主要来自于指针的高效、高能主要来自于指针的高效、高能主要来自于指针的高效、高能主要来自于指针 很多不可能的任务由指针完成很多不可能的任务由指针完成很多不可能的任务由指针完成很多不可能的任务由指针完成 2023/1/164为什么引入指针的概念为什么引入指针的概念 指针指针指针指针为函数提供修改变量值的手段为函数提供修改变量值的手段为函
3、数提供修改变量值的手段为函数提供修改变量值的手段 为为为为C C的动态内存分配系统提供支持的动态内存分配系统提供支持的动态内存分配系统提供支持的动态内存分配系统提供支持 为动态数据结构(如例链表、队列、二叉树等)提供支持为动态数据结构(如例链表、队列、二叉树等)提供支持为动态数据结构(如例链表、队列、二叉树等)提供支持为动态数据结构(如例链表、队列、二叉树等)提供支持 可以改善某些子程序的效率可以改善某些子程序的效率可以改善某些子程序的效率可以改善某些子程序的效率 2023/1/165内存的寻址方式内存的寻址方式内存的寻址方式内存的寻址方式 如何读写内存中的数据?如何读写内存中的数据?如何读写
4、内存中的数据?如何读写内存中的数据?通过变量的地址访问变量所在的通过变量的地址访问变量所在的通过变量的地址访问变量所在的通过变量的地址访问变量所在的存储单元存储单元存储单元存储单元 两种寻址方式两种寻址方式两种寻址方式两种寻址方式 直接(寻址)访问直接(寻址)访问直接(寻址)访问直接(寻址)访问通过变量地址直接存取变量内容通过变量地址直接存取变量内容通过变量地址直接存取变量内容通过变量地址直接存取变量内容 间接(寻址)访问间接(寻址)访问间接(寻址)访问间接(寻址)访问通过指针变量来间接存取它所通过指针变量来间接存取它所通过指针变量来间接存取它所通过指针变量来间接存取它所指指指指向向向向的变量
5、的变量的变量的变量i i_pointer=&i;_pointer=&i;2023/1/166指针(指针(Pointer)的概念)的概念 指针也是一种数据类型指针也是一种数据类型指针也是一种数据类型指针也是一种数据类型 指针变量指针变量指针变量指针变量 声明为指针类型的变量,专门存放声明为指针类型的变量,专门存放声明为指针类型的变量,专门存放声明为指针类型的变量,专门存放地址数据地址数据地址数据地址数据的变量的变量的变量的变量 2023/1/167如何定义指针变量?如何定义指针变量?定义指针变量定义指针变量定义指针变量定义指针变量 intint*p;*p;定义了一个指针定义了一个指针定义了一个指
6、针定义了一个指针变量变量变量变量p p,简称指针,简称指针,简称指针,简称指针p p p p是变量,是变量,是变量,是变量,intint*是类型是类型是类型是类型 指针变量初始化指针变量初始化指针变量初始化指针变量初始化intint*p,a;*p,a;p=&a;p=&a;*p*p 与与与与 a a 完全完全完全完全等价等价等价等价2023/1/168指针变量只指针变量只存放地址存放地址!一个指针变量不能一个指针变量不能指向与其类型不同指向与其类型不同的变量的变量!我是真的,我是真的,你猜对了吗?你猜对了吗?应在类型相应在类型相同的指针变同的指针变量之间赋值量之间赋值2023/1/169&与与*
7、操作符操作符&用来取变量的地址用来取变量的地址用来取变量的地址用来取变量的地址*用来取指针指向的内存中的内容用来取指针指向的内存中的内容用来取指针指向的内存中的内容用来取指针指向的内存中的内容int*p,a10;int*p,a10;p=&a0;p=&a0;*p=20;*p=20;int*p,a10;int*p,a10;p=&a5;p=&a5;*p=20;*p=20;int i=3,*p;int i=3,*p;p=&i;p=&i;printf(“*p=%d”,*p);printf(“*p=%d”,*p);int*p,a10;int*p,a10;p=a;p=a;*p=20;*p=20;等价于等价于
8、等价于等价于a0=20;a0=20;2023/1/1610指针变量与其它类型变量的对比指针变量与其它类型变量的对比 共性共性共性共性在内存中占据一定大小的存储单元在内存中占据一定大小的存储单元在内存中占据一定大小的存储单元在内存中占据一定大小的存储单元先定义,后使用先定义,后使用先定义,后使用先定义,后使用 特殊性特殊性特殊性特殊性 它的内容它的内容它的内容它的内容只能是地址只能是地址只能是地址只能是地址,而不能是数据,而不能是数据,而不能是数据,而不能是数据必须初始化必须初始化必须初始化必须初始化后才能使用,否则指向不确定的存储单元,后才能使用,否则指向不确定的存储单元,后才能使用,否则指向
9、不确定的存储单元,后才能使用,否则指向不确定的存储单元,对该空间进行访问,将可能造成危险对该空间进行访问,将可能造成危险对该空间进行访问,将可能造成危险对该空间进行访问,将可能造成危险可参与的运算:加、减一个整数,自增、自减、关系、可参与的运算:加、减一个整数,自增、自减、关系、可参与的运算:加、减一个整数,自增、自减、关系、可参与的运算:加、减一个整数,自增、自减、关系、赋值赋值赋值赋值只能指向只能指向只能指向只能指向同一基类型同一基类型同一基类型同一基类型的变量的变量的变量的变量2023/1/1611指针的指向指针的指向 只能指向同一基类型的变量,否则将引起只能指向同一基类型的变量,否则将
10、引起只能指向同一基类型的变量,否则将引起只能指向同一基类型的变量,否则将引起warningwarningfloatfloat x;x;intint *p=&x;*p=&x;TCTC编译编译编译编译 warning:Suspicious pointer conversion in warning:Suspicious pointer conversion in function mainfunction mainVCVC编译编译编译编译 warning C4133:=:incompatible types-from warning C4133:=:incompatible types-from
11、float*to int*float*to int*2023/1/1612指针运算指针运算 算术运算算术运算算术运算算术运算 shortshort*p,a10;*p,a10;p=a;p=a;p+;p+;/*p/*p的值增加多少?的值增加多少?的值增加多少?的值增加多少?*/指针的加减运算是以指针的加减运算是以指针的加减运算是以指针的加减运算是以其指向的其指向的其指向的其指向的类型的字节长度类型的字节长度类型的字节长度类型的字节长度为单位的为单位的为单位的为单位的6000600160026003600460056006p-1pp+12023/1/1613指针运算指针运算 intint*p,*q,
12、a10;*p,*q,a10;p=a;p=a;q=&a5;q=&a5;q-p q-p q=p+5;q=p+5;指针运算不能乱算指针运算不能乱算指针运算不能乱算指针运算不能乱算一般只进行指针和整数的加减运算,同类型指针之一般只进行指针和整数的加减运算,同类型指针之一般只进行指针和整数的加减运算,同类型指针之一般只进行指针和整数的加减运算,同类型指针之间的减法运算间的减法运算间的减法运算间的减法运算其它运算,比如乘法、除法、浮点运算、指针之间其它运算,比如乘法、除法、浮点运算、指针之间其它运算,比如乘法、除法、浮点运算、指针之间其它运算,比如乘法、除法、浮点运算、指针之间的加法等,并无意义,所以也不
13、支持的加法等,并无意义,所以也不支持的加法等,并无意义,所以也不支持的加法等,并无意义,所以也不支持2023/1/1614指针运算指针运算 关系运算关系运算关系运算关系运算 指向同一种数据类型的两个指针才能进行关系运算指向同一种数据类型的两个指针才能进行关系运算指向同一种数据类型的两个指针才能进行关系运算指向同一种数据类型的两个指针才能进行关系运算值为值为值为值为1 1或或或或0 0 p q p q p q p=q 不能与非指针类型变量进行比较,但可与不能与非指针类型变量进行比较,但可与不能与非指针类型变量进行比较,但可与不能与非指针类型变量进行比较,但可与NULL(NULL(即即即即0 0值
14、值值值)进行等或不等的关系运算进行等或不等的关系运算进行等或不等的关系运算进行等或不等的关系运算判断判断判断判断p p是否为空指针是否为空指针是否为空指针是否为空指针P=NULLP=NULLp!=NULLp!=NULL2023/1/1615指针运算指针运算 赋值赋值赋值赋值运算运算运算运算 指针在使用前一定要赋值指针在使用前一定要赋值指针在使用前一定要赋值指针在使用前一定要赋值 为指针变量赋的值必须是一个地址为指针变量赋的值必须是一个地址为指针变量赋的值必须是一个地址为指针变量赋的值必须是一个地址mainmain()()intint*p;*p;scanf(%d,p);scanf(%d,p);m
15、ainmain()()intint a,*p=&a;a,*p=&a;scanf(%d,p);scanf(%d,p);错!但TC下不报错VC下报错2023/1/1616指针与函数指针与函数 指针既然是数据类型,自然可以做函数参数和返回值指针既然是数据类型,自然可以做函数参数和返回值指针既然是数据类型,自然可以做函数参数和返回值指针既然是数据类型,自然可以做函数参数和返回值的类型的类型的类型的类型 指针做函数参数的经典例子:指针做函数参数的经典例子:指针做函数参数的经典例子:指针做函数参数的经典例子:两数的互换两数的互换两数的互换两数的互换2023/1/1617void Swap(int*x,in
16、t*y)int temp;temp=*x;*x=*y;*y=temp;main()int a,b;a=15;b=8;Swap(&a,&b);printf(a=%d,b=%d,a,b);void Swap(int x,int y)void Swap(int x,int y)int temp;int temp;temp=x;temp=x;x=y;x=y;y=temp;y=temp;main()int a,b;a=15;b=8;Swap(a,b);printf(a=%d,b=%d,a,b);程序程序 1程序程序 2 例7.17.2:编写函数实现两数的互换主调函数主调函数被调被调函数函数实实 参参形形
17、 参参结果有何不同?结果有何不同?2023/1/1618主调函数主调函数被调函数被调函数main()main()intint a,b;a,b;a=15;a=15;b=8;b=8;Swap(Swap(a,ba,b););printf(a=%d,b=%d,a,b);printf(a=%d,b=%d,a,b);voidvoid Swap(Swap(intint x,x,intint y y)intint temp;temp;temp=x;temp=x;x=y;x=y;y=temp;y=temp;55ab实实 参参形形 参参99xyab程序程序 1xy55temp92023/1/1619主调函数主调函
18、数被调函数被调函数main()main()intint a,b;a,b;a=15;a=15;b=8;b=8;Swap(&Swap(&a,&ba,&b););printf(a=%d,b=%d,a,b);printf(a=%d,b=%d,a,b);voidvoid Swap(Swap(intint*x,*x,intint*y*y)intint temp;temp;temp=*x;temp=*x;*x=*y;*x=*y;*y=temp;*y=temp;&a&a实实 参参形形 参参&b&bxyab程序程序 2xy5temp5ab9952023/1/1620简单变量作函数参数与简单变量作函数参数与简单变
19、量作函数参数与简单变量作函数参数与指针变量作函数参数的比较指针变量作函数参数的比较指针变量作函数参数的比较指针变量作函数参数的比较15 815 815 81515 8815 81515a)调用Swap函数(b)执行Swap函数c)从Swap函数返回temp xy bmain函数Swap函数aaatemptempxxy y bb1588 15&a&b&a&b15(a)调用Swap函数 (b)执行Swap函数 a a b b *x *x *y *y y y x x&a&b main函数 Swap函数 temptemp2023/1/1621swap函数的几种错误形式函数的几种错误形式(1/31/3)
20、参数单向传递参数单向传递参数单向传递参数单向传递voidvoid Swap(Swap(intint x,x,intint y)y)intint temp;temp;temp=x;temp=x;/*x,y/*x,y为内部变量为内部变量为内部变量为内部变量*/x=y;x=y;y=temp;y=temp;2023/1/1622swap函数的几种错误形式函数的几种错误形式(2/32/3)参数单向传递参数单向传递参数单向传递参数单向传递voidvoid Swap(Swap(intint*p1,*p1,intint*p2)*p2)intint*p;*p;p=p1;p=p1;/*p1,p2/*p1,p2为内
21、部变量为内部变量为内部变量为内部变量*/p1=p2;p1=p2;p2=p;p2=p;2023/1/1623swap函数的几种错误形式函数的几种错误形式(3/33/3)指针指针指针指针p p没有确切地址没有确切地址没有确切地址没有确切地址voidvoid Swap(Swap(intint*p1,*p1,int int*p2)*p2)intint*p;*p;/*/*指针指针指针指针p p未初始化未初始化未初始化未初始化*/*p=*p1;*p=*p1;*p1=*p2;*p1=*p2;*p2=*p;*p2=*p;2023/1/1624字符串与字符数组、字符指针字符串与字符数组、字符指针 C C语言并没
22、有为字符串提供任何专门的表示法,完全语言并没有为字符串提供任何专门的表示法,完全语言并没有为字符串提供任何专门的表示法,完全语言并没有为字符串提供任何专门的表示法,完全使用字符数组和字符指针来处理使用字符数组和字符指针来处理使用字符数组和字符指针来处理使用字符数组和字符指针来处理 字符串字符串字符串字符串一串以一串以一串以一串以00结尾的字符结尾的字符结尾的字符结尾的字符 字符数组字符数组字符数组字符数组每个元素都是字符类型的数组每个元素都是字符类型的数组每个元素都是字符类型的数组每个元素都是字符类型的数组 charchar string100;string100;字符指针字符指针字符指针字符
23、指针指向字符类型的指针指向字符类型的指针指向字符类型的指针指向字符类型的指针 char char*p;*p;数组和指针可以等同看待,上面三者本质上是一回事数组和指针可以等同看待,上面三者本质上是一回事数组和指针可以等同看待,上面三者本质上是一回事数组和指针可以等同看待,上面三者本质上是一回事2023/1/1625字符指针变量与字符数组的区别字符指针变量与字符数组的区别 定义方法不同定义方法不同定义方法不同定义方法不同 chcharar str10;str10;chcharar*ptr;*ptr;赋值方法不同赋值方法不同赋值方法不同赋值方法不同 chcharar str10;str10;str=
24、”china”;str=”china”;/*/*错误错误错误错误*/strcpy(str,”china”);strcpy(str,”china”);/*/*正确正确正确正确*/chcharar*ptr;*ptr;ptr=”china”;ptr=”china”;字符指针是变量,而数组名是地址常量字符指针是变量,而数组名是地址常量字符指针是变量,而数组名是地址常量字符指针是变量,而数组名是地址常量2023/1/1626使用字符指针的注意事项使用字符指针的注意事项 字符指针变量必须有明确的指向,否则字符指针变量必须有明确的指向,否则使用使用是危险的是危险的 例如,输入字符串时例如,输入字符串时例如,
25、输入字符串时例如,输入字符串时 char char*a;*a;scanf(%s,a);scanf(%s,a);/*/*错误错误错误错误*/应为:应为:应为:应为:char char*a;*a;char char str10;str10;a=str;a=str;scanf(%s,a);scanf(%s,a);/*/*正确正确正确正确*/2023/1/1627例例7.5:字符串拷贝:字符串拷贝用字符数组编程用字符数组编程void void MyStrcpy(MyStrcpy(charchar dstStr,dstStr,charchar srcStr)srcStr)intint i=0;i=0;w
26、hilewhile(srcStri!=0)(srcStri!=0)dstStri=srcStri;dstStri=srcStri;i+;i+;dstStri=0;dstStri=0;下标:0 1 2 3 4 5 6 7 8 9 10 11 HelloChina0HelloChina0srcStridstStri下标移动方向dstStri=0srcStrdstStr结束拷贝ii+i 2023/1/1628voidvoid MyStrcpy(MyStrcpy(charchar*dstStr,*dstStr,const charconst char*srcStr)*srcStr)whilewhile
27、(*srcStr!=0)(*srcStr!=0)*dstStr=*srcStr;*dstStr=*srcStr;srcStr+;srcStr+;dstStr+;dstStr+;*dstStr=0;*dstStr=0;当只允许函数访问地址内容,不允许修改当只允许函数访问地址内容,不允许修改时,可以把函数的指针参数定义为时,可以把函数的指针参数定义为constHelloChina0HelloChina0*srcStr*dstStr指针移动方向指针移动方向*to=0dstStrsrcStr+srcStrsrcStrdstStr+dstStr例例例例7.5 7.5:字符串拷贝:字符串拷贝:字符串拷贝:
28、字符串拷贝用字符指针编程用字符指针编程用字符指针编程用字符指针编程2023/1/1629例例7.5:字符串拷贝:字符串拷贝主函数程序主函数程序#include#include main()main()char a80,b80;char a80,b80;printf(“Please enter a string:”);printf(“Please enter a string:”);gets(a);gets(a);MyStrcpy(b,a);MyStrcpy(b,a);printf(“The copy is:”);printf(“The copy is:”);puts(b);puts(b);20
29、23/1/1630例例7.6:计算实际字符个数:计算实际字符个数 unsigned intunsigned int MyStrlen(MyStrlen(charchar str)str)intint i;i;unsigned intunsigned int len=0;len=0;forfor(i=0;stri!=0;i+)(i=0;stri!=0;i+)len+;len+;returnreturn(len);(len);unsigned int unsigned int MyStrlen(MyStrlen(char char*pStr)*pStr)unsigned intunsigned i
30、nt len=0;len=0;forfor(;*pStr!=0;pStr+)(;*pStr!=0;pStr+)len+;len+;returnreturn(len);(len);方法方法方法方法2 2:用字符指针实现:用字符指针实现:用字符指针实现:用字符指针实现 方法方法方法方法1 1:用字符数组实现:用字符数组实现:用字符数组实现:用字符数组实现2023/1/1631指针与数组指针与数组 数组名就是一个指针数组名就是一个指针数组名就是一个指针数组名就是一个指针只是不能修改这个指针的指向只是不能修改这个指针的指向只是不能修改这个指针的指向只是不能修改这个指针的指向可以定义函数的参数为数组可以
31、定义函数的参数为数组可以定义函数的参数为数组可以定义函数的参数为数组 指针也可当作数组名使用指针也可当作数组名使用指针也可当作数组名使用指针也可当作数组名使用shortshort*p,a10;*p,a10;p=a;p=a;数组元素的几种等价引用形式数组元素的几种等价引用形式数组元素的几种等价引用形式数组元素的几种等价引用形式aiai*(a+i)*(a+i)pipi*(p+i)*(p+i)60006001600260036004600560066007a0a1a2a3aa+1a+260006001600260036004600560066007a0a1a2a3app+p+2023/1/1632输
32、入输出数组的全部元素输入输出数组的全部元素mainmain()()intint a10;a10;intint i;i;forfor(i=0;i10;i+)(i=0;i10;i+)scanf(%d,&ai);scanf(%d,&ai);forfor(i=0;i10;i+)(i=0;i10;i+)printf(%d,ai);printf(%d,ai);方法方法方法方法1 1:下标法下标法下标法下标法mainmain()()intint a10;a10;intint *p,i;*p,i;forfor(p=a;p(a+10);p+)(p=a;p(a+10);p+)scanf(%d,p);scanf(%
33、d,p);forfor(p=a;p(a+10);p+)(p=a;p(a+10);p+)printf(%d,*p);printf(%d,*p);方法方法方法方法2 2:指针法指针法指针法指针法2023/1/1633例例7.7:插入排序:插入排序 关键是:找到该插入的位置,然后依次移动插入位置关键是:找到该插入的位置,然后依次移动插入位置关键是:找到该插入的位置,然后依次移动插入位置关键是:找到该插入的位置,然后依次移动插入位置及其后的所有元素腾出这一位置放入待插入的元素及其后的所有元素腾出这一位置放入待插入的元素及其后的所有元素腾出这一位置放入待插入的元素及其后的所有元素腾出这一位置放入待插入的
34、元素 1 3 5 7 9a0 a1 a2 a3 a4 a5插入位置pos x=4x插入前:1 3 4 5 7 9 x插入后:插入元素xa0 a1 a2 a3 a4 a52023/1/1634例例7.7:插入排序:插入排序主函数主函数#include#include#define ARR_SIZE 10#define ARR_SIZE 10void Inseart(int a,int n,int x)void Inseart(int a,int n,int x)main()/*main()/*教材教材教材教材268268页页页页*/int aARR_SIZE+1,x,i,n;int aARR_S
35、IZE+1,x,i,n;Inseart(a,n,x);/*Inseart(a,n,x);/*调用函数调用函数调用函数调用函数 实参实参实参实参a a为数组名为数组名为数组名为数组名*/2023/1/1635例例7.7:插入排序:插入排序数组作形参数组作形参voidvoid Inseart(Inseart(intint a,a,intint n,n,intint x)x)intint i,pos;i,pos;forfor(i=0;(i ai);i+)(i=0;(i ai);i+)pos=i;pos=i;forfor(i=n-1;i=pos;i-)(i=n-1;i=pos;i-)ai+1=ai;a
36、i+1=ai;/*/*向后移动向后移动向后移动向后移动*/apos=x;apos=x;/*/*插入元素插入元素插入元素插入元素x x到位置到位置到位置到位置pos*/pos*/2023/1/1636main()/*main()/*教材教材教材教材270270页页页页*/int aARR_SIZE+1,x,i,n;int aARR_SIZE+1,x,i,n;Inseart(a,n,x);/*Inseart(a,n,x);/*调用函数调用函数调用函数调用函数 实参实参实参实参a a为数组名为数组名为数组名为数组名*/void Inseart(int void Inseart(int*a*a,int
37、 n,int x)/*,int n,int x)/*定义函数,形参定义函数,形参定义函数,形参定义函数,形参a a为为为为指针变量指针变量指针变量指针变量*/插入排序插入排序插入排序插入排序方式二方式二方式二方式二2023/1/1637main()/*main()/*教材教材教材教材270270页页页页*/int aARR_SIZE+1,x,i,n;int aARR_SIZE+1,x,i,n;int*p=NULL;int*p=NULL;Inseart(p,n,x);/*Inseart(p,n,x);/*调用函数调用函数调用函数调用函数 实参实参实参实参p p指针变量指针变量指针变量指针变量*/
38、void Inseart(int a,int n,int x)/*void Inseart(int a,int n,int x)/*定义函数,形参定义函数,形参定义函数,形参定义函数,形参a a为数组为数组为数组为数组*/*/插入排序插入排序插入排序插入排序方式三方式三方式三方式三2023/1/1638main()/*main()/*教材教材教材教材270270页页页页*/int aARR_SIZE+1,x,i,n;int aARR_SIZE+1,x,i,n;int*p=NULL;int*p=NULL;Inseart(p,n,x);/*Inseart(p,n,x);/*调用函数调用函数调用函数
39、调用函数 实参实参实参实参p p为指针变量为指针变量为指针变量为指针变量*/void Inseart(int void Inseart(int*a*a,int n,int x)/*,int n,int x)/*定义函数,形参定义函数,形参定义函数,形参定义函数,形参a a为为为为指针变量指针变量指针变量指针变量*/插入排序插入排序插入排序插入排序方式方式方式方式4 42023/1/1639例例例例7.7 7.7:插入排序:插入排序:插入排序:插入排序指针作形参指针作形参指针作形参指针作形参voidvoid Inseart(Inseart(intint*a,*a,intint n,n,intin
40、t x)x)intint i,pos;i,pos;forfor(i=0;(i *(a+i);i+)(i=0;(i *(a+i);i+)pos=i;pos=i;forfor(i=n-1;i=pos;i-)(i=n-1;i=pos;i-)*(a+i+1)=*(a+i);*(a+i+1)=*(a+i);/*/*向后移动向后移动向后移动向后移动*/*(a+pos)=x;*(a+pos)=x;/*/*插入元素插入元素插入元素插入元素x x到位置到位置到位置到位置pos*/pos*/2023/1/1640指针与二维数组指针与二维数组 C C语言将二维数组看作一维数组,其每个数组元素语言将二维数组看作一维数
41、组,其每个数组元素语言将二维数组看作一维数组,其每个数组元素语言将二维数组看作一维数组,其每个数组元素又是一个一维数组又是一个一维数组又是一个一维数组又是一个一维数组 按行顺序存放所有元素按行顺序存放所有元素按行顺序存放所有元素按行顺序存放所有元素a00a01a02a10a11a12aa0+0a+1a1+0a0+1a0+2&a00&a10&a11a1+1&a12&a01&a02 a00 a0a01a02a10 a1 a11a12 a a1+2intint a23;2023/1/1641例例7.8 任意输入英文的星期几,在查找星期表后输出其对应任意输入英文的星期几,在查找星期表后输出其对应任意输
42、入英文的星期几,在查找星期表后输出其对应任意输入英文的星期几,在查找星期表后输出其对应的数字。的数字。的数字。的数字。char weekDay710=char weekDay710=Sunday,Monday,Tuesday,Wednesday,Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday;Thursday,Friday,Saturday;表表表表7-1 7-1 星期表的内容星期表的内容星期表的内容星期表的内容0 0SundaySunday1 1MondayMonday2 2TuesdayTuesday3 3Wednesday
43、Wednesday4 4ThursdayThursday5 5FridayFriday6 6SaturdaySaturdayweekDay0weekDay1weekDay2weekDay3weekDay4weekDay5weekDay6Sunday0Monday0Tuesday0Wednesday0Thursday0Friday0Saturday02023/1/1642#includeinclude main()main()intint i,pos;i,pos;intint findFlag=0;findFlag=0;charchar x10;x10;charchar weekDay10=Su
44、nday,Monday,Tuesday,weekDay10=Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Wednesday,Thursday,Friday,Saturday;Saturday;printf(Please enter a string:);printf(Please enter a string:);scanf(%s,x);scanf(%s,x);forfor(i=0;i 7&!findFlag;i+)(i=0;i 7&!findFlag;i+)ifif(strcmp(x,weekDayi)=0)(strcmp(x,weekDa
45、yi)=0)pos=i;pos=i;findFlag=1;findFlag=1;ifif(findFlag)(findFlag)printf(%s is%dn,x,pos);printf(%s is%dn,x,pos);elseelse printf(Not found!n);printf(Not found!n);例例7.8weekDay0weekDay1weekDay2weekDay3weekDay4weekDay5weekDay6Sunday0Monday0Tuesday0Wednesday0Thursday0Friday0Saturday0 xSunday02023/1/1643指针与
46、二维数组指针与二维数组 a a 代表代表代表代表二二二二维数组的首地址,维数组的首地址,维数组的首地址,维数组的首地址,第第第第0 0行行行行的地址的地址的地址的地址 a+i a+i 代表代表代表代表第第第第i i行行行行的地址的地址的地址的地址*(a(a+i)+i)即即即即 ai ai 代表代表代表代表第第第第i i行第行第行第行第0 0列列列列的地址的地址的地址的地址*(a(a+i)+j+i)+j 即即即即 ai+j ai+j 代表代表代表代表第第第第i i行第行第行第行第j j列列列列的地址的地址的地址的地址*(*(a(*(a+i)+j)+i)+j)即即即即 aij aij 代表代表代表
47、代表第第第第i i行第行第行第行第j j列列列列的的的的元素元素元素元素行地址行地址行地址行地址转变成转变成转变成转变成列地址列地址列地址列地址2023/1/1644指针与二维数组指针与二维数组 二维数组的指针二维数组的指针二维数组的指针二维数组的指针列指针列指针列指针列指针int int*p;*p;p=*a;/p=*a;/用列地址初始化用列地址初始化用列地址初始化用列地址初始化 逐个元素查找元素所在位置逐个元素查找元素所在位置逐个元素查找元素所在位置逐个元素查找元素所在位置 相对于数组起始地址的偏移量相对于数组起始地址的偏移量相对于数组起始地址的偏移量相对于数组起始地址的偏移量i*n+ji*
48、n+jforfor(i=0;im;i+)(i=0;im;i+)forfor(j=0;jn;j+)(j=0;jn;j+)printf(printf(%d%d,*(p+i*n+j)*(p+i*n+j););a00a01a02a10a11a12pp+2023/1/1645指针与二维数组指针与二维数组 二维数组的指针二维数组的指针二维数组的指针二维数组的指针行指针行指针行指针行指针int int(*p p)3,a43,*p1;)3,a43,*p1;p=p=a a;/;/用行地址初始化用行地址初始化用行地址初始化用行地址初始化p1=a0 p1=a0;/;/用元素地址初始化用元素地址初始化用元素地址初始化
49、用元素地址初始化 先逐行查找元素所在行先逐行查找元素所在行先逐行查找元素所在行先逐行查找元素所在行 再在行内逐列查找元素所在位置再在行内逐列查找元素所在位置再在行内逐列查找元素所在位置再在行内逐列查找元素所在位置forfor(i=0;im;i+)(i=0;im;i+)forfor(j=0;jn;j+)(j=0;jn;j+)printf(printf(%d%d,*(*(p+i)+j)*(*(p+i)+j););a00a01a02a10a11a12pp+2023/1/1646例例7.3:在:在一个班级一个班级中找出最高分中找出最高分及其学号及其学号 void void FindMax(FindMa
50、x(floatfloat score,score,longlong num,num,intint n,n,float float pMaxScore,pMaxScore,longlong pMaxNum)pMaxNum)intint i;i;pMaxScore=score0;pMaxScore=score0;pMaxNum=num0;pMaxNum=num0;forfor(i=1;in;i+)(i=1;i pMaxScore)(scorei pMaxScore)pMaxScore=scorei;pMaxScore=scorei;pMaxNum=numi;pMaxNum=numi;能返回这两个值