C语言程序设计应用教程 教学课件 ppt 作者 许勇 第6章 指针

上传人:E**** 文档编号:89190583 上传时间:2019-05-21 格式:PPT 页数:79 大小:554.50KB
返回 下载 相关 举报
C语言程序设计应用教程 教学课件 ppt 作者 许勇 第6章 指针_第1页
第1页 / 共79页
C语言程序设计应用教程 教学课件 ppt 作者 许勇 第6章 指针_第2页
第2页 / 共79页
C语言程序设计应用教程 教学课件 ppt 作者 许勇 第6章 指针_第3页
第3页 / 共79页
C语言程序设计应用教程 教学课件 ppt 作者 许勇 第6章 指针_第4页
第4页 / 共79页
C语言程序设计应用教程 教学课件 ppt 作者 许勇 第6章 指针_第5页
第5页 / 共79页
点击查看更多>>
资源描述

《C语言程序设计应用教程 教学课件 ppt 作者 许勇 第6章 指针》由会员分享,可在线阅读,更多相关《C语言程序设计应用教程 教学课件 ppt 作者 许勇 第6章 指针(79页珍藏版)》请在金锄头文库上搜索。

1、第6章 指 针,6.1 指针的含义 6.2 指针变量 6.3 指针与数组 6.4 指针与函数 6.5 指针与字符串 6.6 字符数组与字符指针的区别 6.7 多级指针 6.8 指针类型小结,预备知识,内存:就是内部存储器,是由存储单元组成 的。它的特点是存储单元是线性连续 的。存储单元的最小单位是字节。,1. 内存的概念,地址:为了访问内存中的某个存储单元,我们 要为它编号,这种编号称为内存地址。 通过地址我们就能够访问该地址所标 识的存储单元。,2. 地址的概念,变量的地址:变量在内存中总占用几个连续的 字节,开始字节的地址,就是变量的地址。,2007,存储单元,6.1 指针的含义,指针:一

2、个变量的地址称为该变量的指针。,指针的对象:当把变量的地址存入指针变量后, 我们就可以说这个指针指向了该变量。,变量的存取方法:直接存取和间接存取。,6.2 指针变量,6.2.1 指针变量的概念,指针变量:若一个变量专用于存放另一个变量 的地址(指针),则该变量称为指针变量。,6.2.2 指针变量的定义,例如: int *ptr1, *ptr2;,指针变量的类型:指明了该指针指向的内存空 间所存储的数据类型。,在定义指针变量时要注意以下几个问题:, 变量名ptr2前面的“*”不能省略,如果写成 int *ptr1, ptr2; 则ptr2被定义为整型变量,而非整型指针变量。,定义中的“*”表示

3、所定义的变量是指针变量,但 指针变量名是ptr1、ptr2,而非*ptr1、*ptr2。,指针变量只能指向定义时所规定类型的变量。 这个规定的类型称为该指针变量的“基类型”。,如:上例中ptr1、ptr2只能指向整型变量,不 能指向实型或字符型变量。其“基类型” 相同,都是整型。,定义指针变量后,并未确定该变量指向何处。 也就是说该变量的值是不确定的。在引用指针 变量前必须首先让它指向一个变量,这一点非 常重要。,首先介绍指针运算符(,),“&”(地址运算符) :取变量的存储地址。,“*” (引用运算符) :是取指针所指向变量的内容 。,例如:&a 是求变量a的地址。,ptr指向了i变量,*p

4、tr表示i的值,即3,说明:,在定义指针变量时,可以立即将一个地址值 赋给指针变量,这就是指针变量的初始化。 指针变量的初始化也是指针的赋值运算。,如:float flt,*f_ptr=,注意:这不是给*f_ptr赋值 。,指针变量间的赋值和引用应保证基类型相同。,若有定义: int *p , i ; float *q , x ;,则:q= ,我们还可以用这种方法实现对变量的改变:,*ptr=15 ; 等价于 i=15 ;,由此可见:通过指针运算符“*”可以引用一个变量。如:当ptr已经指向变量i后,*ptr就等同于i。,进一步理解“&”和“*”:,等价于,6.2.3 指针变量赋值与初始化,指

5、针变量赋值后,指针变量就指向一个确定的内存存储单元。,使用指针的赋值运算()对指针变量赋值,使用取地址运算符,把地址值赋值给指针变量。,如:int i, *pi ; pi=,把指针变量的值赋给另一个指针变量。,如:int i,*pa,*pb; pa=,给指针变量赋值为符号常量NULL。,说明:NULL是一个空指针,表示该指针变量的值没有意义。作用是为了避免对没有被初始化的指针变量的非法引用。NULL 的定义在“stdio.h”中。,如:int *pi ; pi=NULL ;,1指针的+、运算,说明:,指针与整型值加减的结果是指针,表示使该指针指向该指针下移或上移存储单元个数(整型值)之后的内存

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

7、8,16,32; ptr1 = ,x 的值是3,2指针的+、 -、+=、-= 运算,+、 += :是移动指针到下一个或下几个存储单元。,-、 -= :是移动指针到上一个或上几个存储单元。,例如:int *ptr, ary5=2,4,6,8,10 ; ptr=ary; ptr+=3; ptr-;,想一想:*ptr+和(*ptr)+有什么 的区别 ?,基类型相同的两个指针进行比较运算,其意义是两个指针的位置比较,结果是逻辑值。,指针运算的程序举例:把a,b按大小顺序输出。,main() int *p1,*p2,*p,a,b; a=45;b=76; p1= ,输出结果: a=45,b=76,max=

8、76,min=45,指针的关系运算,6.3 指针与数组,6.3.1 一维数组的指针,数组的指针 :是数组的起始地址。,数组元素的指针 :是数组元素的地址。,当指针变量指向数组或数组元素时,它就是指向数组的指针变量。,C规定:,数组名代表数组的首地址(起始地址), 也就是第一个元素的地址。,当指针变量p指向数组时,p+1指向数组 的下一个元素。假设一个整型元素占两 个字节,p+1是使p的地址加2个字节。,如:int a10,*p ; 则:p=a ; 与 p=等价 称指针变量p指向数组元素a0,p+i、a+i 、&ai 都是ai的地址。,一维数组元素的引用,1. 用下标法引用数组元素,如:a3=4

9、5;,2. 用指针法引用数组元素,假如: int a10, *p, i ; p=a;,则:*(p+i)、*(a+i)则代表元素ai, *(p+i)也可以写成pi,程序举例:输出10个元素数组中的全部元素。,方法二:通过数组名计算数组元素地址,找出元素的 值。 main() int a10=54,65,8,2,3,56,8,21,57,98,i; for(printf(“n“),i=0;i10;i+) printf(“%4d“,*(a+i); ,方法一:下标法。 main() int a10=54,65,8,2,3,56,8,21,57,98, i; for(printf(“n“),i=0;i1

10、0;i+) printf(“%4d“,ai); ,方法三:用指针变量指向数组元素 main() int a10=54,65,8,2,3,56,8,21,57,98,*p,i; p=a; for(printf(“n“),i=0;i10;i+) printf(“%4d“,*p+); ,以上三种方法,利用指针变量效率最高。,说明:指针变量与数组名的区别:,指针变量是地址变量,数组名是地址常量。即指针变量的内容可以在程序运行过程中被改变;而数组名一旦被定义,它的值就不能被改变了。,例如: int i, *p, a6; 则:p=,不能给常量赋值,利用指针变量编程时特别要注意指针变量 的当前值。,例如:通

11、过指针变量输入输出a数组元素。 main() int *p,i,a10; p=a; for(i=0;i10;i+) scanf(“%d“,p+); for(printf(“n”),i=0;i10;i+) printf(“%6d”,*p+); ,应插入语句 p=a;,注意:*p+、*(p+)、(*p)+、*(+p)的含义,6.3.2 二维数组的指针,1二维数组的指针概念,在C语言中,一个二维数组可以看成是一个一维数组,其中每个元素又是一个包含若干元素的一维数组。,假如有定义:int a23;,则C语言编译程序认为a数组是由a0,a1两个元素组成的一维数组,a0和a1分别是包含三个元素的一维数组名

12、,分别代表a数组元素的起始地址(即a0是第0行元素的首地址, a1是第1行元素的首地址)。因此,a和a0是两个基类型不同的指针常量。,2通过指针引用二维数组元素,假如有定义: int a35, i,j ; (其中0i 3, 0j 5),则:ai和*(a+i)(无条件等价)都是第i行第0列 元素的地址,那么ai+j、*(a+i)+j、 &a00+5*i+j都是第i行第j列元素的地址。,数组a中任意元素aij的引用可以表示成如 下几种形式: aij、*(ai+j)、*(*(a+i)+j)、(*(a+i)j、 *(&a00+5*i+j ),总结,对二维数组的引用有三种方式: 下标法。如aij或pij

13、。 指针法,如*(*(p+i)+j)或*(*(a+i)+j)。 下标指针混合法,如(ai+j),(pi+j),(*(a+i)j,(*(p+i)j,*(a0+i*n+j)等。 注意:,3通过一个行指针变量引用二维数组的元素,例如:假若有语句 int a23, (*p)3; p=a;,注意:*p两侧的圆括号不可缺少。,则: p是一个指向由3个整型元素组成的一 维数 组的指针变量。,例:使用行指针变量访问数组元素。,main() float fa510, (*pf)10=fa; int i,j; for(i=0; i5; i+) for(j=0; j10; j+) *(*(pf+i)+j)=i*j;

14、 for(i=0;i5;i+) for(puts(“),j=0;j10;j+) printf(“ %.0f“,faij); ,6.4 指针与函数,6.4.1 变量的指针作为函数参数,指针可以用作函数参数,这在调用函数希望改变参数的值时非常有用。,例如:用指针变量编写实现两个数的交换的函数,void swap(int *p1, int *p2); main() int x1=100,x2=200; printf(“x1=%d,x2=%dn“,x1,x2); swap( ,void swap(int *p1, int *p2) int temp; temp=*p1; *p1=*p2; *p2=te

15、mp; ,图示交换过程中存储单元内容的变化:,1,2,3,4,5,6,想一想:如果函数的参数不用指针而用整数, 能否实现值的交换?为什么?,通过函数调用得到n个要改变的值的方法:,在主调函数中设n个变量,用n个指针变量指向它们;,将指针变量作实参,将这n个变量的地址传给所调用 的函数的形参;,通过形参指针变量,改变该n个变量的值;,主调函数中就可以使用这些改变了值的变量。,注意:不能企图通过改变指针形参的值而使指 针实参的值改变。 如:上例swap函数中不能写成: temp=p1; p1=p2; ;p2=temp;,6.4.2 指针型函数,返回指针的函数称作指针函数 。,含意:函数的返回值是一个指针,它指向所定 义类型的数据 。,例如:int *a(int x, int y) ; /*函数原型声明*/ 含意:a是函数名,调用它以后能得到一个指 向整型数据的指针(地址)。,1. 指针型函数的定义方法,例: 编写能返回结果串地址的串拷贝函数。,#include “stdio.h “ char *strcpy1(char* str1,char*str2); main() char *ps, s180=“yhhhj“; ps=strcpy1(s1,“fdgjdfh“); puts(ps

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

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

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