C语言程序设计教程(第2版)课件第9章

上传人:zw****58 文档编号:51416166 上传时间:2018-08-14 格式:PPT 页数:81 大小:559KB
返回 下载 相关 举报
C语言程序设计教程(第2版)课件第9章_第1页
第1页 / 共81页
C语言程序设计教程(第2版)课件第9章_第2页
第2页 / 共81页
C语言程序设计教程(第2版)课件第9章_第3页
第3页 / 共81页
C语言程序设计教程(第2版)课件第9章_第4页
第4页 / 共81页
C语言程序设计教程(第2版)课件第9章_第5页
第5页 / 共81页
点击查看更多>>
资源描述

《C语言程序设计教程(第2版)课件第9章》由会员分享,可在线阅读,更多相关《C语言程序设计教程(第2版)课件第9章(81页珍藏版)》请在金锄头文库上搜索。

1、第9章 指 针本章要点 指针的定义、引用和运算方法 数组、函数和字符串与指针的关系本章难点 指针变量的引用 指针作为函数参数的运用预备知识内存:就是内部存储器,是由存储单元组成的。它的特点是存储单元是线性连续的。存储单元的最小单位是字节。 1. 内存的概念地址:为了访问内存中的某个存储单元,我们要为它编号,这种编号称为内存地址。通过地址我们就能够访问该地址所标识的存储单元。2. 地址的概念变量的地址:变量在内存中总占用几个连续的字节,开始字节的地址,就是变量的地址。2007存储单元9.1 指针的含义 指针:一个变量的地址称为该变量的指针 。指针的对象:当把变量的地址存入指针变量后 , 我们就可

2、以说这个指针指向了该变量。 变量的存取方法:直接存取和间接存取。 直接存取:直接根据变量名存取数据。 间接存取:通过指针变量存取相应变量的数据 。 9.2 指针变量9.2.1 指针变量的概念 指针变量:若一个变量专用于存放另一个变量的地址(指针),则该变量称为指针变量。9.2.2 指针变量的定义 一般形式: 类型标识符 *变量名 ;例如: int *ptr1, *ptr2;指针变量的类型:指明了该指针指向的内存空间所存储的数据类型。 在定义指针变量时要注意以下几个问题: 变量名ptr2前面的“*”不能省略,如果写成int *ptr1, ptr2;则ptr2被定义为整型变量,而非整型指针变量。定

3、义中的“*”表示所定义的变量是指针变量,但指针变量名是ptr1、ptr2,而非*ptr1、*ptr2。 指针变量只能指向定义时所规定类型的变量。这个规定的类型称为该指针变量的“基类型”。 如:上例中ptr1、ptr2只能指向整型变量,不能指向实型或字符型变量。其“基类型”相同,都是整型。 定义指针变量后,并未确定该变量指向何处。也就是说该变量的值是不确定的。在引用指针变量前必须首先让它指向一个变量,这一点非常重要。 首先介绍指针运算符(,)“ 注意:这不是给*f_ptr赋值 。指针变量间的赋值和引用应保证基类型相同。 若有定义: int *p , i ; float *q , x ;则:q=

4、p= 我们还可以用这种方法实现对变量的改变: *ptr=15 ; 等价于 i=15 ;由此可见:通过指针 运算符“*”可以引用一 个变量。如:当ptr已 经指向变量i后,*ptr 就等同于i。 进一步理解“ pi= 把指针变量的值赋给另一个指针变量。 如:int i,*pa,*pb; pa= pb=pa;给指针变量赋值为符号常量NULL。说明:NULL是一个空指针,表示该指针变量的值没 有意义。作用是为了避免对没有被初始化的指针变 量的非法引用。NULL 的定义在“stdio.h”中。如:int *pi ; pi=NULL ; 指针的加减运算(+、) 指针的自加自减运算(+,-,+=,-=)

5、1指针的+、运算 指针整数 指针指针+、 说明:指针与整型值加减的结果是指针,表示使该指针 指向该指针下移或上移存储单元个数(整型值)之后 的内存地址。存储单元的大小就是该指针的数据类 型所需的内存大小。 例如:ptr+n (指针ptr,n为整数)这个指针值代表的内 存单元的地址是:ptr+n*d(其中d是指针所指向变量的 数据类型所占内存字节数),即指针移动了n个元素。 9.2.4 指针的算术运算符 指针与指针的加运算毫无意义,所以指针与指针没有加运算。 指针与指针的减运算要求相减的两个指针属于同一类型,其结果是整数,表示两个指针之间的数据的个数。其结果值的计算公式是: ptr1-ptr2=

6、(ptr1的值- ptr2的值) /指针的数据类型所占的字节数 例如:int *ptr1,*ptr2,*ptr3,x;int ary5=2,4,8,16,32; ptr1 = ptr2 = ptr3 = ary; x=ptr2-ptr1;x 的值是32指针的+、 -、+=、-= 运算 +、 += :是移动指针到下一个或下几个存储单元 。 -、 -= :是移动指针到上一个或上几个存储单元 。 例如:int *ptr, ary5=2,4,6,8,10 ;ptr=ary; ptr+=3; ptr-;想一想:*ptr+和(*ptr)+有什么 的区别 ?基类型相同的两个指针进行比较运算,其 意义是两个指

7、针的位置比较,结果是逻辑值。 指针运算的程序举例:把a,b按大小顺序输出。 main() int *p1,*p2,*p,a,b;a=45;b=76;p1= p2=if(*p1y)z=x;else z=y;return z;9.4.3 一维数组的指针作为函数参数 1.数组名作实参 例如:f(int arr,int n)main() int array10;f(array,10);现在解释:实际上,能够接受并存 放地址值的只能是指针变量 。因此,C编译系统都是将形 参数组名作为指针变量来处 理的。上例中f(int arr ,int n) 等价于 f(int *arr, int n) 。使用形参数组

8、的概念只 是为了与实参数组对应,直 观,便于理解而已。 例:从10个数中找出其中最大值和最小值。 void max_min(int a,int n,int *max,int *min); main() int i,a=2,4,1,6,7,32,45,75,45,90,max,min;for(printf(“The original array=“),i=0;iai) *min=ai; 上例中如果形参数组用指针变量,则程序如下 : void max_min(int *x,int n,int *max,int *min); main() int i,a10=2,4,1,6,7,32,45,75,4

9、5,90,max,min;for(printf(“The original array=“),i=0;i*x) *min=*x; 数组名做函数参数小结:如果有一个实参数组,想在函数中改变此数组的元素的值,实参与形参都可用数组名或指针变量 其对应关系有以下4种情况: 实参与形参都用数组名; 实参用数组名,形参用指针变量; 实参、形参都用指针变量;实参为指针变量,形参用数组名。注意:用指针变量作实参时一定要有确定的值 。例:实参、形参都用指针变量的形式 main() int a10,*p;p=a;f(p,10); f(int *x, int n)例:实参为指针变量,形参用数组名。main() in

10、t a10,*p;p=a;f(p,10); f(int x , int n)数组元素地址作实参当用数组元素的地址作为实参时,因为是地址值,所以对应 的形也应当是基类相同的指针变量。例 编写程序,对具有10个元素的char类型数组,从下标为4 的元素开始,全部设置为“*”,保持前4个元素不变。 void setstr(char *,int); main() char c10=A,B,C,D,E,F,G,H,I,J;setstr( void setstr(char *a,int n) for(int i=0;imain(int argc, char *argv ) while(argc0)prin

11、tf(“%sn”, argvargc) ;运行结果: Shenyang Bejing Chinavoid指针类型介绍:新标准增加了void指针类型,它用于定义一个指 针变量,但不指定它是指向哪种类型数据。在将它 的值赋给另一个指针变量时要进行强制类型转换使 之适合于被赋值的变量的类型。9.7.3 void指针类型例如: char *p1; int a=2; void *p2;p2= p1=(char *)p2; 强制类型转换void指针变量定义同样,可用 p2=(void *)p1; 将p1的值转换成 void 指针类型。 可以将一个函数定义为void 指针类型。表示 该函数返回的是一个地址,

12、它指向空类型,如需 要引用此地址,也需要根据情况进行类型转换。 如, 库函数:void *malloc(unsigned size);功能:分配size字节的存储区。 函数调用例: char *p; p=(char *)malloc(60);分配60字节的存储区,并返回该 内存区的地址,并赋值给p 。void sort(char *ps ,int n); #define N 5 main() char *ps100,i;for(i=0;i*p2) swap(p1,p2);if(*p1*p3) swap(p1,p3);if(*p2*p3) swap(p2,p3);printf(“n%6d %6d

13、%6d“,*p1,*p2,*p3); void swap(int *p,int *q) int x;x=*p;*p=*q;*q=x; 习题9.2:输入3个字符串,按由小到大的顺序输出 。void swap(char *ps1,char *ps2);main() char s1=“abc“,s2=“rst“,s3=“xyz“;if(strcmp(s1,s2)=A n=0;if(n0) ai+=n;for(n=0; n12)printf(“month error!“);else puts(monthmon-1); 9.13:有N个数,使前面各数顺序向后移M个位置。 main() int num20

14、,m,n,i; printf(“nm= n=“);scanf(“%d%d“, for(i=0;i0;j-)*(pnum+j)=*(pnum+j-1);*pnum=t; 习题9.14:有一字符串包含N个字符,写一个函数,将字符串中从第M个字符开始的全部字符复制成为另一个字符串。 main() char sn100=“fasjfkjsdfsdfjsdjkfdfjssdf“,sm100;int n=strlen(sn),m=n/2;scopy(sn,sm,m);printf(“n sn=%s n m=%d n sm=%s“,sn,m,sm);scopy(char *psn,char *psm,int

15、 m) while(*(psn+m)*psm+=*(m+psn+);*psm=0; 习题9.15:有一字符串包含N个字符,写一个函数,将字符串中从第M个字符开始的全部字符复制成为另一个字符串。 main() char sn100=“fasjfkjsdfsdfjsdjkfdfjssdf“,sm100;int n=strlen(sn),m=n/2;scopy(sn,sm,m);printf(“n sn=%s n m=%d n sm=%s“,sn,m,sm);scopy(char *psn,char *psm,int m) while(*(psn+m)*psm+=*(m+psn+);*psm=0; 习题9.16:有一字符串包含N个字符,写一个函数,将字符串中从第M个字符开始的全部字符复制成为另一个字符串。 main() char sn100=“fasjfkjsdfsdfjsdjkfdfjssdf“,sm100;int n=strlen(sn),m=n/2;scopy(sn,sm,m);print

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 教育学

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号