(7)--C语言课件第07章指针.ppt

上传人:奉*** 文档编号:96451784 上传时间:2023-11-29 格式:PPT 页数:56 大小:352.40KB
返回 下载 相关 举报
(7)--C语言课件第07章指针.ppt_第1页
第1页 / 共56页
(7)--C语言课件第07章指针.ppt_第2页
第2页 / 共56页
点击查看更多>>
资源描述

《(7)--C语言课件第07章指针.ppt》由会员分享,可在线阅读,更多相关《(7)--C语言课件第07章指针.ppt(56页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、指针指针指针是指针是C语言最具特色的部分,语言最具特色的部分,功能强大功能强大,极其灵活极其灵活。同时也是。同时也是C语言中的难点。语言中的难点。那么,到底什么是指针呢?那么,到底什么是指针呢?变量的地址变量的地址C语言程序中的变量,按照其类型不同,分语言程序中的变量,按照其类型不同,分配一定数目的内存单元。配一定数目的内存单元。例如:例如:一个一个char型变量占型变量占1个个单元,单元,一个一个int型变量占型变量占4个个单元单元,一个一个double型变量占型变量占8个个单元。单元。i的第的第1个字节个字节i的第的第2个字节个字节i的第的第3个字节个字节i的第的第4个字节个字节20002

2、00120022003若有若有inti;则变量则变量i的的地址是哪地址是哪一一个呢个呢?单元地址单元地址 单元内容单元内容C C语言规定:语言规定:一个变量所占一个变量所占内存单元区内存单元区的的首地址首地址,称为,称为该该变量的地址变量的地址。变量的指针变量的指针一个变量的一个变量的地址地址,也称为该变量的,也称为该变量的指针指针。指针变量指针变量用于存储另一个变量用于存储另一个变量地址(指针)值地址(指针)值的变的变量,称为量,称为指针变量指针变量。指针变量的定义指针变量的定义格式:格式:类型名类型名*指针变量名指针变量名例如:例如:int*p1,*p2;float*q1,*q2;注意:注

3、意:*不是变量名的一部分。不是变量名的一部分。两个与两个与指针指针操作操作密切相关密切相关的运算符的运算符取地址运算符取地址运算符&间接引用运算符间接引用运算符*取地址运算符取地址运算符&格式:格式:&变量名变量名功能:功能:获取变量的地址。获取变量的地址。例如:例如:&a【例【例】获取变量的地址示例。获取变量的地址示例。#include#include int main(void)int main(void)int i,*q;int i,*q;q=&i;q=&i;/*/*将变量将变量i i的地址赋给指针变量的地址赋给指针变量q*/q*/printf(q=%pn,q printf(q=%pn,

4、q););return return 0;0;间接引用运算符间接引用运算符*格式:格式:*指针变量名指针变量名功能:功能:用于用于间接引用间接引用该指针变量该指针变量所指向的所指向的变量变量。例如:例如:*q【例例】通过指针变量实现间接引用。通过指针变量实现间接引用。#includeintmain(void)inta,b,*p,*q;a=10;b=20;p=&a;/*令令p指向指向a*/q=&b;/*令令q指向指向b*/*p=100;*q=200;printf(%d,%dn,a,b);printf(%d,%dn,*p,*q);return0;变量的两种引用方式变量的两种引用方式直接引用直接引用

5、:通过变量名本身访问一个变:通过变量名本身访问一个变量。量。例如:例如:a=10间接引用间接引用:通过指针变量对另一个变量:通过指针变量对另一个变量进行访问。进行访问。例如:例如:*p1=100注意:注意:定义指针变量时的定义指针变量时的“*”,不是,不是间接引间接引用运算符用运算符。例如:例如:inta,b,*p1,*p2;指针变量的初始化指针变量的初始化例如:例如:inti,*p=&i;注意:注意:上述语句的功能相当于上述语句的功能相当于inti,*p;p=&i;/*令令p指向指向i*/而不是而不是inti,*p;*p=&i;/*不是令不是令*p指向指向i*/练习:用间接引用形式重写下列程

6、序:练习:用间接引用形式重写下列程序:#include#include int main(void)int main(void)int a,b,t;int a,b,t;scanf(%d%d,&a,&b);scanf(%d%d,&a,&b);t=a;t=a;a=b;a=b;b=t;/*b=t;/*次序不能写错次序不能写错*/printf(a=%d,b=%dn,a,b);printf(a=%d,b=%dn,a,b);return 0return 0;【例例】通过间接引用交换两个变量的值。通过间接引用交换两个变量的值。#includeintmain(void)inta,b,t,*p,*q;a=100

7、;b=200;p=&a;q=&b;t=*p;*p=*q;*q=t;printf(a=%d,b=%dn,a,b);return0;注意,注意,上述程序若改为:上述程序若改为:#includeintmain(void)inta,b,*p,*p1,*p2;a=100;b=200;p1=&a;p2=&b;p=p1;p1=p2;p2=p;printf(a=%d,b=%dn,a,b);return0;则则a,b的值将保持不变。的值将保持不变。几点说明:几点说明:在语言中,内存单元是在语言中,内存单元是由由编译系统编译系统负责管负责管理和分配的。理和分配的。用户并不知道哪些内存单元是用户并不知道哪些内存单元

8、是空闲可用的空闲可用的,因此因此不能由用户直接分配不能由用户直接分配指定的内存单指定的内存单元元。【错例错例1】#includeintmain(void)int*p;p=2000;/*不能直接用整数给指针变量赋值不能直接用整数给指针变量赋值*/*p=100;printf(*p=%dn,*p);return0;通过指针变量进行间接引用时,只能引用通过指针变量进行间接引用时,只能引用在当前程序中已分配的内存空间(比如在当前程序中已分配的内存空间(比如某个已定义的变量)某个已定义的变量)。未经未经赋值的指针变量不能进行间接引用,赋值的指针变量不能进行间接引用,因为这种指针指向随机地址的内存单元,因为

9、这种指针指向随机地址的内存单元,因此有可能造成内存数据的覆盖,甚至因此有可能造成内存数据的覆盖,甚至系统崩溃系统崩溃。【错例错例2】#includeintmain(void)int*p;*p=100;/*指针变量指针变量p未经赋值未经赋值*/printf(*p=%dn,*p);return0;当间接引用运算符与其他运算符同时使用时,当间接引用运算符与其他运算符同时使用时,要注意区分它们的优先级与结合性。要注意区分它们的优先级与结合性。例如例如:y=+*p等价于等价于y=+(*p)y=*p+等价于等价于y=*(p+)指针与数组指针与数组C语言中数组与指针具有语言中数组与指针具有密不可分密不可分的

10、关系。的关系。指向一维数组元素的指针指向一维数组元素的指针一维数组的元素一维数组的元素也是变量也是变量。故每个数组元素。故每个数组元素也有一个指针(地址)。也有一个指针(地址)。例如:例如:inta10,*p,*q;p=&a0;q=&a3;为使用方便,为使用方便,C语言规定:语言规定:可以用一维数组的可以用一维数组的数组名数组名,来代表该数组,来代表该数组0号元素号元素的地址。的地址。例如:例如:inta10,*p;则则p=a;等价于等价于p=&a0;通过指针引用数组元素通过指针引用数组元素若有若有inta10,*p;p=a;那么,那么,p+1将指向哪一个将指向哪一个内存单元内存单元呢?呢?为

11、使用方便,为使用方便,C语言规语言规定:定:1.若指针变量若指针变量p指向指向一维数组一维数组中的某个元中的某个元素,则素,则p+1将指向该将指向该数组中的数组中的下一个元素下一个元素。2.如果如果a是一个一维数组,是一个一维数组,那么那么a+i就是数组元素就是数组元素ai的地址的地址(等价于(等价于&ai);从而从而*(a+i)就代表数组元素就代表数组元素ai。3.如果如果a是一个一维数组,是一个一维数组,而指针变量而指针变量p指向指向a0,那么,那么p+i就是数组元就是数组元素素ai的地址的地址(等价(等价于于&ai);从而从而*(p+i)就代表数组元就代表数组元素素ai。【例例】输入十个

12、整数存入数组中,再按反序输出。输入十个整数存入数组中,再按反序输出。【方法一方法一】用数组名(用数组名(不用数组运算符不用数组运算符)访问数组元)访问数组元素。素。#includeintmain(void)inta10,i;for(i=0;i=0;i-)/*printf(%d,ai);*/printf(%d,*(a+i);return0;练习:用练习:用指针形式指针形式重写下列程序:重写下列程序:#includemain()inta10,max,i;for(i=0;i=9;i+)scanf(%d,&ai);max=a0;for(i=1;imax)max=ai;printf(max=%dn,ma

13、x);1329561maxa0a1a2a3a4a5【方法二方法二】用指针变量访问数组元素。用指针变量访问数组元素。#includeintmain(void)inta10,i,*p=a;for(i=0;i=0;i-)/*printf(%d,ai);*/printf(%d,*(p+i);return0;虽然此处的虽然此处的p是一个是一个指针变量指针变量而不是一个数而不是一个数组,组,但是但是C语言却允许将指针形式的语言却允许将指针形式的*(p+i)表示表示为为数组元素形式数组元素形式的的pi。【例例】#includeintmain(void)inta10,i,*p=a;for(i=0;i=0;i-

14、)/*printf(%d,ai);*/printf(%d,pi);return0;【方法三方法三】通过通过改变指针变量的值改变指针变量的值访问数组访问数组元素。元素。问题分析:问题分析:先用先用顺序结构顺序结构实现数组元素的输入输出。实现数组元素的输入输出。#includeintmain(void)inta10,*p;scanf(%d,a);scanf(%d,a+1);scanf(%d,a+2);scanf(%d,a+3);scanf(%d,a+9);可归纳为如下循环:可归纳为如下循环:for(p=a;p=a;p-)printf(%d,*p);【方法三方法三】完整源程序:完整源程序:#incl

15、udeintmain(void)inta10,*p;for(p=a;p=a;p-)printf(%d,*p);return0;两点说明:两点说明:1.1.数组名数组名是是指针常量指针常量。若有若有int a10,*p;int a10,*p;p=a;p=a;则则a a为指针为指针常量,常量,p p为指针为指针变量变量。故故p=p+1p=p+1可以,而可以,而a=a+1a=a+1不可。不可。2.两个两个同类型同类型的指针可以的指针可以相减相减、相比较相比较,但不能但不能相加相加。例如:例如:inta10,*p,*q;p=&a0;q=&a3;则则q-p的结果的结果等于等于3。指针与二维数组指针与二维

16、数组(关于二维数组的辨证法之一)(关于二维数组的辨证法之一)设有二维数组设有二维数组inta34,则其则其第第i行行的所有元素的所有元素ai0,ai1,ai2,ai3,也可看作一个也可看作一个一维数组一维数组,其,其数组名为数组名为ai。指针与二维数组指针与二维数组故故ai是是第第i行行0号元素号元素ai0的地址,的地址,而而ai+j是元素是元素aij的地址。的地址。故数组元素故数组元素aij,也可表示为,也可表示为*(ai+j)。【例例】分行输出二维数组所有元素的值,要求使分行输出二维数组所有元素的值,要求使用二维数组用二维数组各行的数组名各行的数组名引用数组元素。引用数组元素。源程序:源程

17、序:#includestdio.hmain()inta34=0,1,2,3,4,5,6,7,8,9,10,11;inti,j;for(i=0;i3;i+)for(j=0;j4;j+)printf(%4d,*(ai+j);printf(n);(关于二维数组的辨证法之二)(关于二维数组的辨证法之二)若将二维数组的一行看做一个若将二维数组的一行看做一个数组元素数组元素,则整个二维数组将变成一个一维数组。则整个二维数组将变成一个一维数组。它的三个元素分别是它的三个元素分别是a0,a1,a2。该数组的数组名该数组的数组名a,是,是a0(即第(即第0行)的行)的地址,地址,而而a+i就是就是ai(即第(即

18、第i行)的地址。行)的地址。因为因为*(a+i)等价于等价于ai(即第(即第i行的数组名)行的数组名),故故*(a+i)也是第也是第i行行0号元素号元素ai0的地的地址,址,而而*(a+i)+j是数组元素是数组元素aij的地址。的地址。故数组元素故数组元素aij也可表示为也可表示为*(*(a+i)+j)。注意:注意:a和和a+i是是行指针行指针。(加一则指向下一行)(加一则指向下一行)ai、*(a+i)和和ai+j、*(a+i)+j是是元素指针元素指针。(加一则指向下一个元素)(加一则指向下一个元素)【例例】分行输出二维数组所有元素的值,要求使分行输出二维数组所有元素的值,要求使用二维数组的数

19、组名引用数组元素。用二维数组的数组名引用数组元素。源程序:源程序:#includestdio.hmain()inta34=0,1,2,3,4,5,6,7,8,9,10,11;inti,j;for(i=0;i3;i+)for(j=0;j4;j+)printf(%4d,*(*(a+i)+j);printf(n);行指针变量行指针变量可以定义行指针变量以存储二维数组中可以定义行指针变量以存储二维数组中行行指针指针的值。的值。定义行指针变量的一般形式为:定义行指针变量的一般形式为:类型说明符类型说明符(*变量名变量名)行长度行长度;例如:例如:int(*p)4,a34;p=a+1;【例例】使用使用行指

20、针变量行指针变量输出二维数组中所有元素的值。输出二维数组中所有元素的值。源程序:源程序:#includestdio.hmain()inta34=0,1,2,3,4,5,6,7,8,9,10,11,i,j;int(*p)4;/*定义行指针变量定义行指针变量*/p=a;/*p指向二维数组指向二维数组a的第的第0行行*/for(i=0;i3;i+)for(j=0;j4;j+)printf(%4d,*(*(p+i)+j);printf(n);指针数组指针数组指针数组是一组具有相同类型的有序指针指针数组是一组具有相同类型的有序指针变量的集合。变量的集合。定义指针数组的一般形式为:定义指针数组的一般形式为

21、:类型说明符类型说明符*数组名数组名数组长度数组长度;例如:例如:int*p3;【例例】使用使用指针数组指针数组分行输出二维数组中所有元素分行输出二维数组中所有元素的值。的值。源程序:源程序:#includestdio.hmain()inta34=0,1,2,3,4,5,6,7,8,9,10,11;int*p3=a0,a1,a2;inti,j;for(i=0;i3;i+)for(j=0;j4;j+)printf(%4d,*(pi+j);printf(n);指向指针的指针指向指针的指针如果在一个指针变量中存储了另一个如果在一个指针变量中存储了另一个指针变量的地址,则称之为指向指针的指指针变量的地

22、址,则称之为指向指针的指针变量(也称为二重指针变量)。针变量(也称为二重指针变量)。二重指针变量定义的一般形式:二重指针变量定义的一般形式:类型说明符类型说明符*变量名变量名;例如:例如:int*p,*q,i;p=&i;q=&p;*q=100;【例例】指向指针的指针示例。指向指针的指针示例。#includemain()inti,*p=&i,*q=&p;i=10;printf(%d,%d,%dn,i,*p,*q);*p=100;printf(%d,%d,%dn,i,*p,*q);*q=200;printf(%d,%d,%dn,i,*p,*q);实际上,实际上,指针数组的数组名指针数组的数组名也是一个指向也是一个指向指针的指针。指针的指针。例如例如:若有若有int*p3,*q;则指针数组名则指针数组名p是指向元素是指向元素p0的指针,的指针,而而p0本身是指向本身是指向int型对象的指针,型对象的指针,因而数组名因而数组名p就是一个指向指针的指针。就是一个指向指针的指针。因此,下面的赋值是正确的:因此,下面的赋值是正确的:q=p;q=p+1;

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 大学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁