c语言指针(总结)_第1页
c语言指针(总结)_第2页
c语言指针(总结)_第3页
c语言指针(总结)_第4页
c语言指针(总结)_第5页
已阅读5页,还剩97页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第第11章章 指针指针C程序设计飞快进阶大学教程程序设计飞快进阶大学教程第第11章章 指针指针本章要点本章要点指针概念指针概念指针与数组指针与数组指针与函数指针与函数字符串字符串动态空间经管动态空间经管11 指针指针学问点学问点指针概念指针概念指向数组的指针、指针数组指向数组的指针、指针数组指针做指标、指针做为函数值、指向函数的指针指针做指标、指针做为函数值、指向函数的指针字符串字符串动态空间经管动态空间经管11.1 懂得指针懂得指针当咨询路时当咨询路时,常常听到如此的答复常常听到如此的答复:“向前走过向前走过3个路个路口右转口右转,再过两个路口左转再过两个路口左转,再前行再前行200米米.”

2、当在图书馆中寻一本时当在图书馆中寻一本时,常常是如此寻常常是如此寻:“第五排书架第五排书架,从上向下数第二层从上向下数第二层,左数第左数第6本本.” 老师提咨询学生老师提咨询学生,在不明白学生姓名的情况下在不明白学生姓名的情况下,常常常常讲讲:“第第4排左数第二个同学排左数第二个同学.” 上述例子讲明对一个事务的会见上述例子讲明对一个事务的会见,当不能够通过当不能够通过标题直截了当会见标题直截了当会见,只能够通过其位置履行会见只能够通过其位置履行会见. C程序同样的事理程序同样的事理,前面的章节对信息的会见是前面的章节对信息的会见是通过变量标题实现的通过变量标题实现的,但是但是,有时侯不明白其

3、标题有时侯不明白其标题,甚甚到其没有标题到其没有标题,这时侯只能通过该信息所在的地址这时侯只能通过该信息所在的地址履行会见履行会见.11.2 指向变量的指针指向变量的指针C语言中定义一个变量时语言中定义一个变量时,例似例似: int i1=3;描述了变量相关的描述了变量相关的3角度的属性角度的属性:值、地址、值、地址、类型类型.1. 值为值为3,通过变量会见通过变量会见,似似i1+52. 地址为地址为0012ff78(32位机器位机器,0012ff78为为16进制数)进制数),占用占用内存空间的位置内存空间的位置,通过通过&i1会见会见,&在在scanf语句中使用过语句中使用过

4、.3. 类型为类型为int,决意了其能够介入的运算决意了其能够介入的运算,同时也决意了其占用同时也决意了其占用空间的大小(从起始地址最先占用的接连字节数)空间的大小(从起始地址最先占用的接连字节数),占占用空间的大小通过用空间的大小通过sizeof运算符运算符,在在vc中中sizeof(i1)为为4个个字节字节.11.2 指向变量的指针指向变量的指针把变量把变量i1的地址存放于指针变量的地址存放于指针变量pi1中中 11.2.1 指针变量的定义指针变量的定义指针变量定义的一样形式为指针变量定义的一样形式为: 类型讲明符类型讲明符 *变量名变量名;例似例似:int *pi1;对指针变量的定义包罗

5、三个内容对指针变量的定义包罗三个内容:1. 指针类型讲明指针类型讲明,*示意这是一个指针变量;示意这是一个指针变量;2. 指针变量名指针变量名,pi1为指针变量名;为指针变量名;3. 指针所指向的变量的信息类型指针所指向的变量的信息类型,int为指针变量所指向的变为指针变量所指向的变量的信息类型量的信息类型,讲明讲明pi1只能储存整型变量的地址只能储存整型变量的地址.再似再似:float *pf1; *pf1是指向浮点变量的指针变量是指向浮点变量的指针变量*char *pc1 *pc1是指向字符变量的指针变量是指向字符变量的指针变量*11.2.2 指针变量的引用指针变量的引用 指针变量同一样变

6、量一样指针变量同一样变量一样,使用之前不仅要定使用之前不仅要定义讲明义讲明,并且必须赋予具体的值并且必须赋予具体的值. 未经赋值的指针变量不能使用未经赋值的指针变量不能使用,否那么将造成否那么将造成系统杂乱系统杂乱,甚到死机甚到死机.(咨询路时不人告知你一个不(咨询路时不人告知你一个不存在的地址存在的地址,会如何样?)会如何样?)11.2.2 指针变量的引用指针变量的引用 和指针相关有两个运算符和指针相关有两个运算符&和和*:1. &:取地址运算符取地址运算符.其一样形式为其一样形式为: &变量名变量名 取一个内存变量的地址取一个内存变量的地址.2. *:指针运算符(或

7、称指针运算符(或称“间接会见间接会见” 运算符)运算符).其一样形式为其一样形式为: *指针变量名指针变量名通过指针变量间接会见指针变量所指向变量的信息通过指针变量间接会见指针变量所指向变量的信息.int i1; int * pi1; pi1=&i1;int i2=*pi1+1; 此处此处*代表间接会见运算符代表间接会见运算符,取指针变量取指针变量pi1所指向的变量所指向的变量i1的值(对的值(对i1间接会见)加间接会见)加1赋值给变量赋值给变量i2.此语句结论完全此语句结论完全等价于等价于: int i2=i1+1;11.2.2 指针变量的引用指针变量的引用指针变量讲明指针变量讲明:

8、1. 对对*要区不类型讲明符与间接会见符要区不类型讲明符与间接会见符.2. 不能用一个数给指针变量赋值不能用一个数给指针变量赋值,下面赋值是错误的下面赋值是错误的:int *pi1; pi1=20;但是但是,指针可用指针可用0赋值赋值,代表空指针代表空指针,哪里也不指向哪里也不指向.3. 给指针变量赋值时给指针变量赋值时,指针变量前不能加指针变量前不能加“*”讲明符讲明符,下面的写下面的写法是错误的法是错误的: int i1; int *pi1; *pi1=&i1;指针变量指针变量pi1前面加前面加*便代表间接会见了便代表间接会见了,代表代表i 指针变量的引用指针变量的

9、引用指针变量讲明指针变量讲明:4. 指针变量未指向具体有效地址指针变量未指向具体有效地址,间接会见会有咨询题间接会见会有咨询题 int *pi1; * 指针变量指针变量pi1未赋值未赋值,不明白指向哪里不明白指向哪里* *pi1=200; * 向向pi1所指向的地址空间赋值所指向的地址空间赋值200 *(随机给你一个账户(随机给你一个账户,存钞票后如何取呢?)存钞票后如何取呢?)推断一个指针变量是否指向有效空间推断一个指针变量是否指向有效空间:int *pi1=0;if(pi1!=0) *pi1=200;省略号部分省略号部分,如果未使如果未使pi1指向有效空间指向有效空间,这对这对*pil的赋

10、值便不大的赋值便不大概履行概履行.11.2.2 指针变量的引用指针变量的引用指针变量讲明指针变量讲明:5. 指针变量的值是能够改变的指针变量的值是能够改变的int i1=3,i2=4,*pi1;pi1=&i1;i2=i2+*pi1;11.2.2 指针变量的引用指针变量的引用指针变量讲明指针变量讲明:5. 指针变量的值是能够改变的指针变量的值是能够改变的pi1=&i2;改变指针变量改变指针变量pi1指向指向i2 11.2.2 指针变量的引用指针变量的引用指针变量讲明指针变量讲明:5.指针变量只能用同类型的地址赋值指针变量只能用同类型的地址赋值float *pf1; *pf1是指向

11、浮点变量的指针变量是指向浮点变量的指针变量*char c1; *字符变量字符变量*pf1=&c1;pf1只能存储只能存储float信息的地址信息的地址,用字符型信息地址赋值是错误的用字符型信息地址赋值是错误的.11.2.2 指针变量的引用指针变量的引用指针变量讲明指针变量讲明:7. 同类型指针变量间能够彼此赋值同类型指针变量间能够彼此赋值例例11.1 交流指针变量交流指针变量#include int main() int i1=3,i2=4; int *pi1,*pi2,*pi3; pi1=&i1; pi2=&i2;pi3=0; *交流指针变量交流指针变量* pi3=p

12、i1; pi1=pi2; pi2=pi3; printf(i1=%dni2=%dn,i1,i2); printf(*pi1=%dn*pi2=%dn,*pi1,*pi2); return 0; 程序运行结论程序运行结论:i1=3i2=4*pi1=4*pi2=311.2.2 指针变量的引用指针变量的引用指针变量讲明指针变量讲明:7. 同类型指针变量间能够彼此赋值同类型指针变量间能够彼此赋值例例11.1 交流指针变量交流指针变量11.2.2 指针变量的引用指针变量的引用指针变量讲明指针变量讲明:7. 同类型指针变量间能够彼此赋值同类型指针变量间能够彼此赋值例例11.2 交流指针变量所指向的信息交流指

13、针变量所指向的信息#include int main() int i1=3,i2=4; int *pi1,*pi2; int iTemp=0; pi1=&i1; pi2=&i2; *交流指针变量所指向的信息交流指针变量所指向的信息* iTemp=*pi1; *pi1=*pi2; *pi2=iTemp; printf(i1=%dni2=%dn,i1,i2); printf(*pi1=%dn*pi2=%dn,*pi1,*pi2); return 0;程序运行结论程序运行结论:i1=4i2=3*pi1=4*pi2=311.2.2 指针变量的引用指针变量的引用指针变量讲明指针变量讲明:

14、7. 同类型指针变量间能够彼此赋值同类型指针变量间能够彼此赋值例例11.2 交流指针变量所指向的信息交流指针变量所指向的信息11.3 数组与指针数组与指针 一个变量有一个地址一个变量有一个地址,一个数组见谅如果干元素一个数组见谅如果干元素,每个数组元素都在内存中占用存储单元每个数组元素都在内存中占用存储单元,它们都有它们都有相应的地址相应的地址.所谓数组的指针是指数组的起始地址所谓数组的指针是指数组的起始地址,数组元素的指针是数组元素的地址数组元素的指针是数组元素的地址. 对数组元素也能够采纳指针履行会见对数组元素也能够采纳指针履行会见,功效相对功效相对更高更高.11.3.1 一维数组与指针一

15、维数组与指针一个数组是由接连的一块内存单元组成的一个数组是由接连的一块内存单元组成的.数组名便是这块接连内存单元的首地址(常量)数组名便是这块接连内存单元的首地址(常量).int iArr5=1,2,3,4,5; int *pi; pi=&iArr0;11.3.1 一维数组与指针一维数组与指针 C语言规定语言规定,数组名代表数组的首地址数组名代表数组的首地址,也便是也便是第第0号元素的地址号元素的地址.所以所以,下面两个语句等价下面两个语句等价: pi=&iArr0; pi=iArr; iArr数组名是整型常量地址数组名是整型常量地址 int i; iArr=&i;*不

16、能够不能够,因为因为iArr为常量为常量*11.3.1 一维数组与指针一维数组与指针1. 指针相关的运算符指针相关的运算符(1) 取地址运算符取地址运算符&:单目运算符单目运算符(注重其优先级注重其优先级),其联合性为自右到左其联合性为自右到左,其功能是取变量的地址其功能是取变量的地址.(2) 间接会见运算符间接会见运算符*:单目运算符单目运算符,其联合性为自其联合性为自右到左右到左,用来示意指针变量所指的变量用来示意指针变量所指的变量.(3) 赋值运算符赋值运算符=:能够给指针变量赋值能够给指针变量赋值.(4) 算术运算符算术运算符+、-、+、-. +:地址表达式(地址表达式(pi)

17、+ 整型表达式(整型表达式(in),结结论为在论为在pi地址值位置跃过地址值位置跃过in(pi所指类型字节所指类型字节数)个字节后的地址数)个字节后的地址.11.3.1 一维数组与指针一维数组与指针1. 指针相关的运算符指针相关的运算符-:地址表达式(地址表达式(pi)- 整型表达式(整型表达式(in),结论为在结论为在pi地址值位置跳回地址值位置跳回in(pi所指类型字节数)个所指类型字节数)个字节后的地址字节后的地址.-:地址表达式(地址表达式(pi1)-地址表达式(地址表达式(pi12),结论为结论为在在pi2和和pi1相差的字节数相差的字节数(pi1所指类型字节所指类型字节数)数).p

18、i1与与pi2必须指向一样信息类型必须指向一样信息类型.+:地址变量(地址变量(pi)+ 大概大概 +地址变量(地址变量(pi),结论结论为在为在pi地址值位置跃过地址值位置跃过pi所指类型字节数个字所指类型字节数个字节后的地址节后的地址.分前分前+和后和后+.-:地址变量(地址变量(pi)- 大概大概 -地址变量(地址变量(pi),结论为结论为在在pi地址值位置跳回地址值位置跳回pi所指类型字节数个字节所指类型字节数个字节后的地址后的地址.分前分前-和后和后-.11.3.1 一维数组与指针一维数组与指针1. 指针相关的运算符指针相关的运算符(5) 关系运算关系运算.撑持撑持6种关系运算符种关

19、系运算符,用来对比地址的用来对比地址的大小大小.例似例似:&iArr1 &iArr3 为真;为真;piiArr+3为真(为真(pi的值为的值为iArr).11.3.1 一维数组与指针一维数组与指针1. 指针相关的运算符指针相关的运算符(5) 关系运算关系运算.int iArr5=0,1,2,3,4; int *pi,*pi1,*pi2; pi=&iArr1; pi1=&iArr2; pi2=&iArr4;*pi+:因为因为+和和*同优先级同优先级,联合方向自右而左联合方向自右而左,等价等价于于*(pi+).先对先对*pi,接着接着pi加加1.表达式的值为

20、表达式的值为iArr1,pi的值为的值为&iArr2.*+pi:等价于等价于*(+pi).先先pi加加1,接着接着*pi.表达式的值表达式的值为为iArr2,pi的值为的值为&iArr2. (*pi)+:先先*pi,接着(接着(*pi)加)加1.表达式的值为表达式的值为iArr1+,iArr1的值改变了的值改变了,pi的值为的值为&iArr1,pi的值未改变的值未改变. pi2-pi1:pi2和和pi1相差两个整型数所占字节数的大相差两个整型数所占字节数的大小小,它的返回值不是相差字节数它的返回值不是相差字节数,而是相差整数的个而是相差整数的个数数,所以值为所以值为2.

21、 上述算术运算符对简单变量地址运就是无意义的上述算术运算符对简单变量地址运就是无意义的,因为因为对一个简单变量对一个简单变量x,&x+5统计的结论地址不明白是统计的结论地址不明白是哪个信息的地址哪个信息的地址.而数组空间是接连的而数组空间是接连的,对一个数组对一个数组arr,arr+5便是便是arr5的地址的地址. 11.3.1 一维数组与指针一维数组与指针1. 指针相关的运算符指针相关的运算符(5) 关系运算关系运算.int iArr5=0,1,2,3,4; int *pi,*pi1,*pi2; pi=&iArr1; pi1=&iArr2; pi2=&iArr

22、4;*pi+:因为因为+和和*同优先级同优先级,联合方向自右而左联合方向自右而左,等价等价于于*(pi+).先对先对*pi,接着接着pi加加1.表达式的值为表达式的值为iArr1,pi的值为的值为&iArr2.*+pi:等价于等价于*(+pi).先先pi加加1,接着接着*pi.表达式的值表达式的值为为iArr2,pi的值为的值为&iArr2. (*pi)+:先先*pi,接着(接着(*pi)加)加1.表达式的值为表达式的值为iArr1+,iArr1的值改变了的值改变了,pi的值为的值为&iArr1,pi的值未改变的值未改变. pi2-pi1:pi2和和pi1相差两个整型数

23、所占字节数的大相差两个整型数所占字节数的大小小,它的返回值不是相差字节数它的返回值不是相差字节数,而是相差整数的个而是相差整数的个数数,所以值为所以值为2. 上述算术运算符对简单变量地址运就是无意义的上述算术运算符对简单变量地址运就是无意义的,因为因为对一个简单变量对一个简单变量x,&x+5统计的结论地址不明白是统计的结论地址不明白是哪个信息的地址哪个信息的地址.而数组空间是接连的而数组空间是接连的,对一个数组对一个数组arr,arr+5便是便是arr5的地址的地址. 11.3.1 一维数组与指针一维数组与指针2.引用数组元素引用数组元素 int iArr5=1,2,3,4,5; in

24、t *pi; pi=iArr;(1) pi+i1和和iArr+i1便是便是iArri1的地址的地址,大概讲它们大概讲它们指向指向iArr数组的第数组的第i个元素个元素.(2) *(pi+i1)或或*( iArr+i1)便是便是pi+i1或或iArr+i1所指向所指向的数组元素的数组元素,即即iArr i1.例似例似,*(pi+2)或或*(iArr+2)便便是是iArr2.(3) 指向数组指针变量能够带下标指向数组指针变量能够带下标,似似pii1与与*(pi+i1)等价等价.引入指针变量后引入指针变量后,对数组对数组iArr,pi是指向数组的指针变量是指向数组的指针变量,其初值其初值pi=iAr

25、r.便能够用两种方式来会见数组元素便能够用两种方式来会见数组元素:(1) 下标法下标法,即用即用iArri1形式会见数组元素形式会见数组元素,也能够也能够用用pii1会见数组元素会见数组元素.(2) 指针法指针法,即采纳即采纳*(iArr+i1)或或*(pi+i1)形式形式,用间接用间接会见的方式来会见数组元素会见的方式来会见数组元素.11.3.1 一维数组与指针一维数组与指针例例11.3 数组元素赋值同时输出(数组名下标法)数组元素赋值同时输出(数组名下标法)#include int main() int iArr5,i1; for(i1=0;i15;i1+) iArri1=i1; for(

26、i1=0;i15;i1+) printf(iArr%d=%dn,i1,iArri1); return 0;11.3.1 一维数组与指针一维数组与指针例例11.4 数组元素赋值同时输出(指针变量下标法)数组元素赋值同时输出(指针变量下标法)#include int main() int iArr5,i1; int *pi=iArr; *pi为变量为变量,iArr为常量为常量* for(i1=0;i15;i1+) pii1=i1; for(i1=0;i15;i1+) printf(iArr%d=%dn,i1,pii1); return 0;11.3.1 一维数组与指针一维数组与指针例例11.5 数

27、组元素赋值同时输出(数组名指针法)数组元素赋值同时输出(数组名指针法)#include int main() int iArr5,i1; for(i1=0;i15;i1+) *(iArr+i1)=i1; for(i1=0;i15;i1+) printf(iArr%d=%dn,i1,*(iArr+i1); return 0;11.3.1 一维数组与指针一维数组与指针例例11.6 数组元素赋值同时输出(指针变量指针法)数组元素赋值同时输出(指针变量指针法)#include int main() int iArr5,i1; int *pi=iArr; for(i1=0;i15;i1+) *(pi+i

28、1)=i1; for(i1=0;i15;i1+) printf(iArr%d=%dn,i1,*(pi+i1); return 0;11.3.1 一维数组与指针一维数组与指针例例11.7 数组元素赋值同时输出(指针变量指针移动数组元素赋值同时输出(指针变量指针移动法)法)#include int main() int iArr5,i1; int *pi=iArr; for(i1=0;i15;i1+) *pi=i1; pi+; *此刻此刻,pi差不多指向差不多指向iArr4之后之后,输出数组元素输出数组元素,pi再再一次指回数组头部一次指回数组头部* pi=iArr; for(i1=0;i15;i

29、1+) printf(iArr%d=%dn,i1,*pi);pi+; return 0;11.3.1 一维数组与指针一维数组与指针例例11.8 数组元素赋值同时输出(指针变量关系运算指针法)数组元素赋值同时输出(指针变量关系运算指针法)#include int main() int iArr5,i1=0; int *pi=iArr; for(;piiArr+5;pi+,i1+)*pi=i1; *此刻此刻,pi差不多指向差不多指向iArr4之后之后,为下面输出数组为下面输出数组,必须让必须让pi再一次指回数组头部再一次指回数组头部* pi=iArr;i1=0; for(;piiArr+5;pi+

30、,i1+) printf(iArr%d=%dn,i1,*pi); return 0;11.3.2 二维数组与指针二维数组与指针1. 懂得二维数组懂得二维数组 C语言对二维数组的存储是行优先方式的语言对二维数组的存储是行优先方式的,对整型二对整型二维数组维数组iA iArr34=1,2,3,4,5,6,7,8,9,10,11,1211.3.2 二维数组与指针二维数组与指针1. 懂得二维数组懂得二维数组一个二维数组是以一维数组为元素组织的一维数组一个二维数组是以一维数组为元素组织的一维数组,也也便是二维数组能够看作一维数组便是二维数组能够看作一维数组,只只是该一维数只只是该一维数组的每

31、个元素又是一个一维数组组的每个元素又是一个一维数组.似似iArr,把把iArr当当作一维数组看待作一维数组看待,iArr有有3个元素个元素,分不为分不为iArr0,iArr1,iArr2,每个元素是一个有每个元素是一个有4个整型个整型元素构成的一维数组元素构成的一维数组.11.3.2 二维数组与指针二维数组与指针1. 懂得二维数组懂得二维数组iArri1有两层含义有两层含义,它既是它既是“一维数组一维数组iArr”的数组元的数组元素素,又是一维数组名又是一维数组名.iArr1是数组是数组iArr的一个数组元素;的一个数组元素;同时同时,iArr1是一个一维数组名是一个一维数组名,含有含有iAr

32、r10,iArr11,iArr12,iArr13四个元素四个元素.11.3.2 二维数组与指针二维数组与指针1. 懂得二维数组(对比一维)懂得二维数组(对比一维)对一维数组对一维数组:int iArr14=11,12,13,14;iArr1是一个其数组元素类型的常量地址是一个其数组元素类型的常量地址,即即int型的常型的常量地址量地址,那么那么iArr1+1的值会跃过一个数组元素的值会跃过一个数组元素,即即跃过跃过4个字节(假定一个个字节(假定一个int,4个字节)个字节).对当作一维数组的对当作一维数组的“iArr”,iArr是一个其数组元素类型是一个其数组元素类型的常量地址的常量地址,它的

33、数组元素为它的数组元素为iArri1(iArri1为为4个个int类型的一维数组)类型的一维数组),所以所以iArr为大小为为大小为4的一的一维整型数组型的常量地址维整型数组型的常量地址,那么那么iArr+1的值会跃过的值会跃过一个数组元素一个数组元素,即跃过大小为即跃过大小为4的一维整型数组的一维整型数组(一行(一行,16个字节个字节,假定一个假定一个int为为4个字节)个字节).所以所以也把也把iArr称为行地址称为行地址.11.3.2 二维数组与指针二维数组与指针1. 懂得二维数组(对比一维)懂得二维数组(对比一维)在一维数组中在一维数组中iArr1中中,iArr1i1等价于等价于*(

34、iArr1+i1),代代表取出第表取出第i1个元素个元素.在二维数组在二维数组iArr中中,iArri1也等价于也等价于*(iArr+i1),iArri1和和*( iArr+i1)是一维数组的数组名和首地址是一维数组的数组名和首地址.因为因为iArri1和和*(iArr+i1)为一维数组为一维数组,为整数类型常量为整数类型常量地址地址,所以所以iArri1+1和和*(iArr+i1)+1都会跃过一个都会跃过一个整型信息(一列整型信息(一列,4个字节个字节,假定一个假定一个int为为4个字个字节)节),所以所以,也把也把iArri1和和*(iArr+i1)称为列地址称为列地址.11.3.2 二维

35、数组与指针二维数组与指针1. 懂得二维数组(对比一维)懂得二维数组(对比一维)行地址(一维数组地址)行地址(一维数组地址),一次跃过一行一次跃过一行,似似iArr、iArr+i1、 &iArri1、&*(iArr+i1);列地址(信息元素)列地址(信息元素),一次跃过一列一次跃过一列,似似 *iArr、*(iArr+i1)、iArri1.*(*(iArr+1)+2): iArr+1一行指针,*(iArr+1)一列指针,*(iArr+1)+2 一行二列地址,*(*(iArr+1)+2) 一行二列地址间接会见到iArr12,值为7. 11.3.2 二维数组与指针二维数组与指针例例1

36、1.9 行列地址行列地址#include int main() int iArr34=1,2,3,4,5,6,7,8,9,10,11,12; *行地址行地址* printf(行地址行地址n); printf(iArr=%x , ,iArr); printf(iArr+1=%xn,iArr+1); printf(&iArr0=%x , ,&iArr0); printf(&iArr0+1=%xn,&iArr0+1); printf(&*(iArr+0)=%x , ,&*(iArr+0); printf(&*(iArr+0)+1=%xn,&am

37、p;*(iArr+0)+1); *列地址列地址* printf(列地址列地址n); printf(*iArr=%x , ,*iArr); printf(*iArr+1=%xn,*iArr+1); printf(iArr0=%x , ,iArr0); printf(iArr0+1=%xn,iArr0+1); printf(*(iArr+0)=%x , ,*(iArr+0); printf(*(iArr+0)+1=%xn,*(iArr+0)+1);程序运行结论程序运行结论:行地址行地址iArr=12ff50 , iArr+1=12ff60&iArr0=12ff50 , &iArr0

38、+1=12ff60&*(iArr+0)=12ff50 , &*(iArr+0)+1=12ff60列地址列地址*iArr=12ff50 , *iArr+1=12ff54iArr0=12ff50 , iArr0+1=12ff54*(iArr+0)=12ff50 , *(iArr+0)+1=12ff54信息元素信息元素iArr12=7 *会见元素会见元素* printf(信息元素信息元素n); printf(iArr12=%dn,*(*(iArr+1)+2); return 0;11.3.2 二维数组与指针二维数组与指针2.指向一维数组的指针指向一维数组的指针 对一维数组对一维数组i

39、nt iArr14;能够把能够把iArr赋值给指向赋值给指向int型的指针变量型的指针变量.似似:int *pi1; pi1=iArr1;对二维数组对二维数组int iArr34=1,2,3,4,5,6,7,8,9,10,11,12;同样能够把同样能够把iArr赋值给指向一维数组的指针变量赋值给指向一维数组的指针变量,因为因为二维数组能够算作以一维数组为成员的一维数组二维数组能够算作以一维数组为成员的一维数组.int (*pia)4;它示意它示意pia是一个指针变量是一个指针变量,它指向见谅它指向见谅4个元素的一维个元素的一维数组数组.接着便能够赋值接着便能够赋值:pia=iArr;11.3.

40、2 二维数组与指针二维数组与指针2.指向一维数组的指针指向一维数组的指针 pia指向第一个一维数组指向第一个一维数组iArr0,其值等于其值等于iArr.而而pia+1那么指向一维数组那么指向一维数组iArr1.早年面的行列地址对比早年面的行列地址对比可猎取可猎取*(pia+iRow)+iCol是二维数组是二维数组iRow行行iCol 列的元素的地址列的元素的地址,而而*(*(pia+iRow)+iCol)那么是那么是iRow行行iCol列元素的值列元素的值.11.3.2 二维数组与指针二维数组与指针2.指向一维数组的指针指向一维数组的指针 指向一维数组的指针变量定义的一样形式为指向一维数组的

41、指针变量定义的一样形式为: 类型讲明符类型讲明符 (*指针变量名指针变量名)数组长度数组长度;其中其中“类型讲明符类型讲明符”为所指数组的数组元素类型为所指数组的数组元素类型,“*”示意其后的变量是指针类型示意其后的变量是指针类型,“数组长度数组长度”示意所示意所指向一维数组的长度指向一维数组的长度.应注重应注重“(*指针变量名指针变量名)”两两边的括号不可少边的括号不可少,似贫乏括号那么示意是指针数组似贫乏括号那么示意是指针数组(背面讲解背面讲解),意义便完全差别了意义便完全差别了.能够如此懂得能够如此懂得:先看小括号内先看小括号内,有有*号是在定义指针变量;号是在定义指针变量;接着是中括号

42、接着是中括号,示意指针变量指向该长度的一维数示意指针变量指向该长度的一维数组;末了看类型讲明符组;末了看类型讲明符,示意该数组的每个元素为示意该数组的每个元素为类型讲明符讲明的类型类型讲明符讲明的类型.11.3.2 二维数组与指针二维数组与指针例例11.10 一个学习小组有一个学习小组有5个人个人,每个人有每个人有3门课的考试成绩门课的考试成绩.要求操纵函数统要求操纵函数统计每门课程的平均成绩计每门课程的平均成绩似似: 赵赵钞票钞票 孙孙李李张张Math 80 61598576C 7565638777English 9271709085咨询题对比咨询题对比:可定义一个二维数组可定义一个二维数组

43、score35存储五个人存储五个人3门课的成绩门课的成绩.再定义一个一维再定义一个一维数组数组courseAverage3存储统计所得各门课平均成绩存储统计所得各门课平均成绩.要完成的两个函数都要接收一门课程(数组的一行)为指标要完成的两个函数都要接收一门课程(数组的一行)为指标,所以应该设指所以应该设指向一维数组的指针为指标向一维数组的指针为指标.算法描述算法描述:1. 依次输入每门课程的成绩(每门课一行)依次输入每门课程的成绩(每门课一行).2. 统计每门课程平均成绩统计每门课程平均成绩,即对每行统计平均成绩(函数完成)即对每行统计平均成绩(函数完成).3. 输出每门课程平均成绩输出每门课

44、程平均成绩.11.3.2 二维数组与指针二维数组与指针#include int main() int i,j; float sum; float score35; *存储成绩存储成绩* float courseAverage3;*存储每门课程平均成绩存储每门课程平均成绩* float average(float (*p)5); *输入成绩输入成绩* for(i=0;i3;i+) *行(每门课)循环行(每门课)循环* for(j=0;j5;j+) *行内每列循环行内每列循环* scanf(%f,&scoreij); *输出成绩表输出成绩表* for(i=0;i3;i+) *行(每门课)循

45、环行(每门课)循环* for(j=0;j5;j+) *行内每列循环行内每列循环* printf(%ft,scoreij); printf(n); *每行结束输出一个换行每行结束输出一个换行* *统计平均成绩统计平均成绩* for(i=0;i3;i+) *行(每门课)循环行(每门课)循环* courseAveragei=average(score+i);*每行地址为指标每行地址为指标* *输出成绩表输出成绩表* for(i=0;i3;i+) printf(%ft,courseAveragei); return 0;*统计平均成绩统计平均成绩,指标为行地址指标为行地址(指向一维数组指针)(指向一维

46、数组指针)*float average(float (*p)5) int i; float sum=0; for(i=0;i5;i+) * *p转为列地址转为列地址,(*p+i)偏移偏移i,间接会见间接会见*(*p+i) *sum+=*(*p+i); return sum5;11.3.3 指针数组指针数组一个数组的元素值为指针一个数组的元素值为指针,那么该数组称为指针数组那么该数组称为指针数组.指针数组全部元素都必须是指向一样信息类型的指针指针数组全部元素都必须是指向一样信息类型的指针.指针数组定义的一样形式为指针数组定义的一样形式为: 类型讲明符类型讲明符 *数组名数组名数组长度数组长度;能

47、够如此懂得能够如此懂得:先看先看“数组名数组名数组长度数组长度”,示意定义一示意定义一个该长度的一维数组;接着看个该长度的一维数组;接着看“类型讲明符类型讲明符 *”,示示意该数组的每个元素为指向该类型讲明符类型的意该数组的每个元素为指向该类型讲明符类型的指针指针.例似例似:int *pa3;示意示意pa是一个指针数组是一个指针数组,它有三个数组元素它有三个数组元素,每个元素每个元素值根基上一个指针值根基上一个指针,指向整型变量指向整型变量.11.3.3 指针数组指针数组例例11.11 通过指针数组会见二维数组通过指针数组会见二维数组#include int main() int iArr34

48、=1,2,3,4,5,6,7,8,9,10,11,12; int *pa3;*指针数组指针数组,每个成员根基上指向每个成员根基上指向int型的指型的指针针* int iRow; pa0=iArr0; *iArr0为一维数组名为一维数组名,为为int型地址型地址* pa1=iArr1; pa2=iArr2; for(iRow=0;iRow3;iRow+) printf(%d,%d,%d,%dn,*paiRow,*(paiRow+1), *(paiRow+2),*(paiRow+3); return 0;程序运行结论程序运行结论:1,2,3,45,6,7,89,10,11,12 11.3.3 指针

49、数组指针数组例例11.11 通过指针数组会见二维数组通过指针数组会见二维数组11.3.4 指向指针的指针指向指针的指针 对一维数组对一维数组int iArr15;数组成员类型是数组成员类型是int,一维数组名一维数组名iArr1是指向是指向int的指针的指针常量常量,是指向其成员类型的指针常量是指向其成员类型的指针常量.对指针数组对指针数组int *pa3;数组成员类型是数组成员类型是int *,一维数组名一维数组名pa是指向是指向int *的指针的指针常量常量,同样是指向其成员类型(指向整形的指针)同样是指向其成员类型(指向整形的指针)的指针常量的指针常量,也便是讲也便是讲pa是指向指向整型

50、指针的指是指向指向整型指针的指针针.11.3.4 指向指针的指针指向指针的指针 指向指针的指针定义的一样形式为指向指针的指针定义的一样形式为:类型讲明符类型讲明符 *变量名变量名;能够如此懂得能够如此懂得:先看先看“*变量名变量名”,示意定义一个指针变示意定义一个指针变量;接着看量;接着看“类型讲明符类型讲明符 *”,示意该指针变量为指示意该指针变量为指向向“类型讲明符类型讲明符 *”类型的指针类型的指针.char *ppc;char c1=A;char *pc;char *ppc;pc=&c1;ppc=&pc; c1、*pc、*ppc的值都为的值都为A;分不为直截了当会见、间

51、接会见、二级间接会见分不为直截了当会见、间接会见、二级间接会见11.3.4 指向指针的指针指向指针的指针 例例11.12 不移动信息不移动信息,通过改变指针使得通过改变指针使得追加信息有序追加信息有序#include int main() int iArr5=1,5,7,9; int *pa5=&iArr0,&iArr1,&iArr2,&iArr3,0; int *ppi,i1; *-输出原来输出原来4个有序信息个有序信息-* printf(输出原来输出原来4个有序信息个有序信息n); ppi=pa;*ppi和和pa同样为指向整型的指针的指针同样为指向整型的指针

52、的指针 * for(i1=0;i14;i1+) printf(%dn,*ppi); ppi+; *-追加一个信息追加一个信息,原来信息不动原来信息不动,调整指针数组调整指针数组,通过指针数组会见通过指针数组会见仍旧有序仍旧有序-* iArr4=3; pa1=&iArr4; pa2=&iArr1; pa3=&iArr2; pa4=&iArr3; *-输出追加输出追加1个之后的个之后的5个有序信息个有序信息-* ppi=pa;*指针回到前面指针回到前面* printf(输出追加之后输出追加之后5个有序信息个有序信息n); for(i1=0;i15;i1+) prin

53、tf(%dn,*ppi);ppi+; return 0;程序运行结论程序运行结论:输出原来输出原来4个有序信息个有序信息1579输出追加输出追加1个之后的个之后的5个有序个有序信息信息1357911.3.4 指向指针的指针指向指针的指针 11.4.1 指针作函数指标指针作函数指标 例例11.13 交流变量信息交流变量信息交流形参指针变量交流形参指针变量#include void swap(int *pi1Copy,int *pi2Copy) int *piTemp; piTemp=pi1Copy; pi1Copy=pi2Copy; pi2Copy=piTemp;int main() int i

54、1=3,i2=4; int *pi1,*pi2; pi1=&i1; pi2=&i2; swap(pi1,pi2); printf(i1=%dni2=%dn,i1,i2); return 0; 11.4.1 指针作函数指标指针作函数指标 例例11.13 交流变量信息交流变量信息交流形参指针变量交流形参指针变量11.4.1 指针作函数指标指针作函数指标 例例11.14 交流形参指针变量所指向的变量交流形参指针变量所指向的变量#include void swap(int *pi1Copy,int *pi2Copy) int iTemp=0; *交流形参指针变量所指向的变量交流形参指针

55、变量所指向的变量, 实参不受作用实参不受作用,但是实参所指向但是实参所指向 信息改变了信息改变了* iTemp=*pi1Copy; *用的间接会见用的间接会见,现实上是会见现实上是会见i1、i2* *pi1Copy=*pi2Copy; *pi2Copy=iTemp;int main() int i1=3,i2=4; int *pi1,*pi2; pi1=&i1; pi2=&i2; swap(pi1,pi2); printf(i1=%dni2=%dn, i1,i2); return 0;11.4.1 指针作函数指标指针作函数指标 例例11.14 交流形参指针变量所指向的变量交流形

56、参指针变量所指向的变量11.4.1 指针作函数指标指针作函数指标 例例11.14 交流形参指针变量所指向的变量交流形参指针变量所指向的变量如果把如果把swap函数改成下面的写法函数改成下面的写法:void swap(int *pi1Copy,int *pi2Copy) int *ipTemp; *ipTemp=*pi1Copy; * ipTemp指向哪里?指向哪里? * *pi1Copy=*pi2Copy; *pi2Copy=*ipTemp;11.4.2 指针作函数指标指针作函数指标 例例11.16 对数组中的每个元素加对数组中的每个元素加1#include int main() int iA

57、rr13=2,5,3,iJ; void add(int iArr23); *输出数组输出数组* for(iJ=0;iJ=2;iJ+)printf(%d ,iArr1iJ); printf(n); add(iArr1);*数组名做为实参数组名做为实参,注重注重,只有数组名只有数组名,没有下标没有下标* *函数调用后函数调用后,输出数组输出数组* for(iJ=0;iJ=2;iJ+)printf(%d ,iArr1iJ); printf(n); return 0;void add(int iArr23) int iI; for(iI=0;iI=2;iI+) iArr2iI+;11.4.2 数组名作

58、函数指标数组名作函数指标 指针变量地址指针变量地址,所以实指标组与形指标组能够用指针变量取代所以实指标组与形指标组能够用指针变量取代pi=iArr1;add(pi);*指针变量做为实参指针变量做为实参*void add(int* iArr2) *指针变量作形参指针变量作形参*还能够实参用数组名还能够实参用数组名,形参用变量名形参用变量名,似似:add(iArr1);*数组名做为实参数组名做为实参*void add(int* iArr2) *指针变量作形参指针变量作形参*也能够用指针变量作实参也能够用指针变量作实参,数组名做为形参数组名做为形参,似似:pi=iArr1;add(pi);*指针变量

59、做为实参指针变量做为实参*void add(int iArr23) *数组名做为形参数组名做为形参*11.4.2 数组名作函数指标数组名作函数指标 回纳起来回纳起来,似果有一个实指标组似果有一个实指标组,想在函数中改变此想在函数中改变此数组的元素的值数组的元素的值,实介入形参的对应关系有以下种实介入形参的对应关系有以下种:(1) 形参和实参根基上数组名形参和实参根基上数组名.(2) 实参用数组实参用数组,形参用指针变量形参用指针变量.(3) 实参、型参都用指针变量实参、型参都用指针变量.(4) 实参为指针变量实参为指针变量,型参为数组名型参为数组名.往往情况下往往情况下,为了能够让函数操作差别

60、长度的数组为了能够让函数操作差别长度的数组,能够在能够在指标中增加一操作信息长度的形参变量指标中增加一操作信息长度的形参变量.还有函数的返回值还有函数的返回值只有一个只有一个,如果需要函数返回多个同类型结论信息如果需要函数返回多个同类型结论信息,也能够也能够操纵数组作函数指标操纵数组作函数指标,见例见例.2 指针作函数指标指针作函数指标 例例11.20 把给定整数数组中能被把给定整数数组中能被3整除的信息挑出来整除的信息挑出来#include int select(int *piSourceCopy,int iN,int *piTargetCopy) int i1,iNum=0; for(i1=0;i1iN;i1+) if(piSourceCopyi1%3=0) piTargetCopyiNum+=piSourceCopyi1; return iNum;int main() int iArrSource10=5,15,25,36,47,58,69,78,56,90; int iArrTarget10;*存放结论存放结论* int i1,iNum=0; iNum=select(iArrSource,10,iArrTarget); for(i1=0;i1i

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论