c语言程序设计(第五章12-22).ppt
《c语言程序设计(第五章12-22).ppt》由会员分享,可在线阅读,更多相关《c语言程序设计(第五章12-22).ppt(80页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第五章第五章 指针指针重点:重点:1、指针的概念、指针的概念2、指针与数组的应用、指针与数组的应用3、指针与字符串、指针与字符串4、指向指针的指针、指向指针的指针 指针是在指针是在C语言中广泛使用的一种语言中广泛使用的一种数据类型。指针能够模拟引用调用;数据类型。指针能够模拟引用调用;能够建立和操作动态数据结构(如链能够建立和操作动态数据结构(如链表、队列、堆栈和树);能很方便的表、队列、堆栈和树);能很方便的使用数组和字符串;并能处理内存地使用数组和字符串;并能处理内存地址,从而编出精炼高效的程序址,从而编出精炼高效的程序。5.1.1 指针的基本概念指针的基本概念 计算机中的所有数据是存放在
2、存储器里的。一般将计算机中的所有数据是存放在存储器里的。一般将存储器中的一个字节称为一个内存单元。我们为每个内存储器中的一个字节称为一个内存单元。我们为每个内存单元编上号,使之能正确的访问这些内存单元。内存存单元编上号,使之能正确的访问这些内存单元。内存单元的编号也称为地址。单元的编号也称为地址。指针变量则是将内存地址作为指针变量则是将内存地址作为其值的变量。其值的变量。K字符变量字符变量 C011AH指针变量的值不仅可以是变量的地址,还可以指针变量的值不仅可以是变量的地址,还可以是其他数据结构的地址,比如说数组、函数的是其他数据结构的地址,比如说数组、函数的首地址。首地址。一个指针是一个地址
3、,是一个常量,而一个指针一个指针是一个地址,是一个常量,而一个指针变量却可以被赋予不同的指针值,即取值为不同地址的变量却可以被赋予不同的指针值,即取值为不同地址的变量。定义它的目的是为了通过指针变量去访问内存单变量。定义它的目的是为了通过指针变量去访问内存单元。元。变量的指针就是变量的地址,存放变量地址的变变量的指针就是变量的地址,存放变量地址的变量是指针变量。量是指针变量。0111i_point3*i_point0111Hi=3;*i_point=3;i2000H5.2 指针变量的定义和初始化指针变量的定义和初始化5.2.1 指针变量的定义指针变量的定义格式:格式:类型说明符类型说明符 *变
4、量名变量名例:例:int *p1;/p1是一个指向整型变量的指针变量是一个指向整型变量的指针变量 float *p2;char *p3;注意:注意:一个指针变量只能指向同类型的变量。一个指针变量只能指向同类型的变量。5.2.2 指针变量的初始化指针变量的初始化 指针变量可以用定义语句或赋值语句进行初始化。指针变量可以用定义语句或赋值语句进行初始化。例:例:int x,y;int *ipx=&x,*ipy=&y;在使用指针之前一定要将指针指向一个确定的地址。在使用指针之前一定要将指针指向一个确定的地址。未被初始化的指针称为未被初始化的指针称为“无向指针无向指针”,使用该指针非常,使用该指针非常危
5、险。可以将指针初始化为危险。可以将指针初始化为0、NULL或某个地址。具有或某个地址。具有值值NULL的指针不指向任何值。的指针不指向任何值。NULL是在头文件是在头文件中定义的符号常量。把一个指针初始化为中定义的符号常量。把一个指针初始化为0等价等价于把它初始化为于把它初始化为NULL,但使用,但使用NULL更好。值更好。值0是唯一是唯一能够直接赋值给指针变量的整型数。能够直接赋值给指针变量的整型数。5.3 指针运算符指针运算符5.3.1 取地址运算符取地址运算符&格式:格式:&变量名变量名例:例:int i,*ip;ip=&i;1800300ipi1800H5.3.2 指针运算符指针运算符
6、*指针运算符指针运算符*通常称为通常称为“间接访问运算符间接访问运算符”或或“复引用复引用运算符运算符”,它返回其操作数(即一个指针)所指向的对,它返回其操作数(即一个指针)所指向的对象的值。象的值。例例:int i,*ip;ip=&i;x=*ip;运算符运算符*访问以访问以ip为地址的存储区,而为地址的存储区,而ip中存放的是中存放的是变量变量i的地址,因此,的地址,因此,*ip访问的是地址为访问的是地址为1800开始的存开始的存储区域,故上式等价于储区域,故上式等价于 x=i;*和和&运算符的优先级相同,且都是右结合性。运算符的优先级相同,且都是右结合性。例例 a=*&i;5.45.4指针
7、变量的运算指针变量的运算5.4.1 赋值运算赋值运算指针变量的赋值运算有以下的几种形式:指针变量的赋值运算有以下的几种形式:指针变量初始化赋值。指针变量初始化赋值。把一个变量的地址赋予指向相同数据类型的指针变量。把一个变量的地址赋予指向相同数据类型的指针变量。把一个指针变量的值赋予指向相同类型变量的另一个把一个指针变量的值赋予指向相同类型变量的另一个指针变量。指针变量。例:例:int i,*ip=&i,*jp;jp=ip;把数组的首地址赋予指向数组的指针变量。把数组的首地址赋予指向数组的指针变量。例:例:int a5,*pa;pa=a;或或 pa=&a0;把字符串的首地址赋予指向字符类型的指针
8、变量。把字符串的首地址赋予指向字符类型的指针变量。例:例:char*pc;pc=“C Language”把函数的入口地址赋予指向函数的指针变量。把函数的入口地址赋予指向函数的指针变量。例:例:int(*pf)();pf=f;int i ;int *p=&i;int *q=p;int *p=&i;int i;main()int i=10;int *p;*p=i;printf(“%d”,*p);程序的输出结果程序的输出结果?main()int a=10,b;int *ipa=&a;b=*ipa;printf(“%d”,b);main()int a=10,b;int *ipa;b=*ipa;prin
9、tf(“%d”,b);main()int a=10,b;int *ipa;*ipa=a;b=*ipa;printf(“%d”,b);a=100;b=*ipa;printf(“%d”,b);通过指针变量实现两变量值的交换通过指针变量实现两变量值的交换法法1:main()int a=10,b=20,t=0;printf(“n a=%d,b=%d”,a,b);t=a;a=b;b=t;printf(“na=%d,b=%d”,a,b);getch();法法2:main()int a=10,b=20,t=0,*pa=&a,*pb=&b;printf(“n a=%d,b=%d”,a,b);t=*pa;*pa
10、=*pb;*pb=t;printf(“na=%d,b=%d”,a,b);getch();5.4.2 加减算术运算加减算术运算指针可进行的算术运算有:自增运算(指针可进行的算术运算有:自增运算(+)、自减运算()、自减运算(-)、加上一个整数(、加上一个整数(+或或+=)、减去一个整数()、减去一个整数(-或或-=)、)、减去一个指针。减去一个指针。1、指针变量加或减一个整数、指针变量加或减一个整数ip+,ip-,ip+n,ip-n,ip+=n,ip-=n当一个指针变量加或减一个整数时,并不是指针变量加(减)当一个指针变量加或减一个整数时,并不是指针变量加(减)一个整数一个整数n,它的实质意义是
11、它的实质意义是 加上或减去该整数与指针指向对加上或减去该整数与指针指向对象的大小的乘积。象的大小的乘积。对象的大小(即字节数)取决于对象的数对象的大小(即字节数)取决于对象的数据类型。即将指针由当前位置向前(向后)移动据类型。即将指针由当前位置向前(向后)移动n个数据位个数据位置。置。.2000H2002H2004H3000H3004Ha0a1a2x0 x1指针变量指针变量ipaint a=10,20,30;float x=15.5,25.5;int*ipa=a;float *fpx=&x1;ipa+=2;fpx-;指针变量指针变量fpx2、两指针变量相减、两指针变量相减两指针变量相减所得之差
12、是两个指针所指数组元素之间两指针变量相减所得之差是两个指针所指数组元素之间相差的元素个数。实质上是两个指针值(地址)相减之相差的元素个数。实质上是两个指针值(地址)相减之差再除以该数组元素的长度(字节数)。差再除以该数组元素的长度(字节数)。注:两个指针变量不能进行加法运算。注:两个指针变量不能进行加法运算。main()int a=1,2,3,4,5,6,7,8,9,10;int *ip1=a,*ip2=&a9;printf(“nip1=%x ip2=%x ip2-ip1=%x”,ip1,ip2,ip2-ip1);5.4.3 两指针变量进行关系运算两指针变量进行关系运算指向同一数组的两指针变量
13、可以进行关系运算指向同一数组的两指针变量可以进行关系运算,pa;若两个指针指向同一个数组的元素,则指向前面若两个指针指向同一个数组的元素,则指向前面元素的指针变量小于指向后面元素的指针变量。元素的指针变量小于指向后面元素的指针变量。程序的运行结果程序的运行结果:main()int a=1,2,3,4,5,6,7,8,9,10;int *ip1=&a0,*ip2=&a9;printf(“n%d”,ip2ip1);5.5 指针和数组指针和数组5.5.1 指向数组的指针变量指向数组的指针变量例例 int array10;int *p;p=&array0;/p=array;或或 int *p=&arr
14、ay0;或或 int *p=array;P是变量,是变量,array,&array0是常量。是常量。数组名数组名是表示数组首地址的是表示数组首地址的地址常量地址常量14713152627pa0a65.5.2 通过指针引用数组元素通过指针引用数组元素C语言中规定,如果指针变量语言中规定,如果指针变量p 已指向数组中的一个已指向数组中的一个元素。则元素。则P+1指向同一数组中的下一个元素。指向同一数组中的下一个元素。1)用指针表达式引用数组元素)用指针表达式引用数组元素2)用指针表达式也可引用地址用指针表达式也可引用地址3)数组名本身是一个指针,也可在指针表达式运算数组名本身是一个指针,也可在指针
15、表达式运算中引用数组元素。中引用数组元素。4)指针也可以象数组一样带下标。指针也可以象数组一样带下标。.下标法a0a1a2a3a9aa+9a+1a+2地址元素a0a1a2a9指针法a0a1a2a3a9.pp+9p+1p+2地址元素*p*(p+1)*(p+2)*(p+9)ai pi *(p+i)*(a+i)下标运算符ai *(a+i)*a*(a+1)*(a+2)*(a+9)P0P1P2P9main()int a5,*pa,i;for(i=0;i5;i+)ai=i+1;pa=a;for(i=0;i5;i+)printf(*(pa+%d):%dn,i,*(pa+i);for(i=0;i5;i+)pr
16、intf(*(a+%d):%dn,i,*(a+i);for(i=0;i5;i+)printf(pa%d:%dn,i,pai);for(i=0;i5;i+)printf(a%d:%dn,i,ai);数组元素的四种引用方法数组元素的四种引用方法5.5.3 通过指针引用数组元素时应注意的几个问题通过指针引用数组元素时应注意的几个问题1)指针变量可以实现本身的值的改变)指针变量可以实现本身的值的改变例 int a=1,2,3,4,5,6,7,8,9,10,*p=a,i;数组元素地址的正确表示:(A)&(a+1)(B)a+(C)&p (D)&pi数组名是地址常量p+,p-()a+,a-()a+1,*(a
17、+2)()2)指针变量可以指向数组的任何元素,要注意指针变量指针变量可以指向数组的任何元素,要注意指针变量的当前值。的当前值。main()int i,*p,a7;p=a;for(i=0;i7;i+)scanf(%d,p+);printf(n);p=a;for(i=0;i7;i+,p+)printf(%d,*p);58762730123456a指针变量可以指到数组后的内存单元3)注意运算符)注意运算符+、-、&和和*的混合运算的混合运算void main()int a=5,8,7,6,2,7,3;int y,*p=&a1;y=(*-p)+;printf(“%d ”,y);printf(“%d”,
18、a0);58762730123456a输出:5 6*p+*(p+)(*p)+*(p-)*(+p)*(-p)通过指针引用数组元素来输出一个一维数组。通过指针引用数组元素来输出一个一维数组。#define N 5main()int aN;int *p=a;printf(“n please input%d number:”,N);for(;pa+N;p+)scanf(“%d”,p);printf(“n”);for(p=a;pa+N;p+)printf(“%d”,*p);通过指针引用数组元素实现一位数组的反序输出通过指针引用数组元素实现一位数组的反序输出#define N 5main()int xN,
19、*p=x,*q=x+N-1,j,t;clrscr();for(j=0;jN;j+)scanf(“%d”,p+j);for(;pq ;p+,q-)t=*p;*p=*q;*q=t;for(j=0,p=x;jN;j+)printf(“%d”,*(p+j);0 1 2 34 5 6 78 9 10 11 int a340,1,2,3,4,5,6,7,8,9,10,11 5.5.4 指向二维数组的指针指向二维数组的指针1、二维数组和数组元素的地址、二维数组和数组元素的地址01243658791011100010081016a0a1a2(1 1)从)从2 2维数组角度看,数组名维数组角度看,数组名a a代
20、表整个二维数组的代表整个二维数组的起始地址,起始地址,是一个以行为单位进行控制的行指针:是一个以行为单位进行控制的行指针:a+i a+i:行指针值,指向:行指针值,指向2 2维数组的第维数组的第i i行,代表第行,代表第i i行行的首地址。的首地址。aa+1a+2(2 2)从)从1 1维数组角度看,数组名维数组角度看,数组名a a和第和第1 1维下标的每一个维下标的每一个值,值,共同构成一组新的共同构成一组新的1 1维数组名维数组名a0a0、a1a1、a2a2,它们均由它们均由4 4个元素组成。个元素组成。语言规定:语言规定:数组名代表数组的地址数组名代表数组的地址,所以,所以aiai是第是第
21、i i行行1 1维数组的地址,维数组的地址,它指向该行的第它指向该行的第0 0列元素,是一个列元素,是一个以数组元素为单位进行控制的列指针:以数组元素为单位进行控制的列指针:ai+jai+j:(列)指针值,指向数组元素:(列)指针值,指向数组元素aijaij。*(ai+j)*(ai+j):表示数组元素:表示数组元素aijaij的值。的值。如果有如果有“int a34,*p=a0“int a34,*p=a0;”,则,则p+1p+1指向下一个指向下一个元素元素用用p p作指针访问数组元素作指针访问数组元素aijaij的格式:的格式:*(p+(*(p+(*每行列数每行列数+j)+j)*(a+i):(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言程序设计 第五 12 22
限制150内