c语言程序设计第9章课件.ppt
《c语言程序设计第9章课件.ppt》由会员分享,可在线阅读,更多相关《c语言程序设计第9章课件.ppt(55页珍藏版)》请在三一办公上搜索。
1、1,第8章 指 针,C 语言程序设计,池州师专 计算机中心,2023/7/1,2,8.1 指针和指针变量 8.2 指针与数组 8.3 指针与函数,第8章 指针,2023/7/1,3,8.1 指针和指针变量,main()float x;int y;,8.1.1 指针和指针变量的概念,变量的两个物理意义,变量的内容,变量的地址,2023/7/1,4,8.1 指针和指针变量,main()int a,b,c;a=5;b=3;c=a+b;,8.1.1 指针和指针变量的概念,200020012002200320042005,abc,8,利用变量名存取数据的方式称为“直接存取”方式。,2023/7/1,5,
2、C 语言还提供了对内存单元的“间接存取”方式,5,3,2004,a和b相加的结果(*p=a+b)存放到变量p所指向的内存单元中去。此时c称为指针变量p的目标变量。,p=&c,8,main()int a=5,b=3,c,*p;p=,8.1 指针和指针变量,8.1.1 指针和指针变量的概念,变量的地址称为变量的指针存放地址的变量称为指针变量,2023/7/1,6,main()int a,*p=,2004,8.1 指针和指针变量,8.1.2 指针变量的定义,2000,指针变量初始化,2023/7/1,7,main()int a,*p=,间接存取运算,2004,8.1 指针和指针变量,8.1.3 指针
3、的基本运算,2000,*p=,5,2023/7/1,8,方法1:目标变量值不变,改变指针变量的指向求解。main()int a,b,*p1,*p2,*p;p1=,a=6,b=8max=8,min=6,8.1 指针和指针变量,【例8.1】输入a、b两个整数,使用指针变量按大小顺序输出这两个整数。,2023/7/1,9,方法2:利用指针变量直接改变目标变量的值求解。main()int a,b,t,*p1,*p2;p1=,a=8,b=6max=8,min=6,8.1 指针和指针变量,6,2023/7/1,10,指针的加减运算,8.1 指针和指针变量,8.1.3 指针的基本运算,main()int a
4、=10,20,30,40,50,*p1,*p2;p1=p2=a;printf(p1=%u,*p1=%dn,p1,*p1);p2+=3;printf(p2=%u,*p2=%dn,p2,*p2);,P2=410,*p2=40,指针加减运算要点:只有当指针变量指向数组时指针的加减运算才有意义。指针变量可加减一个整型表达式。如:p1+、p2+3、p2-、p2-2。指针的加减运算是以基类型为单位(即sizeof(类型))的。两个指针变量不能作加法运算,只有当两个指针变量指向同一数组时,进行指针变量相减才有实际意义。如:p2-p1。,2023/7/1,11,指针的关系运算,8.1 指针和指针变量,8.1.
5、3 指针的基本运算,指向同一数组的两个指针可以进行关系运算,表明它们所指向元素的相互位置关系。如:p2 p1、p2=p1。指针与一个整型数据进行比较是没有意义的。不同类型指针变量之间比较是非法的。NULL可以与任何类型指针进行=、!=的关系运算,用于判断指针是否为空指针。,2023/7/1,12,数组名是该数组的指针 a是数组的首地址(即a0的地址),是一个指针常量。a=&a0,a+1=&a1,a+9=&a9 数组元素的下标表示法:a0,a1,ai,a9 数组元素的指针表示法:*(a+0),*(a+1),*(a+i),*(a+9),8.2 指针与数组,8.2.1 指向数组的指针,1.一维数组的
6、指针,例如:int a10,*p;,2023/7/1,13,当p指向a0时,用p表示数组元素 下标法:p0,p1,pi,p9 指针法:*(p+0),*(p+1),*(p+i),*(p+9),8.2 指针与数组,8.2.1 指向数组的指针,1.一维数组的指针,指向一维数组元素的指针变量 由于数组元素也是一个内存变量,所以此类指针变量的定义和使用与指向变量的指针变量相同。例如:int a10,*p;p=a;(或 p=),a,2023/7/1,14,【例8.3】用指针法输出数组元素。main()int a10,i,*p;for(i=0;i10;i+)scanf(%d,a+i);for(i=0;i10
7、;i+)printf(%4d,*(a+i);printf(n);for(p=a,i=0;i10;i+)printf(%4d,*(p+i);printf(n);,8.2 指针与数组,8.2.1 指向数组的指针,1.一维数组的指针,12345678910,1 2 3 4 5 6 7 8 9 10,1 2 3 4 5 6 7 8 9 10,2023/7/1,15,【例8.3】用指针法输出数组元素。main()int a10,i,*p;for(p=a;pa+10;p+)scanf(%d,p);for(p=a;pa+10;p+)printf(%d,*p);printf(n);,8.2 指针与数组,8.2
8、.1 指向数组的指针,1.一维数组的指针,10,2023/7/1,16,数组名是地址,指向数组的指针变量存放的也是地址。通过指针变量也可以引用数组元素。p=&a0 等效于 p=a。,数组名和指向数组的指针变量的区别:指针变量p是变量可以赋值,数组名a是地址常量不能赋值。,8.2 指针与数组,8.2.1 指向数组的指针,用指针变量引用数组元素,必须关注其当前值。例如:p=p+3*(p-1)、p-1等价于a2,2023/7/1,17,【例8.4】输入五个整数,使用指针变量将这五个数 按从小到大排序后输出。main()int a5,*pp,*p,*q,t;for(p=a;p*q)pp=q;if(pp
9、!=p)t=*p;*p=*pp;*pp=t;for(p=a;pa+5;p+)printf(%d,*p);printf(n);,8.2 指针与数组,2023/7/1,18,二维数组的地址 例如:int a34;二维数组名a是数组的首地址。二维数组a包含三个行元素:a0、a1、a2。,三个行元素的地址分别是:a、a+1、a+2。而a0、a1、a2也是地址量,是一维数组名,即*(a+0)、*(a+1)、*(a+2)是一维数组首个元素地址。,8.2 指针与数组,8.2.1 指向数组的指针,2.二维数组的指针,2023/7/1,19,二维数组元素的地址 a0、a1、a2是一维数组名,所以ai+j是数组元
10、素的地址。,数组元素aij的地址可以表示为下列形式:&aij、ai+j、*(a+i)+j,8.2 指针与数组,8.2.1 指向数组的指针,2.二维数组的指针,2023/7/1,20,二维数组元素的表示法 数组元素可用下列形式表示:aij、*(ai+j)、*(*(a+i)+j),8.2 指针与数组,8.2.1 指向数组的指针,2.二维数组的指针,a 是二维数组,根据C的地址计算方法,a经过两次*操作才能访问到数组元素。所以*a 是 a0,*a 才是 a00。a0是a00的地址,*a0是a00。,2023/7/1,21,指向二维数组元素的指针变量,8.2 指针与数组,8.2.1 指向数组的指针,2
11、.二维数组的指针,【例8.5】用指向数组元素的指针变量输出数组元素。main()int a34=0,1,2,3,10,11,12,13,20,21,22,23,i,j,*p;for(p=a0,i=0;i 3;i+)for(j=0;j 4;j+)printf(%4d,*(p+i*4+j);/*元素的相对位置为i*4+j*/printf(n);,这种指针变量的定义及使用与指向一维数组元素的指针变量是相同的,用它存放二维数组元素的地址。,2023/7/1,22,指向一维数组的指针变量 指向一维数组指针变量的定义形式:数据类型标识符(*变量名)元素个数,8.2 指针与数组,8.2.1 指向数组的指针,
12、2.二维数组的指针,“*”表示其后的变量名为指针类型,元素个数表示目标变量是一维数组,并说明一维数组元素的个数。由于“*”比“”的运算级别低,“*变量名”作为一个说明部分,两边必须加括号。“数据类型标识符”是定义一维数组元素的类型。,2023/7/1,23,【例8.6】用指向一维数组的指针变量输出数组元素。main()int a34=0,1,2,3,10,11,12,13,20,21,22,23;int(*lp)4,i,j;for(lp=a,i=0;i3;i+)for(j=0;j4;j+)printf(%4d,*(*(lp+i)+j);printf(n);,8.2 指针与数组,8.2.1 指向
13、数组的指针,2.二维数组的指针,0 1 2 3,10 11 12 13,20 21 22 23,2023/7/1,24,【例8.6】用指向一维数组的指针变量输出数组元素。main()int a 4=0,1,2,3,10,11,12,13,20,21,22,23;int(*lp)4,j;for(lp=a;lpa+3;lp+)for(j=0;j4;j+)printf(%4d,*(*lp+j);printf(n);,8.2 指针与数组,8.2.1 指向数组的指针,2.二维数组的指针,0 1 2 3,10 11 12 13,20 21 22 23,2023/7/1,25,【例8.7】通过初始化使指针指
14、向一个字符串。main()char str1=Good morning!;char*str2=Good night!;printf(%sn,str1);printf(%sn,str2);,8.2 指针与数组,8.2.2 指向字符串的指针变量,1.指向字符串的指针变量的定义及初始化,字符串的两种表示方式:字符数组表示方式,字符串存放在一维数组中,引用时用数组名。字符指针变量表示方式,字符指针变量存放字符串的首地址,引用时用指针变量名。,Good morning!,Good night!,2023/7/1,26,【例8.8】通过赋值运算使字符指针变量指向一个字符串。#include main()c
15、har c80,*str;strcpy(c,How are you?);str=Fine,thanks.;printf(%sn%sn,c,str);,8.2 指针与数组,8.2.2 指向字符串的指针变量,2.字符串的赋值运算,将一个字符串赋给一个字符数组只能使用strcpy函数 将字符串常量的首地址赋给指针变量,可使用赋值运算符“=”,How are you?,Fine,thanks.,2023/7/1,27,【例8.9】利用指针变量输入输出字符串。#include main()char c80,*str;str=c;gets(str);puts(str);,8.2 指针与数组,8.2.2 指
16、向字符串的指针变量,3.字符串的输入输出,使用字符串输入输出函数gets和puts;在scanf和printf函数中使用%s格式实现。输入字符串时,函数参数:数组名、存有数组名的指针变量;输出字符串时,函数参数:数组名、存有字符串首地址的指针变量。,I love China!,I love China!,2023/7/1,28,【例8.11】已知字符串str,从中截取一子串。要求该子串是从str的第m个字符开始,由n个字符组成。思路:定义字符数组c 存放子串,字符指针变量p 用于复制子串,利用循环语句从字符串str截取n个字符。考虑到几种特殊情况:m位置后的字符数有可能不足n个,所以在循环读取
17、字符时,若读到 0 停止截取,利用break语句跳出循环。输入的截取位置m大于字符串的长度,则子串为空。要求输入的截取位置和字符个数均大于0,否则子串为空。,8.2 指针与数组,8.2.2 指向字符串的指针变量,2023/7/1,29,main()char c80,*p,*str=This is a string.;int i,m,n;printf(m,n=);scanf(%d,%d,8.2 指针与数组,从m位置读取n个字符送到c数组,要求位置m和长度n大于0,2023/7/1,30,指针数组定义的一般形式:数据类型标识符*数组名元素个数;在这个定义中由于“”比“*”的优先级高,所以数组名先与
18、“元素个数”结合,形成数组的定义形式,“*”表示数组中每个元素是指针类型,“数据类型标识符”说明指针的目标变量的数据类型。例如:int*ip10;char*cp5;,8.2 指针与数组,8.2.3 指针数组,1.指针数组的定义,指针数组就是数组中的每个元素均为指针类型,2023/7/1,31,例如:char c48=Fortran,COBOL,BASIC,Pascal;char*cp4=c0,c1,c2,c3;char*str5=int,long,char,float,double;int a23;int*p2=a0,a1;,8.2 指针与数组,8.2.3 指针数组,2.指针数组初始化,例如:
19、char c48=Fortran,COBOL,BASIC,Pascal;char*cp4=c0,c1,c2,c3;char*str5=int,long,char,float,double;int a23;int*p2=a0,a1;,2023/7/1,32,【例8.13】用06分别代表星期日至星期六,当输入其中任意一个数字时,输出相应英文单词。main()char*weekname7=Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday;int week;printf(Enter week No.:);scanf(%d,8.2 指针与数
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言程序设计 课件
链接地址:https://www.31ppt.com/p-5376853.html