C程序设计第6章.ppt
《C程序设计第6章.ppt》由会员分享,可在线阅读,更多相关《C程序设计第6章.ppt(68页珍藏版)》请在三一办公上搜索。
1、,C语言程序设计,第6章 指针,第1章 C语言概述,第2章 基本数据类型和运算,第3章 结构化程序设计,第5章 函数,第6章 指针,第7章 复合结构类型,第8章 编译预处理,第4章 数组及字符串,课程概述,附录,6.1 指针的基本概念6.2 指针变量的运算6.3 指向数组元素的指针6.4 指向多维数组的指针变量6.5 指向字符串的指针变量6.6指针型函数6.7指针数组6.8二级指针6.9程序举例6.10用指针进行内存动态分配6.11指针数据类型的总结,第9章 位运算,第10章 文件,指针,第6章,教学目标掌握指针的概念和运算规则掌握用指针访问变量、一维数组和二维数组用指针处理字符串的方法,6.
2、1.1 指针和指针变量,6.1 指针的基本概念,1.指针的概念,2.指针变量,内存单元的编号叫做地址,通常也把这个地址称为“指针”。,6.1.1 指针和指针变量,6.1 指针的基本概念,1.指针的概念,2.指针变量,在语言中,允许用一个变量来存放指针,这种变量称为“指针变量”。,6.1.2 指针变量的定义,1.定义的一般格式,2.举例说明,6.1 指针的基本概念,存储类型 类型说明符*变量名;其中,“*”表示这是一个指针变量,变量名即为定义的指针变量名,类型说明符表示本指针变量所指向的变量的数据类型。一个指针变量只能指向同一种类型的变量,也就是说,不能定义一个既指向一个整型变量又指向一个双精度
3、型变量的指针变量。,6.1.2 指针变量的定义,1.定义的一般格式,2.举例说明,6.1 指针的基本概念,例如:int*m1;表示m1是一个指针变量,它的值是某个整型变量的地址;或者说m1指向一个整型变量。至于m1究竟指向哪一个整型变量,应该由指向m1赋予的地址来决定。再例如:static int*m2;/*m2是指向静态整型变量的指针变量*/float*m3;/*m3是指向浮点型变量的指针变量*/char*m4;/*m4是指向字符型变量的指针变量*/,6.1.3 指针变量赋值,1.变量地址表示方法,2.给指针变量赋地址的方法,语言提供了地址运算符“如:&a表示变量a的地址,&b表示变量b的地
4、址。,6.1 指针的基本概念,3.例6.1,6.1.3 指针变量赋值,1.变量地址表示方法,(1)指针变量初始化的方法。int a;/*定义整型变量a*/int*p=/*将变量a的地址赋给指针p*/,6.1 指针的基本概念,2.给指针变量赋地址的方法,3.例6.1,6.1.3 指针变量赋值,1.变量地址表示方法,【例6.1】用指针变量访问变量中的数据。#includemain()int a,*p;/*定义整型变量a和整型变量指针p*/p=/*输出指针p所指的存储单元的内容*/,6.1 指针的基本概念,2.给指针变量赋地址的方法,3.例6.1,2.取内容运算符*,3.注意事项,取地址运算符“&”
5、是单目运算符,其结合性为自右至左,功能是取变量的地址。在scanf函数中,我们已经认识并使用了&运算符。,1.取地址运算符&,6.2.1 指针运算符,6.2 指针变量的运算,2.取内容运算符*,3.注意事项,取内容运算符“*”是单目运算符,其结合性为自右至左,通过“*”可以存取指针所指的存储单元的内容。在“*”运算符之后跟的变量必须是指针变量。需要注意的是指针运算符“*”和指针变量说明中的指针说明符“*”不是一回事。在指针变量说明中,“*”是类型说明符,表示其后的变量是指针类型。而表达式中出现的“*”则是一个运算符,用以表示指针变量所指的内容。,1.取地址运算符&,6.2.1 指针运算符,6.
6、2 指针变量的运算,2.取内容运算符*,3.注意事项,【例6.2】分析下面程序的运行结果。#includemain()int d,x,*p;/*定义整型变量d、x和整型指针p*/d=10;x=19;p=,1.取地址运算符&,6.2.1 指针运算符,6.2 指针变量的运算,程序的运行结果如下:d=19,2.取内容运算符*,3.注意事项,(1)取地址运算符&表示变量的地址;而取内容运算符*表示指针所指的内容。(2)运算符&只能用于变量和数组元素。(3)*和&都是单目运算符,两者的优先级相同,结合性均是从右到左。(4)&x不能出现在赋值号的左边。(5),因此不能用&取寄存器变量的地址。(6)被赋值的
7、指针变量前不能再加“*”说明符,如写为*p=&a 也是错误的。,1.取地址运算符&,6.2.1 指针运算符,6.2 指针变量的运算,2.取内容运算符*,3.注意事项,【例6.3】通过指针变量访问字符型变量。#includemain()char ch1,ch2;/*定义字符型变量ch1和ch2*/char*p1,*p2;/*定义字符型指针p1和p2*/ch1=A;ch2=B;p1=/*输出指针p1和p2所指的存储单元的内容*/,1.取地址运算符&,6.2.1 指针运算符,6.2 指针变量的运算,程序的运行结果为:A,BA,B,2.指针中加减运算,3.指针变量的关系运算,(1)指针变量初始化赋值时
8、,不要将一个内存地址常量赋给一指针变量。例如:int i=100,x;int*m;:m=,1.赋值运算,6.2.2 指针变量的运算,6.2 指针变量的运算,4.两指针变量相减,2.指针中加减运算,3.指针变量的关系运算,(2)指针变量和一般变量一样,存放在其中的值是可以改变的,也就是说可以改变指针变量的指向,例如:int i,j;int*p1;int*p2;i=c;j=d;p1=上面的程序语句也可以用下面的图来说明。,1.赋值运算,6.2.2 指针变量的运算,6.2 指针变量的运算,赋值运算结果,4.两指针变量相减,2.指针中加减运算,3.指针变量的关系运算,如果此时有如下的赋值表达式:p2=
9、p1;则指针变量p2与p1就指向了同一个对象i,此时的*p2就等价于i,而不再是j了,这种情况可以用如下的图来说明。,1.赋值运算,6.2.2 指针变量的运算,6.2 指针变量的运算,4.两指针变量相减,2.指针中加减运算,3.指针变量的关系运算,再例如,如果执行如下的表达式:*p2=*p1;则此时表示把p1指向的内容赋给p2所指的区域,此时可用下图来表示情形。,1.赋值运算,6.2.2 指针变量的运算,6.2 指针变量的运算,4.两指针变量相减,2.指针中加减运算,3.指针变量的关系运算,(3)如果需要,也可以把数组的首地址赋予指向数组的指针变量。例如:int a8,*pa;pa=a;也可写
10、为:pa=,1.赋值运算,6.2.2 指针变量的运算,6.2 指针变量的运算,4.两指针变量相减,2.指针中加减运算,3.指针变量的关系运算,(4)可以把字符串的首地址赋给指向字符类型的指针变量。例如,把字符串“Hello human”赋给指针变量p,方法如下:char*p;p=Hello human;或用初始化赋值的方法写为:char*p=Hello human;,1.赋值运算,6.2.2 指针变量的运算,6.2 指针变量的运算,4.两指针变量相减,2.指针中加减运算,3.指针变量的关系运算,对于指向数组的指针变量,可以给其加上或减去一个整数n。例如,设p是指向数组m的指针变量,则p+n,p
11、-n,p+,+p,p-,-p都是合法的运算表达式。给指针变量加上或减去一个整数n表示把指针指向的当前位置(指向某数组元素)向前或向后移动n个位置。,1.赋值运算,6.2.2 指针变量的运算,6.2 指针变量的运算,4.两指针变量相减,2.指针中加减运算,3.指针变量的关系运算,指向同一数组的两个指针变量进行关系运算可表示它们所指数组元素之间的关系。例如:p1=p2;/*表示p1和p2指向同一数组元素*/p1p2;/*表示p1处于高地址位置*/p1p2;/*表示p2处于高地址位置*/,1.赋值运算,6.2.2 指针变量的运算,6.2 指针变量的运算,4.两指针变量相减,2.指针中加减运算,3.指
12、针变量的关系运算,4.两指针变量相减,【例6.4】一个关于指针变量关系运算的例子。main()int x,y,z,*max,*min;printf(please input three numbers:n);scanf(%d,%d,%d,1.赋值运算,6.2.2 指针变量的运算,6.2 指针变量的运算,该程序的运行结果如下:please input three numbers:23 34 65the max is:65the min is:23,2.指针中加减运算,4.两指针变量相减,两指针变量也可以进行相减运算,其所得之差是:两个指针所指的数组元素之间相差的元素个数,实际上是两个指针值(地址
13、)相减之差再除以该数组元素的长度(字节数)。例如:p1和p2 是指向同一整型数组的两个指针变量,设p1的值为1100H,p2的值为1050H,由于整型数组每个元素占2个字节,所以p1-p2的结果为(1100H-1050H)/2=25,因此“p1-p2”表示p1和 p2之间相差25个元素。但是,p1和p2不能进行加法运算,因为指针变量相加是毫无意义的。,1.赋值运算,6.2.2 指针变量的运算,6.2 指针变量的运算,3.指针变量的关系运算,2.数组指针变量的说明,3.数组名和数组指针变量作函数参数,第一,一个数组是由连续的一块内存单元组成的。其中的数组名就是这块连续内存单元的首地址。第二,一个
14、数组也是由各个数组元素组成的。第三,数组元素的首地址也是指它所占有的几个内存单元的首地址。,1.几个数组指针变量的关系,6.3 指向数组元素的指针,2.数组指针变量的说明,3.数组名和数组指针变量作函数参数,数组指针变量说明的一般形式为:类型说明符*指针变量名;其中,“类型说明符”表示指针变量所指数组的类型;“*”表示其后的变量是指针变量。用数组指针变量访问数组元素有两种方法:第一种方法为下标法,即用mi形式访问数组元素。第二种方法为指针法,即采用*(pm+i)形式,该方法是用间接访问的方法来访问数组元素。,1.几个数组指针变量的关系,6.3 指向数组元素的指针,2.数组指针变量的说明,3.数
15、组名和数组指针变量作函数参数,【例6.6】采用指针法访问数组元素。#includemain()int m5,i,*pm;pm=m;for(i=0;i5;i+)*pm=i;pm+;pm=m;for(i=0;i5;i+)printf(m%d=%dn,i,*pm);pm+;,1.几个数组指针变量的关系,6.3 指向数组元素的指针,该程序的运行结果如下:m0=0m1=1m2=2m3=3m4=4,2.数组指针变量的说明,3.数组名和数组指针变量作函数参数,【例6.7】与例6.6的本意相同,但是其实现方式不同。#includemain()int m5,i,*pm=m;for(i=0;i5;)*pm=i;p
16、rintf(m%d=%dn,i+,*pm+);,1.几个数组指针变量的关系,6.3 指向数组元素的指针,该程序的运行结果如下:m0=0m1=1m2=2m3=3m4=4,2.数组指针变量的说明,3.数组名和数组指针变量作函数参数,数组名是数组的首地址,实参向形参传送数组名实际上就是传送数组的地址,形参得到该地址后也指向同一数组。指针变量的值也是地址,数组指针变量的值即为数组的首地址,也可作为函数的参数使用。,1.几个数组指针变量的关系,6.3 指向数组元素的指针,2.数组指针变量的说明,3.数组名和数组指针变量作函数参数,【例6.8】编写求五门课程平均成绩的函数,并编写主函数调用该函数。下图所示
17、为对应的N-S流程图。,1.几个数组指针变量的关系,6.3 指向数组元素的指针,2.数组指针变量的说明,3.数组名和数组指针变量作函数参数,程序代码如下:#includefloat aver(float*pm);main()float sco5,av,*sp;int i;sp=sco;printf(n please input 5 scores:n);for(i=0;i5;i+)scanf(%f,1.几个数组指针变量的关系,6.3 指向数组元素的指针,程序的运行结果如下:please input 5 scores:90 45 56 80 100average score is 74.20,6.
18、4 指向二维数组的指针变量,1.二维数组地址的表示方法,2.二维数组的指针变量,语言允许把一个二维数组分解为多个一维数组来处理。因此二维数组m可分解为三个一维数组,即m0、m1、m2。每个一维数组又含有四个元素。例如m0数组,含有m00、m01、m02、m03四个元素。,6.4 指向二维数组的指针变量,1.二维数组地址的表示方法,2.二维数组的指针变量,【例6.9】用不同的方式输出同一数组元素的数据值的应用举例。#includemain()int m34=0,1,2,3,4,5,6,7,8,9,10,11;printf(%d,%d,%d,%d,%d,n,m,*m,m0,其运行结果如下:404,
19、404,404,404,404412,412,412,412,412420,420,420,420,420414,4145,5,6.4 指向二维数组的指针变量,1.二维数组地址的表示方法,2.二维数组的指针变量,二维数组指针变量说明的一般形式为:类型说明符(*指针变量名)长度;其中“类型说明符”为所指数组的数据类型。“*”表示其后的变量是指针类型。“长度”表示二维数组分解为多个一维数组时,一维数组的长度,也就是二维数组的列数。“*(p+i)+j”是二维数组i行j 列的元素的地址,而“*(*(p+i)+j)”则是i行j列元素的值。,6.4 指向二维数组的指针变量,1.二维数组地址的表示方法,2.
20、二维数组的指针变量,【例6.10】二维数组指针变量的应用举例。main()static int m34=0,1,2,3,4,5,6,7,8,9,10,11;int(*p)4;int i,j;p=m;for(i=0;i3;Ifor(j=0;j4;j+)printf(%3d,*(*(p+i)+j);,该程序的运行结果为:0 1 2 3 4 5 6 7 8 9 10 11,6.5 指向字符串的指针变量,1.字符串的表示形式,2.字符串指针变量与字符数组的区别,在C语言中,可以用两种方法访问一个字符串。(1)第一种:用字符串指针指向一个字符串。(2)第二种:用字符数组存放一个字符串,然后输出该字符串。
21、,6.5 指向字符串的指针变量,1.字符串的表示形式,2.字符串指针变量与字符数组的区别,【例6.11】编程实现:把一个字符串的内容复制到另一个字符串中,要求不能使用strcpy函数。函数cprstr的形参为两个字符指针变量pm和pn。其中,pm指向源字符串,pn指向目标字符串。这里要注意表达式“(*pn=*pm)!=0”的用法。程序代码如下:#includecprstr(char*pm,char*pn)/*定义字符串复制函数cpystr*/while(*pn=*pm)!=0)pn+;pm+;,6.5 指向字符串的指针变量,1.字符串的表示形式,2.字符串指针变量与字符数组的区别,main()
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序设计
链接地址:https://www.31ppt.com/p-5426170.html