《C语言程序设计》课件第七章11.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《《C语言程序设计》课件第七章11.ppt》由用户(momomo)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C语言程序设计 语言程序设计 课件 第七 11
- 资源描述:
-
1、C语言程序语言程序电子教案电子教案 主要内容:主要内容:指针的概念指针的概念指针运算指针运算 指针与函数参数指针与函数参数 指针与数组指针与数组 字符指针和字符串字符指针和字符串 函数型指针函数型指针 指针型指针指针型指针 指针是一种指针是一种构造类型数据构造类型数据,利用指针利用指针可以有效地表示复杂的数据结构,动态可以有效地表示复杂的数据结构,动态地分配内存,方便地使用字符串和数组地分配内存,方便地使用字符串和数组,灵活地实现函数间的数据传递,直接,灵活地实现函数间的数据传递,直接处理内存地址等。处理内存地址等。掌握指针的应用,可以使算法表达掌握指针的应用,可以使算法表达更确切,程序更清晰
2、简炼,代码更确切,程序更清晰简炼,代码 更紧更紧凑有效。凑有效。7.1.1 7.1.1 存储单元的地址与内容存储单元的地址与内容 程序一旦被执行,则该程序的指令、常量和程序一旦被执行,则该程序的指令、常量和变量等都要存放在机器的内存中。变量等都要存放在机器的内存中。内存是以字节来划分存储单元的,每个字节内存是以字节来划分存储单元的,每个字节都有一个编号,这就是存储单元的都有一个编号,这就是存储单元的“地址地址”。在计算机中在计算机中 ,根据内存的地址,就可以访,根据内存的地址,就可以访问存储在该单元中的数据。问存储在该单元中的数据。将某存储单元中的数据称为这个存储单元的将某存储单元中的数据称为
3、这个存储单元的“内容内容”。存储单元的地址与内容如下图所示。存储单元的地址与内容如下图所示。.26518.内存内存100010001002100210042010变量变量a a变量变量b b变量变量c c变量变量i i7.1.2 7.1.2 指针和指针变量指针和指针变量 内存变量的三个基本特征:内存变量的三个基本特征:变量名、变量的内容和变变量名、变量的内容和变 量的存储地址。量的存储地址。要访问一个变量,可以有两种方式:要访问一个变量,可以有两种方式:用变量名;用变量的地用变量名;用变量的地 址。址。指针变量使用前应先定义。指针变量使用前应先定义。定义格式:定义格式:类型标识符类型标识符 *
4、标识符标识符 说明:说明:标识符是被定义的指针变量的名字。标识符是被定义的指针变量的名字。类型标识符则表明了该指针变量所指类型标识符则表明了该指针变量所指 向变量的类型。向变量的类型。例如:例如:int int*p;char p;char*ch;ch;1.1.运算符运算符&取地址运算符取地址运算符 运算格式:运算格式:&标识符标识符 *指针运算符指针运算符(间接访问运算符间接访问运算符)运算格式:运算格式:*指针变量指针变量 例如:例如:int int*p,i,j;p,i,j;p=&i;p=&i;j=j=*p;p;表示把变量i的地址赋给指针变量p表示将指针变量所指向的变量i的内容赋给变量j 指
5、针变量一经定义,可以像其它基本类型指针变量一经定义,可以像其它基本类型变量一样引用。变量一样引用。(1)(1)指针变量只接收地址,例如:指针变量只接收地址,例如:int int*pi,pi,*pj,pj,*pk,i,j,k;pk,i,j,k;pi=&i;pi=&i;pj=&j;pj=&j;pk=&k;pk=&k;例如:例如:int int*pi,pi,*pj,i,j;pj,i,j;pi=&i;pi=&i;pj=&j;pj=&j;*pi=0;/pi=0;/*等价于等价于i=0;i=0;*/*pj+=1;/pj+=1;/*等价于等价于j+=1;j+=1;*/*(pi)+;/(pi)+;/*等价于等
6、价于i+;i+;*/切记:指针变量引用前必切记:指针变量引用前必 须指向某个变量。须指向某个变量。例如:例如:#include#includestdio.hstdio.h void main()void main()int int*p;p;*p=100;/p=100;/*错错*/printf(%d n,printf(%d n,*p);p);例如:例如:pi=pj;pi=pj;注意注意:对于指针变量对于指针变量pipi和和pjpj,下面两种赋值的效,下面两种赋值的效 果是不等价的。果是不等价的。pi=pj;pi=pj;和和 *pi=pi=*pj;pj;(4)(4)如果指针变量如果指针变量pipi
7、已经指向变量已经指向变量i i,那么:,那么:&*pipi与与&i&i等价等价。因为两个运算符的优先级别相同,按因为两个运算符的优先级别相同,按自右向自右向左左方向结合,先进行方向结合,先进行*pipi运算,它就是变量运算,它就是变量i i,再,再进行进行&运算,所以运算,所以&*pipi与与&i&i等价。等价。因为先进行因为先进行&i&i运算,其结果是地址,再进行运算,其结果是地址,再进行*运算,相运算,相当于取这个地址中的内容,即当于取这个地址中的内容,即i i的值。故的值。故*&I&I与与i i等价。等价。(6)(6)指针变可以用存储类型说明,对于被说指针变可以用存储类型说明,对于被说
8、明为静态的和外部的指针变量可以被赋明为静态的和外部的指针变量可以被赋 初值初值(初始化初始化)。例如:例如:int int*p,i,p,i,*pi=&i;pi=&i;#include#includestdio.hstdio.h void main()void main()static char a10,static char a10,*pa=a;pa=a;例如:例如:int i,int i,*pi,pi,*ppi;ppi;pi=&i;pi=&i;ppi=πppi=π指向指针变量指向指针变量的指针变量的指针变量ppippi指针变量指针变量pipi变量变量i i200020001000
9、100020002000地址地址2000200010001000地址地址10001000 “空空”值通常作为指针的异常标志。用值通常作为指针的异常标志。用NULLNULL表示,即表示,即全部二进位均为全部二进位均为0 0值。值。NULLNULL其实就是其实就是0 0,但习惯上不用,但习惯上不用0 0而而 用用NULLNULL,办法是通过,办法是通过#define#define定义。定义。例如:例如:#define NULL 0#define NULL 0#include#includestdio.hstdio.h void main()void main()int i,int i,*p;p=N
10、ULL;p;p=NULL;p=i;p=i;if(p=NULL)printf(pointer p is NULL);if(p=NULL)printf(pointer p is NULL);前者是有值的,其值为前者是有值的,其值为0 0,称,称“空值空值”,它表,它表示不指向任何变量;而后者虽未对指针变量赋示不指向任何变量;而后者虽未对指针变量赋值,但并不等于该指针变量无值,只是它的值值,但并不等于该指针变量无值,只是它的值是一个不确定的值,即该指针变量正指向某个是一个不确定的值,即该指针变量正指向某个未知的单元。这时,程序若引未知的单元。这时,程序若引 用这个指针变用这个指针变量,显然是很危险的
11、。所以,在引用一个指针量,显然是很危险的。所以,在引用一个指针变量前,必须先要对它赋值。变量前,必须先要对它赋值。#include#includestdio.hstdio.hvoid main()void main()int i,j,int i,j,*pi,pi,*pj;pj;scanf(%d,%d,&i,&j);scanf(%d,%d,&i,&j);pi=&i;pj=&j;pi=&i;pj=&j;printf(i=%d,j=%dn,i,j);printf(i=%d,j=%dn,i,j);printf(printf(*pi=%d,pi=%d,*pj=%dn,pj=%dn,*pi,pi,*pj)
12、;pj);printf(pi=%u,pj=%un,pi,pj);printf(pi=%u,pj=%un,pi,pj);pi=pj;pi=pj;printf(i=%d,j=%dn,i,j);printf(i=%d,j=%dn,i,j);printf(printf(*pi=%d,pi=%d,*pj=%dn,pj=%dn,*pi,pi,*pj);pj);printf(pi=%u,pj=%un,pi,pj);printf(pi=%u,pj=%un,pi,pj);pi=&i;pj=&j;pi=&i;pj=&j;*pi=pi=*pj;pj;printf(i=%d,j=%dn,i,j);printf(i=%
13、d,j=%dn,i,j);printf(printf(*pi=%d,pi=%d,*pj=%dn,pj=%dn,*pi,pi,*pj);pj);printf(pi=%u,pj=%un,pi,pj);printf(pi=%u,pj=%un,pi,pj);程序运行结果如下:程序运行结果如下:2,82,8i=2,j=8i=2,j=8*pi=2,pi=2,*pj=8pj=8pi=65494,pj=65496pi=65494,pj=65496i=2,j=8i=2,j=8*pi=8,pi=8,*pj=8pj=8pi=65496,pj=65496pi=65496,pj=65496i=8,j=8i=8,j=8*
14、pi=8,pi=8,*pj=8pj=8pi=65494,pj=65496pi=65494,pj=65496#include#includestdio.hstdio.hvoid main()void main()int int*pi,pi,*p2,p2,*p,a,b;p,a,b;scanf(%d,%d,&a,&b);scanf(%d,%d,&a,&b);p1=&a;p1=&a;p2=&b;p2=&b;if(ab)p=p1;p1=p2;p2=p;if(ab)p=p1;p1=p2;p2=p;printf(a=%d,b=%dn,a,b);printf(a=%d,b=%dn,a,b);printf(ma
15、x=%d,min=%dn,printf(max=%d,min=%dn,*p1,p1,*p2);p2);程序运行结果如下:程序运行结果如下:9,189,18a=9,b=18a=9,b=18max=18,min=9max=18,min=9 指针数组指针数组:定义为指针型的数组称为指针数组。定义为指针型的数组称为指针数组。例:利用指针数组对字符型二维数组输入输出。例:利用指针数组对字符型二维数组输入输出。#include#includestdio.hstdio.h void main()void main()char a520,char a520,*p5;p5;int i;int i;for(i=0
16、;i5;i+)for(i=0;i5;i+)pi=ai;pi=ai;for(i=0;i5;i+)for(i=0;i5;i+)scanf(“%s”,pi);scanf(“%s”,pi);for(i=0;i5;i+)for(i=0;i5;i+)printf(“%sn”,pi);printf(“%sn”,pi);数组行指针:用于指向二位数组的某一行的指针称为数组行指针。数组行指针:用于指向二位数组的某一行的指针称为数组行指针。格式:格式:int(int(*p)m;p)m;说明:说明:p p是行是行指针变量;指针变量;m m是数组列大小。是数组列大小。数组元素地址数组元素地址 *(指针变量指针变量+行下
17、标行下标)+列下标列下标 数组元素引用数组元素引用 *(*(指针变量指针变量+行下标行下标)+列下标列下标)例:例:#include#includestdio.hstdio.h void main()void main()int a23,(int a23,(*p)3=a;int i,j;p)3=a;int i,j;for(i=0;i2;i+)for(i=0;i2;i+)for(j=0;j3;j+)scanf(“%d”,for(j=0;j3;j+)scanf(“%d”,*(p+i)+j);(p+i)+j);for(i=0;i2;i+)for(i=0;i2;i+)printf(“n”);print
18、f(“n”);for(j=0;j3;j+)for(j=0;j3;j+)printf(“%10d”,printf(“%10d”,*(*(p+i)+j)(p+i)+j);指针指针:是指向某类型数据的地址。是指向某类型数据的地址。说明:说明:地址的分配是由地址的分配是由C C编译系统决定的;编译系统决定的;指针变量的值是一具体类型的特定变量地址指针变量的值是一具体类型的特定变量地址 所允许的整数,但必须明确:指针不是整数。所允许的整数,但必须明确:指针不是整数。对指针的运算不能像对整型数据那样进行所对指针的运算不能像对整型数据那样进行所 有的算术、逻辑和关系运算,而只能进行有的算术、逻辑和关系运算,
19、而只能进行C C 语言所规定的某些运算。语言所规定的某些运算。指针运算的值与某一类型数据的地址有关。指针运算的值与某一类型数据的地址有关。设设p p、q q是指针变量,是指针变量,n n为一整数,则:为一整数,则:p+np+n、p-np-n、p+p+、p-p-、+p+p、-p-p、p-qp-q都是指针变量允许实施的算术运算,它们的意义都是指针变量允许实施的算术运算,它们的意义分别是:分别是:(1)p+n(1)p+n:表示由:表示由p p所指向位置向高地址移所指向位置向高地址移n n个位移量。个位移量。(2)p-n(2)p-n:表示由表示由p p所指向位置向低地址移所指向位置向低地址移n n个位
20、移量。个位移量。(3)p+:(3)p+:将当前指针将当前指针p p向高地址移一个位移量向高地址移一个位移量 (4)p-(4)p-:将当前指针将当前指针p p向低地址移一个位移量。向低地址移一个位移量。(5)+p(5)+p:将当前指针:将当前指针p p向高地址移一个位移量。向高地址移一个位移量。(6)-p(6)-p:将当前指针将当前指针p p向低地址移一个位移量。向低地址移一个位移量。(7)p-q(7)p-q:表示两个被指向对象间相隔位移量的个数。表示两个被指向对象间相隔位移量的个数。strlen(char strlen(char*s)s)char char*p=s;p=s;while(whil
21、e(*p!=0)p!=0)p+;p+;return(p-s);return(p-s);strlen(char strlen(char*s)s)char char*p=s;p=s;while(while(*p)p)p+;p+;return(p-s);return(p-s);设设p p、q q是指向同一数据集合的指针变量,则是指向同一数据集合的指针变量,则p pq q、p p=q=q、p pq q、p p=q=q、p=qp=q、p!=qp!=q是指针变量允许是指针变量允许实施的关系运算。它们的意义分别是:实施的关系运算。它们的意义分别是:(1)p(1)pq q:若表达式的结果为非:若表达式的结果为
22、非0 0;则表明;则表明p p指针指针 变量所指向的元素在变量所指向的元素在q q指针变量所指向指针变量所指向 的元素之后。否则,结果为的元素之后。否则,结果为0 0,则表明,则表明 p p指向的元素在指向的元素在q q指向的元素之前。指向的元素之前。(2)p(2)pq q:若表达的结果为非:若表达的结果为非0 0,则表明,则表明p p所指向所指向 的元素在的元素在q q所指向的元素之前。否则,所指向的元素之前。否则,结果为结果为 0 0,则表明,则表明p p所指向的元素在所指向的元素在q q 所指向的元素之后。所指向的元素之后。内存内存.a0a0a1a1a3a3a2a2a4a4a5a5.(低
23、地址低地址)(高地址高地址)p pq q 设设p,qp,q是指向同一数据类型的指针变量,是指向同一数据类型的指针变量,n n为一整为一整数,则:数,则:p=qp=q、p=q+np=q+n、p=q-np=q-n、p+=n,p-=np+=n,p-=n都是指都是指针变量允许实施的赋值运算。它们的意义分别是:针变量允许实施的赋值运算。它们的意义分别是:(1)p=q:(1)p=q:将将q q中的地址值赋给中的地址值赋给p p。(2)p=q+n(2)p=q+n:将由:将由q q所指位置向高地址移所指位置向高地址移n n个位移个位移 量后,所得的实际地址值赋给量后,所得的实际地址值赋给p p。(3)p=q-
24、n(3)p=q-n:将由:将由q q所指位置向低地址移所指位置向低地址移n n个位移个位移 量后,所得的实际地址值赋给量后,所得的实际地址值赋给p p。(4)p+=n:(4)p+=n:等价于等价于p=p+np=p+n。(5)p-=n:(5)p-=n:等价于等价于p=p-np=p-n。(1)(1)相互赋值的指针变量相互赋值的指针变量p p、q q,它们所指向的变,它们所指向的变 量的类型应一致,否则会出错。量的类型应一致,否则会出错。(2)(2)如果如果p+=xp+=x中,中,x x低于低于intint类型级别时,应将类型级别时,应将x x 强制转换成强制转换成intint类型。如类型。如x x
25、为为doubledouble型时,写型时,写 为:为:p+=(int)x;p+=(int)x;(3)(3)指针的赋值运算仅上述列出的形式有意义,指针的赋值运算仅上述列出的形式有意义,其他均无意义。更不能将一个整型变量的值其他均无意义。更不能将一个整型变量的值 或常数赋给指针变量。即:或常数赋给指针变量。即:p=n;p=100;p=n;p=100;都是错误的。都是错误的。指针运算符和自增、自减运算符都属于同优先指针运算符和自增、自减运算符都属于同优先级左结合的单目运算符。它们的混用在程序设级左结合的单目运算符。它们的混用在程序设 计计中较为普遍,尤其是指针运算符中较为普遍,尤其是指针运算符*与自
展开阅读全文