《C语言程序设计》课件第七章11.ppt
《《C语言程序设计》课件第七章11.ppt》由会员分享,可在线阅读,更多相关《《C语言程序设计》课件第七章11.ppt(62页珍藏版)》请在文字多文库上搜索。
1、C语言程序,电子教案,算法语言程序设计,第七章指针,主要内容:指针的概念指针运算 指针与函数参数 指针与数组 字符指针和字符串 函数型指针 指针型指针,指针功能,指针是一种构造类型数据,利用指针可以有效地表示复杂的数据结构,动态地分配内存,方便地使用字符串和数组,灵活地实现函数间的数据传递,直接处理内存地址等。掌握指针的应用,可以使算法表达更确切,程序更清晰简炼,代码 更紧凑有效。,7.1 指针的概念,7.1.1 存储单元的地址与内容 程序一旦被执行,则该程序的指令、常量和变量等都要存放在机器的内存中。内存是以字节来划分存储单元的,每个字节都有一个编号,这就是存储单元的“地址”。在计算机中,根
2、据内存的地址,就可以访问存储在该单元中的数据。将某存储单元中的数据称为这个存储单元的“内容”。存储单元的地址与内容如下图所示。,图7.1,内存,1000,1002,1004,2010,变量a,变量b,变量c,变量i,7.1.2 指针和指针变量 内存变量的三个基本特征:变量名、变量的内容和变 量的存储地址。要访问一个变量,可以有两种方式:用变量名;用变量的地 址。,7.1.3 指针变量的定义,指针变量使用前应先定义。定义格式:类型标识符*标识符 说明:标识符是被定义的指针变量的名字。类型标识符则表明了该指针变量所指 向变量的类型。例如:int*p;char*ch;,7.1.4 指针运算符和指针变
3、量的引用,1.运算符,表示把变量i的地址赋给指针变量p,表示将指针变量所指向的变量i的内容赋给变量j,2.指针变量的引用,指针变量一经定义,可以像其它基本类型变量一样引用。(1)指针变量只接收地址,例如:int*pi,*pj,*pk,i,j,k;pi=,(2)指针变量指向变量后,可以像其它基本类 型变量一样引用。,例如:int*pi,*pj,i,j;pi=*/,切记:指针变量引用前必 须指向某个变量。例如:#includestdio.h void main()int*p;*p=100;/*错*/printf(%d n,*p);,(3)指向同类型的指针变量之间可以相互赋值,例如:pi=pj;注意
4、:对于指针变量pi和pj,下面两种赋值的效 果是不等价的。pi=pj;和*pi=*pj;(4)如果指针变量pi已经指向变量i,那么:&*pi与&i等价。因为两个运算符的优先级别相同,按自右向左方向结合,先进行*pi运算,它就是变量i,再进行&运算,所以&*pi与&i等价。,(5)若i是一变量,则*&i与i等价。,因为先进行,(7)指针变量可以指向任何类型变量,其中 包括其他的指针变量。,例如:int i,*pi,*ppi;pi=,(8)指针变量可以赋“空”值,其含义是该 指针变量不指向任何变量。,“空”值通常作为指针的异常标志。用NULL表示,即全部二进位均为0值。NULL其实就是0,但习惯上
5、不用0而 用NULL,办法是通过#define定义。例如:#define NULL 0#includestdio.h void main()int i,*p;p=NULL;p=i;if(p=NULL)printf(pointer p is NULL);,(9)一个指针变量的值为NULL与未对该指针 变量赋值是不同的。,前者是有值的,其值为0,称“空值”,它表示不指向任何变量;而后者虽未对指针变量赋值,但并不等于该指针变量无值,只是它的值是一个不确定的值,即该指针变量正指向某个未知的单元。这时,程序若引 用这个指针变量,显然是很危险的。所以,在引用一个指针变量前,必须先要对它赋值。,3 指针变量
6、引用举例【例7.1】观察指针变量pi和pj构成的语句(pi=pj;*pi=*pj;)之异同。,#includestdio.hvoid main()int i,j,*pi,*pj;scanf(%d,%d,程序运行结果如下:2,8i=2,j=8*pi=2,*pj=8pi=65494,pj=65496i=2,j=8*pi=8,*pj=8pi=65496,pj=65496i=8,j=8*pi=8,*pj=8pi=65494,pj=65496,【例7.2】输入a、b两个整数,经比较后,按大小顺序输出a和b。,#includestdio.hvoid main()int*pi,*p2,*p,a,b;scan
7、f(%d,%d,程序运行结果如下:9,18a=9,b=18max=18,min=9,7.1.5 指针数组,指针数组:定义为指针型的数组称为指针数组。例:利用指针数组对字符型二维数组输入输出。#includestdio.h void main()char a520,*p5;int i;for(i=0;i5;i+)pi=ai;for(i=0;i5;i+)scanf(“%s”,pi);for(i=0;i5;i+)printf(“%sn”,pi);,7.1.6 数组行指针,数组行指针:用于指向二位数组的某一行的指针称为数组行指针。格式:int(*p)m;说明:p是行指针变量;m是数组列大小。数组元素地
8、址*(指针变量+行下标)+列下标 数组元素引用*(*(指针变量+行下标)+列下标)例:#includestdio.h void main()int a23,(*p)3=a;int i,j;for(i=0;i2;i+)for(j=0;j3;j+)scanf(“%d”,*(p+i)+j);for(i=0;i2;i+)printf(“n”);for(j=0;j3;j+)printf(“%10d”,*(*(p+i)+j);,7.2 指针运算,指针:是指向某类型数据的地址。说明:地址的分配是由C编译系统决定的;指针变量的值是一具体类型的特定变量地址 所允许的整数,但必须明确:指针不是整数。对指针的运算不
9、能像对整型数据那样进行所 有的算术、逻辑和关系运算,而只能进行C 语言所规定的某些运算。指针运算的值与某一类型数据的地址有关。,7.2.1 指针的算术运算,设p、q是指针变量,n为一整数,则:p+n、p-n、p+、p-、+p、-p、p-q都是指针变量允许实施的算术运算,它们的意义分别是:(1)p+n:表示由p所指向位置向高地址移n个位移量。(2)p-n:表示由p所指向位置向低地址移n个位移量。(3)p+:将当前指针p向高地址移一个位移量(4)p-:将当前指针p向低地址移一个位移量。(5)+p:将当前指针p向高地址移一个位移量。(6)-p:将当前指针p向低地址移一个位移量。(7)p-q:表示两个
10、被指向对象间相隔位移量的个数。,【例7.3】计算字符串长度函数。,strlen(char*s)char*p=s;while(*p!=0)p+;return(p-s);,strlen(char*s)char*p=s;while(*p)p+;return(p-s);,7.2.2 指针的关系运算,设p、q是指向同一数据集合的指针变量,则pq、p=q、pq、p=q、p=q、p!=q是指针变量允许实施的关系运算。它们的意义分别是:(1)pq:若表达式的结果为非0;则表明p指针 变量所指向的元素在q指针变量所指向 的元素之后。否则,结果为0,则表明 p指向的元素在q指向的元素之前。(2)pq:若表达的结果
11、为非0,则表明p所指向 的元素在q所指向的元素之前。否则,结果为 0,则表明p所指向的元素在q 所指向的元素之后。,图7.7,内存,.,a0,a1,a3,a2,a4,a5,.,(低地址),(高地址),p,q,7.2.3 指针变量的赋值运算,设p,q是指向同一数据类型的指针变量,n为一整数,则:p=q、p=q+n、p=q-n、p+=n,p-=n都是指针变量允许实施的赋值运算。它们的意义分别是:(1)p=q:将q中的地址值赋给p。(2)p=q+n:将由q所指位置向高地址移n个位移 量后,所得的实际地址值赋给p。(3)p=q-n:将由q所指位置向低地址移n个位移 量后,所得的实际地址值赋给p。(4)
12、p+=n:等价于p=p+n。(5)p-=n:等价于p=p-n。,指针变量在进行赋值运算时,要注意:,(1)相互赋值的指针变量p、q,它们所指向的变 量的类型应一致,否则会出错。(2)如果p+=x中,x低于int类型级别时,应将x 强制转换成int类型。如x为double型时,写 为:p+=(int)x;(3)指针的赋值运算仅上述列出的形式有意义,其他均无意义。更不能将一个整型变量的值 或常数赋给指针变量。即:p=n;p=100;都是错误的。,7.2.4 指针运算符与自增、自减运算符的混用,指针运算符和自增、自减运算符都属于同优先级左结合的单目运算符。它们的混用在程序设 计中较为普遍,尤其是指针
13、运算符*与自增运算符+、自减运算符-的混用更为常见。例如:while(*p)putchar(*p+);中的*p+就是指针运算符与自增运算符混用的一种。在这条语句中,*p+的运算结果是:先将*p作为操作数输出,再将指针变量p向高地址自增一个位移量。所以:*p+等价于*p;p+=1;,7.3 指针与函数参数,函数的参数不仅可以是基本类型的变量,也可以是指针变量。对任何必须以地址方式传送的参数,均可以利用指针来实现。特别是函数的返回值多于一个时,可以利用指针来传递函数 的返回值。注:当指针作为函数的参数时,对应的实参必须是 变量的地址或指针;其相应的形 参应是指针 变量。这样才能保证地址的正确传送。
14、,【例7.5】将指针作为函数参数,改写例7.2 的程序。,#includestdio.h swap(int*p1,int*p2)int p;p=*p1;*p1=*p2;*p2=p;void main()int a,b;int*pa,*pb;,scanf(%d,%d,程序运行结果如下:8,1818,8,#includestdio.h swap(int*p1,int*p2)int*p;p=p1;p1=p2;p2=p;void main()int a,b;int*pa,*pb;scanf(%d,%d,程序运行结果如下:8,188,18,#includestdio.h swap(int*p1,int*
15、p2)int*p;p=p1;p1=p2;p2=p;void main()int a,b;int*pa,*pb;scanf(%d,%d,程序运行结果如下:8,188,18,#includestdio.h swap(int*p1,int*p2)int*p;p=*p1;*p1=*p2;*p2=p;void main()int a,b,*pa,*pb;scanf(%d,%d,程序运行结果如下:8,18 18,8,注意:,交换指针所指向变量的值和交换指针值的效果是不同的。swap(int*p1,int*p2)int*p;p=p1;p1=p2;p2=p;,错误:swap(int*p1,int*p2)int
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C语言程序设计 语言程序设计 课件 第七 11
