c语言程序设计第2版) 教学课件 作者 梅创社 第9章指针

上传人:E**** 文档编号:102541345 上传时间:2019-10-03 格式:PPT 页数:46 大小:296KB
返回 下载 相关 举报
c语言程序设计第2版) 教学课件 作者 梅创社 第9章指针_第1页
第1页 / 共46页
c语言程序设计第2版) 教学课件 作者 梅创社 第9章指针_第2页
第2页 / 共46页
c语言程序设计第2版) 教学课件 作者 梅创社 第9章指针_第3页
第3页 / 共46页
c语言程序设计第2版) 教学课件 作者 梅创社 第9章指针_第4页
第4页 / 共46页
c语言程序设计第2版) 教学课件 作者 梅创社 第9章指针_第5页
第5页 / 共46页
点击查看更多>>
资源描述

《c语言程序设计第2版) 教学课件 作者 梅创社 第9章指针》由会员分享,可在线阅读,更多相关《c语言程序设计第2版) 教学课件 作者 梅创社 第9章指针(46页珍藏版)》请在金锄头文库上搜索。

1、第9章指 针,9.1 指针和指针变量的概念 9.2 指针变量的定义与应用 9.3 数组的指针和指向数组的指针变量 9.4 字符串的指针和指向字符串的指针变量 9.5 返回指针值的函数 9.6 指针数组与主函数main( )的形参 9.7 函数的指针和指向函数的指针变量,9.1 指针和指针变量的概念,为了形象地描述内存单元的数据在存取过程中单元地址的变化情况,引入了指针这一概念。其实,指针就是地址。 一般地,如果在程序中定义了一个变量,则编译时系统会根据变量的类型给变量分配一定长度的字节数。实际上,内存中每个字节都有一个编码,这个编码就是该字节的地址。假设程序已定义了二个整型变量i、j;二个实型

2、变量a、b;二个字符型变量c1、c2,编译分配如图9-1所示,返回,9.2 指针变量的定义与应用,9.2.1 指针变量的定义与相关运算 1指针变量的定义 指针变量的定义其实就是把存放地址的变量定义成“指针类型”。一般格式为: 类型名 *指针变量名; 2指针变量的相关运算 (1) 指针运算符 有两个相关的运算符: &:取地址运算符。 *:指针运算符(或称“间接访问”运算符)。,下一页,返回,9.2 指针变量的定义与应用,1)可用运算符 (表示将变量j的地址赋给指针变量) 则p1、p2分别指向了变量i、j。如图9-2所示。 2)可用运算符“*”引用指针变量 “*”运算符用于某个地址(如指针变量)之

3、前,表示取*后地址中的内容。,上一页,下一页,返回,9.2 指针变量的定义与应用,(2) 指针的赋值与比较 例9.1 main( ) int a,b; int *p1,*p2; a=10;b=20; p1= ,上一页,下一页,返回,9.2 指针变量的定义与应用,(3) 指针的算术运算 1)指针可以与整型数相加减 若指针变量p当前指向2000单元,其基类型是整型,则以下操作是合法的。 p=p+1 /* p指向2002单元 */ p=p+2; /* p指向2006单元 */ p=p-1; /* p指向2004单元 */ 2)指针的减法运算 两个相同基类型的指针变量可以进行减法运算。设p1、p2均为

4、指向整型变量的指针变量,且p1=2000,p2=2006,则p2-p1=3。3其实是(2006-2000)/2得到的结果,表示两个指针所指对象之间指针基类型的元素个数。系统会根据类型自动地进行地址运算,并不是两个地址的直接相减。,上一页,下一页,返回,9.2 指针变量的定义与应用,9.2.2指针变量作函数参数 函数的参数是一般变量或常数时,函数实参向形参是单向值传递。函数的参数是数组名时,则将实参数组名传递给形参数组名,数组名表示数组中第一个元素的地址,故这种传递是地址传递。函数参数还可以是指针变量,其作用是将变量的地址传到另一函数中去。下面用指针变量作为函数参数来实现两个整数按由大到小的顺序

5、输出。,上一页,返回,9.3 数组的指针和指向数组的指针变量,9.3.1概述 C语言中数组与指针有着密切的联系,在编程时完全可以用指针代替下标引用数组及数组元素,且使数组的引用更为灵活、有效。当一个数组被定义后,程序会按照其类型和长度在内存中为数组分配一块连续的存储单元。此时,数组名成为符号常量,其值为数组在内存中所占用单元的首地址,也就是说数组名代表数组的首地址。指针是用来存放地址的变量,当某个指针存放数组名或数组中第一个元素的地址时,可以说该指针指向了这个数组,这样我们可以通过指针间接访问数组中的元素。,下一页,返回,9.3 数组的指针和指向数组的指针变量,9.3.2通过指针引用数组元素

6、通过指针引用数组元素,必须要定义指向数组的指针,例如: int a10; int *p; p=a; 以上语句定义了一个长度为10的一维整型数组,同时还定义了一个指针变量p,其基类型必须和所指向的数组类型相同,数组名a代表数组的首地址。由于数组的首地址就是数组元素a0的地址,故语句p=a;还可以是p= ,从而使p指向数组a的第0个元素。变量在定义的同时可以赋初值,上面三个语句还可以等价写成: int a10,*p=a;或 int a10,*p=&a(0); 只要移动指针p,就可访问数组a的任一元素。如图9-8所示。,上一页,下一页,返回,9.3 数组的指针和指向数组的指针变量,9.3.3数组名作

7、为函数的参数 数组名可以作为函数的形参或实参。如果要将一个一维数组的首地址传给函数,实参可以是数组名或存放有数组首地址的指针变量。而形参可以为一个一维数组或基类型为数组元素的指针变量。 例9.6 编一个函数,求数组a中n个整数的最小值。 方法1:形参为数组名,实参为指针。,上一页,下一页,返回,9.3 数组的指针和指向数组的指针变量,int fmin(int *p, int n) int i,m; m=*p; for(i=0;i*(p+i) m=*(p+i); return(m); main( ) int a10,min,i; for(i=0;in;i+) scanf(“%d”, ,上一页,下

8、一页,返回,9.3 数组的指针和指向数组的指针变量,该程序在进行函数调用时,将实参a的值(即数组的起始地址)传给形参p,指针p获得了数组的起始地址,通过指针的移动求出数组中元素的最小值。如图9-10所示。,上一页,下一页,返回,9.3 数组的指针和指向数组的指针变量,方法2:实参和形参均为指向数组元素基类型的指针变量。 int fmin(int *p,int n) int i,m; m=*p; for(i=0;i*(p+i) m=*(p+i); return(m); ,上一页,下一页,返回,9.3 数组的指针和指向数组的指针变量,main( ) int a10,i,*p1,min; for(i

9、=0;in;i+) scanf(“%d”, ,上一页,下一页,返回,9.3 数组的指针和指向数组的指针变量,方法3:实参和形参都是数组名。 int fmin(int b,int n) int i,m; m=b0; for(i=0;ibi) m=bi; return(m); ,上一页,下一页,返回,9.3 数组的指针和指向数组的指针变量,main( ) int a10,min,i; for(i=0;in;i+) scanf(“%d”, ,上一页,下一页,返回,9.3 数组的指针和指向数组的指针变量,方法4:实参为指向数组的指针变量,形参为数组。 int fmin(int b,int n) int

10、 i,m; m=b0; for(i=0;ibi) m=bi; return(m); ,上一页,下一页,返回,9.3 数组的指针和指向数组的指针变量,main( ) int a10,i,*p1,min; for(i=0;in;i+) scanf(“%d”, ,上一页,下一页,返回,9.3 数组的指针和指向数组的指针变量,说明:接受数组首地址的形参不论定义为数组形式还是定义为指针,C编译时都会把它转化为指针处理。因为参数不能接受整个数组,只能得到数组的起始地址。因此,形参中的数组名是指针变量而不是指针常量,这样就可以对作为形参的数组名进行各种运算,如自加或自减。但作为主函数中定义的数组名是常量,是

11、不可以进行自加或自减的。,上一页,下一页,返回,9.3 数组的指针和指向数组的指针变量,9.3.4二维数组的指针及其指针变量 用指针变量可以指向一维数组,并可通过指针引用数组元素。指针变量也可以指向二维数组,在概念和使用上,二维数组的指针较一维数组的指针要复杂一些。 1. 二维数组的地址表示法 二维数组从其表面上看既有行又有列,因此它的逻辑结构是二维结构。实际上,二维数组在内存中是以行的形式存放的,也就是说,它的物理结构是一维的。下面举例说明二维数组的地址及元素的关系和表示方法。,上一页,下一页,返回,9.3 数组的指针和指向数组的指针变量,设二维数组为: int a34=0,1,2,3,4,

12、5,6,7,8,9,10,11; 则数组名为a,它有3行4列共计12个元素。 0行: a00 a01 a02 a03 1行: a10 a11 a12 a13 2行: a20 a21 a22 a23 经初始化后,如图9-11所示。,上一页,下一页,返回,9.3 数组的指针和指向数组的指针变量,2指向二维数组的指针变量 在了解了上面的概念后,可以用指针变量指向二维数组及其元素。 (1)指向数组元素的指针变量 例9.7 用指针变量输出数组元素的值。 main( ) int a34=1,2,3,4,5,6,7,8,9,10,11,12; int *p, i=0; for(p=a0;pa0+12;p+,

13、i+) /* m */ if(i%4=0) printf(“n”); printf(“%5d”,*p); ,上一页,下一页,返回,9.3 数组的指针和指向数组的指针变量,(2) 指向数组的指针变量 对于二维数组元素的访问,还可以定义一个指向一维数组的指针,并将一个行地址送给它。这时指针值加1,则该指针移动的长度为一维数组的长度。 指向一维数组的指针的定义方法如下: 类型说明符 (*指针变量名)数组长度; 其中,类型说明符为数组元素的类型,数组长度确定了指针变量在进行加1或减1时移动的元素个数。,上一页,返回,9.4 字符串的指针和指向字符串的指针变量,9.4.1字符串的表示和引用 C语言中没有

14、专门存放字符串的变量,字符串是存放在字符数组中,且以0作为结束标志,数组名表示该字符串在内存中的首地址。当定义一个指针变量指向一字符数组后,就可以通过指针访问数组中的每个元素。因此,可以用两种方法访问一个字符串。,下一页,返回,9.4 字符串的指针和指向字符串的指针变量,1用字符数组处理字符串 例9.9 main( ) int i; char str =“I am a student.”; printf(“%sn”,str); for(i=0;stri!=0;i+) print(“%c”,stri); printf(“n”); printf(“%s”, ,上一页,下一页,返回,9.4 字符串的

15、指针和指向字符串的指针变量,2用字符指针实现上述结果 例9.10 main( ) char *str=“I am a student.”,*str1; str1=str; printf(“%sn”,str); for(; *str!=0;str+) print(“%c”,*str); printf(“n”); str1=str1+7; printf(“%s”,str1); ,上一页,下一页,返回,9.4 字符串的指针和指向字符串的指针变量,9.4.2字符串指针作函数参数 将一个字符串从一个函数传递到另一个函数,可以用字符数组作参数,也可以用指向字符串的指针变量作参数,即都是用地址传递的办法。若在被调用的函数中改变字符串的内容,则在主调函数中可以得到改变了的字符串。,上一页,下一页,返回,9.4 字符串的指针和指向字符串的指针变量,例9.13 编一函数实现字符串的复制 方法一:实参和形参都为字符数组 void str_copy(char str1 ,char str2 ) int i=0; while(str1i!=0) str2i=str1i;i+; str2i=0; ,上一页,下一页,返回,9.4 字符串的指针和指向字符串的指针变量,main( ) char a =“I am a student.”;

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

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

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