《C语言程序设计》课件第七章11.ppt

上传人(卖家):momomo 文档编号:4850731 上传时间:2023-01-18 格式:PPT 页数:62 大小:366.50KB
下载 相关 举报
《C语言程序设计》课件第七章11.ppt_第1页
第1页 / 共62页
《C语言程序设计》课件第七章11.ppt_第2页
第2页 / 共62页
《C语言程序设计》课件第七章11.ppt_第3页
第3页 / 共62页
《C语言程序设计》课件第七章11.ppt_第4页
第4页 / 共62页
《C语言程序设计》课件第七章11.ppt_第5页
第5页 / 共62页
点击查看更多>>
资源描述

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;都是错误的。都是错误的。指针运算符和自增、自减运算符都属于同优先指针运算符和自增、自减运算符都属于同优先级左结合的单目运算符。它们的混用在程序设级左结合的单目运算符。它们的混用在程序设 计计中较为普遍,尤其是指针运算符中较为普遍,尤其是指针运算符*与自

26、增运算符与自增运算符+、自减运算符自减运算符-的混用更为常见。例如的混用更为常见。例如 :while(while(*p)putchar(p)putchar(*p+);p+);中的中的*p+p+就是指针运算符与自增运算符混用的就是指针运算符与自增运算符混用的一种。在这条语句中,一种。在这条语句中,*p+p+的运算结果是:先将的运算结果是:先将*p p作为操作数输出,再将指针变量作为操作数输出,再将指针变量p p向高地址自增向高地址自增一个位移量。所以:一个位移量。所以:*p+p+等价于等价于 *p;p+=1;p;p+=1;函数的参数不仅可以是基本类型的变量,也可以函数的参数不仅可以是基本类型的变

27、量,也可以是指针变量。对任何必须以地址方式传送的参数,是指针变量。对任何必须以地址方式传送的参数,均可以利用指针来实现。特别是函数的返回值多于均可以利用指针来实现。特别是函数的返回值多于一个时,可以利用指针来传递函数一个时,可以利用指针来传递函数 的返回值。的返回值。注:当指针作为函数的参数时,对应的实参必须是注:当指针作为函数的参数时,对应的实参必须是 变量的地址或指针;其相应的形变量的地址或指针;其相应的形 参应是指针参应是指针 变量。这样才能保证地址的正确传送。变量。这样才能保证地址的正确传送。#include#includestdio.hstdio.h swap(int swap(in

28、t*p1,int p1,int*p2)p2)int p;int p;p=p=*p1;p1;*p1=p1=*p2;p2;*p2=p;p2=p;void main()void main()int a,b;int a,b;int int*pa,pa,*pb;pb;scanf(%d,%d,&a,&b);scanf(%d,%d,&a,&b);pa=&a;pa=&a;pb=&b;pb=&b;if(ab)swap(pa,pb);if(ab)swap(pa,pb);printf(”n%d,%dn,a,b);printf(”n%d,%dn,a,b);程序运行结果如下:程序运行结果如下:8 8,18181818,

29、8 8#include#includestdio.hstdio.h swap(int swap(int*p1,int p1,int*p2)p2)int int*p;p;p=p1;p1=p2;p2=p;p=p1;p1=p2;p2=p;void main()void main()int a,b;int a,b;int int*pa,pa,*pb;pb;scanf(%d,%d,&a,&b);scanf(%d,%d,&a,&b);pa=&a;pb=&b;pa=&a;pb=&b;if(ab)swap(pa,pb);if(ab)swap(pa,pb);printf(”%d,%dn,printf(”%d,%

30、dn,*pa,pa,*pb);pb);程序运行结果如下:程序运行结果如下:8 8,18188 8,1818#include#includestdio.hstdio.h swap(int swap(int*p1,p1,int*p2)p2)int int*p;p;p=p1;p1=p2;p2=p;p=p1;p1=p2;p2=p;void main()void main()int a,b;int a,b;int int*pa,pa,*pb;pb;scanf(%d,%d,&a,&b);scanf(%d,%d,&a,&b);pa=&a;pb=&b;pa=&a;pb=&b;if(ab)swap(&a,&b)

31、;if(ab)swap(&a,&b);printf(”n%d,%dn,printf(”n%d,%dn,*pa,pa,*pb);pb);程序运行结果如下:程序运行结果如下:8 8,18188 8,1818#include#includestdio.hstdio.h swap(int swap(int*p1,int p1,int*p2)p2)int int*p;p;p=p=*p1;p1;*p1=p1=*p2;p2;*p2=p;p2=p;void main()void main()int a,b,int a,b,*pa,pa,*pb;pb;scanf(%d,%d,&a,&b);scanf(%d,%d

32、,&a,&b);pa=&a;pb=&b;pa=&a;pb=&b;if(ab)swap(&pa,&pb);if(ab)swap(&pa,&pb);printf(n%d,%dn,printf(n%d,%dn,*pa,pa,*pb);pb);程序运行结果如下:程序运行结果如下:8 8,1818 18 18,8 8 交换指针所指向变量的值和交换指针值的效果是不同交换指针所指向变量的值和交换指针值的效果是不同的。的。swap(int swap(int*p1,int p1,int*p2)p2)int int*p;p;p=p1;p=p1;p1=p2;p1=p2;p2=p;p2=p;错误错误:swap(int

33、 swap(int*p1,int p1,int*p2)p2)int int*p;p;*p=p=*p1;p1;*p1=p1=*p2;p2;*p2=p2=*p;p;在在C C语言中,指针与数组的关系非常密切。任何语言中,指针与数组的关系非常密切。任何能由下标完成的对数组的操作,也可以由指能由下标完成的对数组的操作,也可以由指 针来针来实现。使用指针对数组进行运算处理,可使目标实现。使用指针对数组进行运算处理,可使目标程序占用内存少、运行速度快。程序占用内存少、运行速度快。指针与数组密切的关系主要反映在以下两点:指针与数组密切的关系主要反映在以下两点:(1)(1)对数组元素访问时,用数组的下标和用对

34、数组元素访问时,用数组的下标和用 指针是统一的;指针是统一的;(2)(2)当主调函数中的实参是数组名时,被调当主调函数中的实参是数组名时,被调 函数中相应形参数组的定义可以由形参函数中相应形参数组的定义可以由形参 指针变量代替。指针变量代替。若程序中定义如下数组和指针变量:若程序中定义如下数组和指针变量:int a10,int a10,*pa;pa;由于数组名是数组的首地址,一旦将数组名赋由于数组名是数组的首地址,一旦将数组名赋给指针变量后,即给指针变量后,即 pa=a;pa=a;指针与数组之间就建立了对立关系:数组下标指针与数组之间就建立了对立关系:数组下标和指针变量运算的对应;数组元素与指

35、针变量的和指针变量运算的对应;数组元素与指针变量的*运算运算(例如例如*pa)pa)的对应。的对应。设设i i为数组的下标,为数组的下标,n n为一整型数,那么;为一整型数,那么;&a0apa&pa0&a0apa&pa0&aia+ipa+i&pai&aia+ipa+i&pai a0*a*papa0ai*(a+i)*(pa+i)pai#include#includestdio.hstdio.hvoid main()void main()static int a=1,2,3,4,5;static int a=1,2,3,4,5;int int*pa,k;pa,k;pa=a;pa=a;k=0;k=0

36、;while(k5)while(k5)printf(%d,printf(%d,*(pa+k);(pa+k);k+;k+;printf(n);printf(n);程序运行结果如下:程序运行结果如下:1,2,3,4,5,1,2,3,4,5,#include#includestdio.hstdio.h void fun(char void fun(char*p)p)while(while(*p)p)putchar(putchar(*p+);p+);printf(“n);printf(“n);void main()void main()static char a=ABCDE;static char a

37、=ABCDE;fun(a);fun(a);程序运行结果如下:程序运行结果如下:ABCDEABCDE (1)(1)若实参是变量的地址,传给形参指针变量后,这个指针不若实参是变量的地址,传给形参指针变量后,这个指针不 能作为数组的指针使用。能作为数组的指针使用。(2)(2)在函数调用中,实参是数组名时,往往相应的形参用指针在函数调用中,实参是数组名时,往往相应的形参用指针 变量,这使得有时在函数中会看不出它是一个数组,因变量,这使得有时在函数中会看不出它是一个数组,因 此,在函数中引用指针变量时,先要弄清指针变量所指的此,在函数中引用指针变量时,先要弄清指针变量所指的 对象是什么,才不会出错。对象

38、是什么,才不会出错。(3)(3)指针变量可以用指针变量可以用+、-来不断改变自身的值,而数组名不来不断改变自身的值,而数组名不 允许进行自增、自减的运算。允许进行自增、自减的运算。(4)(4)要注意指针变量的当前值。尤其是要注意指针初值的恢复。要注意指针变量的当前值。尤其是要注意指针初值的恢复。#include#includestdio.hstdio.hvoid main()void main()int a10,int a10,*p,i;p,i;p=a;p=a;for(i=0;i10;i+)for(i=0;i10;i+)scanf(%d,p+);scanf(%d,p+);printf(n);p

39、rintf(n);for(i=0;i10;i+)for(i=0;i10;i+)printf(%d,printf(%d,*p+);p+);#include#includestdio.hstdio.hvoid main()void main()int a10,int a10,*p,i;p,i;p=a;p=a;for(i=0;i for(i=0;i10;i+)10;i+)scanf(%d,p+);scanf(%d,p+);printf(n);printf(n);p=a;p=a;for(i=0;i for(i=0;i10;i+)10;i+)printf(%d,printf(%d,*p+);p+);错误

40、正确#include#includestdio.hstdio.hvoid main()void main()static int a33=1,2,3,4,5,6,7,8,9;static int a33=1,2,3,4,5,6,7,8,9;static int b222=1,2,3,4,5,6,7,8;static int b222=1,2,3,4,5,6,7,8;int int*p,i;p,i;p=a;p=a;for(i=0;i9;i+)for(i=0;i9;i+)if(i%3=0)printf(n);if(i%3=0)printf(n);printf(%3d,printf(%3d,*p+)

41、;p+);printf(n);printf(n);p=b;p=b;for(i=0;i for(i=0;i8;i+)8;i+)if(i%2=0)printf(n);if(i%2=0)printf(n);printf(%3d,printf(%3d,*p+);p+);printf(printf(n);n);#include#includestdio.hstdio.hvoid main()void main()static int a23=1,2,3,4,5,6;static int a23=1,2,3,4,5,6;int int*p;p;p=a;p=a;printf(a12=%dn,printf(a

42、12=%dn,*(p+1(p+1*3+2);3+2);printf(a01=%dn,printf(a01=%dn,*(p+0(p+0*3+1);3+1);程序运行结果如下:程序运行结果如下:a12=6a12=6a01=2a01=2指针指向二维数组首地址的数组元素引用:指针指向二维数组首地址的数组元素引用:若若 int a23,int a23,*p=a;p=a;则数组元素引用则数组元素引用 aijaij*(p+i(p+i*3+j)3+j)C C语言对字符串的描述有两种方法:用字符语言对字符串的描述有两种方法:用字符数组描述字符串,或者用字符指针描述字符串。数组描述字符串,或者用字符指针描述字符串

43、。而用字符指针形式描述字符串比使用字符数组而用字符指针形式描述字符串比使用字符数组有更大的便利性,程序也显得清晰、简炼。有更大的便利性,程序也显得清晰、简炼。通常,用字符数组处理字符串时,要定义通常,用字符数组处理字符串时,要定义一个存储字符串的字符数组,再利用循环对字一个存储字符串的字符数组,再利用循环对字符数符数 组中的每个元素进行操作。组中的每个元素进行操作。#include#includestdio.hstdio.hvoid main()void main()static char c11=C language;static char c11=C language;int i;int

44、i;for(i=0;i10;i+)for(i=0;i10;i+)printf(%c,ci);printf(%c,ci);printf(n);printf(n);程序运行结果如下:程序运行结果如下:C languageC language#include#includestdio.hstdio.hvoid main()void main()char char*p;p;p=C language;p=C language;printf(%sn,p);printf(%sn,p);程序运行结果如下:程序运行结果如下:C languageC language#include#includestrcpy(c

45、har strcpy(char*p1,char p1,char*p2)p2)while(while(*p2+=p2+=*p1+);p1+);void main()void main()static char a1=C language;static char a1=C language;char a211;char a211;strcpy(a1,a2);strcpy(a1,a2);puts(a2);puts(a2);程序运行结果如下:程序运行结果如下:C languageC language7.6.1 7.6.1 函数型指针的定义函数型指针的定义 一个函数被执行时,在内存中占据一定的空一个函数

46、被执行时,在内存中占据一定的空间,这个空间的起始地址是用函数名表示的,间,这个空间的起始地址是用函数名表示的,称为函数的入口地址。可以用指针指向这个入称为函数的入口地址。可以用指针指向这个入口地址,并通过该指针变量来调用这个函数口地址,并通过该指针变量来调用这个函数 。这种指针变量称为函数型指针变量。这种指针变量称为函数型指针变量。函数型指针变量的一般形式为:函数型指针变量的一般形式为:数据类型标识符数据类型标识符 (*指针变量名指针变量名)()();int(int(*f1)();f1)();float(float(*f2)();f2)();定义了两个函数型指针变量定义了两个函数型指针变量f1

47、f1和和f2f2,f1f1所指向的函数返回整型类数据,所指向的函数返回整型类数据,f2f2所所指向的函数返回指向的函数返回 实型类数据。实型类数据。给函数型指针变量赋值的一般形式为:给函数型指针变量赋值的一般形式为:函数型指针变量名函数型指针变量名=函数名函数名 例如:有一个例如:有一个C C函数函数min(a,b)min(a,b),若,若fpfp为函数型指为函数型指 针变量,则针变量,则 fp=min;fp=min;的含义为将的含义为将minmin 函数的入口地址赋给函数型指针变量函数的入口地址赋给函数型指针变量 fpfp,使得,使得fpfp指向函数指向函数minmin。上述语句不能写成:上

48、述语句不能写成:fp=min(a,b);fp=min(a,b);的形式。的形式。对函数的调用就有两种方法来实现。对函数的调用就有两种方法来实现。第一种方法,用函数名实现调用:第一种方法,用函数名实现调用:x=min(a,b);x=min(a,b);第二种方法,用函数型指针实现调用:第二种方法,用函数型指针实现调用:fp=min;x=(fp=min;x=(*fp)(a,b);fp)(a,b);#include#includestdio.hstdio.hvoid main()void main()int(int(*fp)(),max();fp)(),max();int a,b,c;int a,b,

49、c;scanf(%d,%d,&a,&b);scanf(%d,%d,&a,&b);fp=max;fp=max;c=(c=(*fp)(a,b);fp)(a,b);printf(max=%dn,c);printf(max=%dn,c);max(int x,int y)max(int x,int y)int z;int z;z=(xy)?x:y;z=(xy)?x:y;return(z);return(z);程序运行结果如下:10,20max=20 在在C C 语言中,允许一个指针指向另一个语言中,允许一个指针指向另一个指针。如果一个指针变量的内容是另一个指针。如果一个指针变量的内容是另一个指针变量的存

50、储地址,则称该指针变量为指针变量的存储地址,则称该指针变量为指针型指针变量,又称指向指针的指针变指针型指针变量,又称指向指针的指针变量或多级指针变量。指针型指针变量使用量或多级指针变量。指针型指针变量使用前必须先定义。前必须先定义。指针型指针变量定义的一般格式为:指针型指针变量定义的一般格式为:类型标识符类型标识符 *标识符标识符;其中,标识符是被定义的指针型指针变量的名其中,标识符是被定义的指针型指针变量的名字。类型标识符则表明了被指针型指针变量所指字。类型标识符则表明了被指针型指针变量所指向的指针变量所指向的变量的数据类型。向的指针变量所指向的变量的数据类型。例如:例如:int int*p

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 各类题库
版权提示 | 免责声明

1,本文(《C语言程序设计》课件第七章11.ppt)为本站会员(momomo)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|