C语言程序设计第四版-8-谭浩强课件.ppt

上传人(卖家):三亚风情 文档编号:2971399 上传时间:2022-06-17 格式:PPT 页数:38 大小:267KB
下载 相关 举报
C语言程序设计第四版-8-谭浩强课件.ppt_第1页
第1页 / 共38页
C语言程序设计第四版-8-谭浩强课件.ppt_第2页
第2页 / 共38页
C语言程序设计第四版-8-谭浩强课件.ppt_第3页
第3页 / 共38页
C语言程序设计第四版-8-谭浩强课件.ppt_第4页
第4页 / 共38页
C语言程序设计第四版-8-谭浩强课件.ppt_第5页
第5页 / 共38页
点击查看更多>>
资源描述

1、第第8 8章章 指针指针指针是指针是C语言的一个重要特色;语言的一个重要特色;正确而灵活地运用指针可以:正确而灵活地运用指针可以:有效表示复杂的数据结构;有效表示复杂的数据结构;能动态分配内存;能动态分配内存;方便地使用字符串;方便地使用字符串;有效而方便地使用数组;有效而方便地使用数组;在调用函数时能获得在调用函数时能获得1个以上的结果;个以上的结果;能直接处理内存单元的地址能直接处理内存单元的地址可以使程序简洁、紧凑、高效可以使程序简洁、紧凑、高效关于指针关于指针 由内存单元组成,每个单元有地址,由内存单元组成,每个单元有地址,存放一字节数据存放一字节数据内存储器内存储器000000011

2、111010013A613A513A7short int a;变量变量aa=500;内存地址是二进制数,内存地址是二进制数,通常写成十六进制通常写成十六进制内存地址内存地址内存中存储单元的编号内存中存储单元的编号 计算机内存由大量存储单元计算机内存由大量存储单元 (memory unit)组成。组成。 每个存储单元容量为字节每个存储单元容量为字节(byte) 。 每个存储单元有编号,即存储单元的每个存储单元有编号,即存储单元的“地址地址” (address) 。 存储单元中可存放数据存储单元中可存放数据(data)。变量的地址变量的地址 定义变量时,系统分配给变量的内定义变量时,系统分配给变量

3、的内存单元的存单元的起始地址起始地址 变量值的存取通过变量在内存中的变量值的存取通过变量在内存中的地址进行地址进行 变量的地址称为变量的地址称为“指针指针”(pointer)(1)直接访问直接访问直接利用变量的地址进直接利用变量的地址进行存取行存取 例:例:short int a; /分配内存地址分配内存地址 a=500; 在符号表中检索变量名在符号表中检索变量名a,找到其起,找到其起始地址始地址(例如例如13A6);将数值;将数值500(的二的二进制形式进制形式)送到内存单元送到内存单元13A6和和13A7中中变量的访问方式变量的访问方式(2)间接访问间接访问通过指针变量访问变量通过指针变量

4、访问变量地址地址 定义一种特殊的定义一种特殊的变量变量,用来,用来存放存放其其它变量的它变量的地址地址(指针指针),这种变量称为),这种变量称为指针变量指针变量,它,它指向指向一个普通的变量。一个普通的变量。变量的访问方式变量的访问方式指针变量的定义和调用指针变量的定义和调用int a;int *a_pointer;a = 500;a_pointer = &a;printf(%dn,*a_pointer);printf(%xn,a_pointer);*a_pointer = 3;定义一个指针变量定义一个指针变量它它指向指向一个整型变量一个整型变量(基类型基类型)给指针变量赋值给指针变量赋值指针

5、变量的值是指针变量的值是另一个变量的地址另一个变量的地址指针变量所指针变量所指向指向的的变量即变量即a的值的值指针变量的值,指针变量的值,即即a的地址的地址对对指向指向的变量的变量(即即a)赋值赋值例:例:73页输页输出格出格式式两个指针变量交换两个指针变量交换了它们的值,也就了它们的值,也就是交换了指向是交换了指向int main() int n1,n2; int *n1_p=&n1, *n2_p=&n2, *pointer; printf(Input n1:); scanf(%d,n1_p); printf(Input n2:); scanf(%d,n2_p); printf(n1=%d,

6、 n2=%dn, n1, n2); printf(*n1_p=%d, *n2_p=%dn, *n1_p, *n2_p); printf(n1_p=%o, n2_p=%on, n1_p, n2_p); pointer=n1_p; n1_p=n2_p; n2_p=pointer; printf(n1=%d, n2=%dn, n1, n2); printf(*n1_p=%d, *n2_p=%dn, *n1_p, *n2_p); printf(n1_p=%o, n2_p=%on, n1_p, n2_p);例例. 分析以下程序运行结果分析以下程序运行结果开始时指针变量开始时指针变量n1_p指向指向n1,

7、指针变量,指针变量n2_p指向指向n2。变量变量n1和和n2的值并没有改变,但的值并没有改变,但n1_p 和和n2_p的值改变了,也就是指向改变了。的值改变了,也就是指向改变了。指针变量指针变量n1_p指向指向n2,指针变量,指针变量n2_p指向指向n1。上页代码要点上页代码要点内存内存内存单元内存单元内存单元的地址内存单元的地址变量的首地址变量的首地址指针指针指针变量指针变量指针变量的指向指针变量的指向直接访问与间接访问直接访问与间接访问掌握几个重要概念掌握几个重要概念区别两个区别两个 *p int *p; p=&a; *p=3;指针变量的重要作用之一指针变量的重要作用之一 作为函数的参数,

8、实现地址传递作为函数的参数,实现地址传递int main() void swap(int p1,int p2); int a,b; scanf(%d,%d,&a,&b); if(ab) swap(a,b); printf(%d,%dn,a,b); return 0; 例例 函数调用中的值传递函数调用中的值传递void swap(int p1,int p2) int p; p=p1; p1=p2; p2=p;运行结果:运行结果:a,b没有交换。没有交换。原因:原因:C语言中,实参向形参语言中,实参向形参传递数据采用传递数据采用“值传递值传递”,形参单独占用内存单元,交形参单独占用内存单元,交换对

9、实参无影响。换对实参无影响。void swap(int *p1,int *p2) int p; p=*p1; *p1=*p2; *p2=p;例例 通过指针变量实现地址传递的效果通过指针变量实现地址传递的效果注意这两个注意这两个*p1的的含义不同,前者说含义不同,前者说明明p1为指针变量,为指针变量,后者表示后者表示p1所指向所指向的变量。的变量。int main() void swap(int *p1,int *p2); int a,b; int *a_p=&a, *b_p=&b; scanf(%d,%d,&a,&b); if(ab) swap(a_p,b_p); printf(%d,%dn,

10、a,b); return 0; p是普通的变量是普通的变量指针变量作为函数的参数指针变量作为函数的参数指针作实参,对应的形参是指针变量。指针作实参,对应的形参是指针变量。C语言的参数传递是语言的参数传递是“值传递值传递”。指针变量做参数时,由于其值为变量的地址,指针变量做参数时,由于其值为变量的地址,产生产生“地址传递地址传递”的效果的效果。数组做函数的参数时,也是数组做函数的参数时,也是“地址传递地址传递”。被调用函数不能改变实参指针变量的值,但被调用函数不能改变实参指针变量的值,但可以改变实参指针变量所指向的变量的值。可以改变实参指针变量所指向的变量的值。指针变量指针变量阅读例阅读例8.2

11、-例例8.5,上机调试上机调试,观察结果,分,观察结果,分析掌握。析掌握。要求能够熟练地掌握指针变量及其指向的变要求能够熟练地掌握指针变量及其指向的变化过程,能够化过程,能够在纸上在纸上画图表达分析过程。画图表达分析过程。访问数组访问数组指针的又一重要用途指针的又一重要用途short int a3;200020022004a0a1a2元素的地址元素的地址数组元素数组元素元素的值元素的值0000000000000110a2=6;xxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx元素的地址元素的地址数组的首地址数组的首地址数组和指针的相关概念数组和

12、指针的相关概念数组的指针:数组的指针:数组数组在内存中的在内存中的起始地址起始地址,即即首元素首元素(下标为下标为0的元素的元素)的的首地址首地址数组元素的指针:数组元素的指针:数组元素数组元素在内存中的在内存中的起始地址起始地址数组名数组名:代表数组首元素的地址:代表数组首元素的地址(指针指针)指向数组的指向数组的指针变量指针变量:存储数组某个元:存储数组某个元素的地址,即素的地址,即指向某个元素指向某个元素定义指向数组的指针变量定义指向数组的指针变量u int array5, *pointer = array;u int array5, *pointer; pointer = array;

13、 u int array5, *pointer = &array0; 使用指针访问数组元素,能使使用指针访问数组元素,能使目标程目标程序序占用内存少、运行速度快。占用内存少、运行速度快。通过指针引用数组元素通过指针引用数组元素例例int main( ) int a5=12,6,18,23,9; int *p; p=a; printf(%d,%xn,*p,p); printf(%d,%xn,*(p+2),p+2); p+; printf(%d,%xn,*p,p); p=p+2; printf(%d,%xn,*p,p); return 0;通过指针引用数组元素通过指针引用数组元素对于对于数组数组a

14、和指向该数组首元素的和指向该数组首元素的指针变量指针变量pp+i 和和 a+i 均表示元素均表示元素ai的地址的地址*(p+i), *(a+i), ai 均表示元素均表示元素ai的值的值p+1的含义是指向下一个元素地址的含义是指向下一个元素地址可以可以p+,不能不能a+首元素地址不能改变首元素地址不能改变注意区别注意区别*p+(等价于(等价于*(p+)), *(+p)和和(*p)+(P.236-237)若定义数组若定义数组a5和指针变和指针变量量*p=a,则,则a6等价于等价于p+6,指针指向数组之后,指针指向数组之后的地址,故不报错的地址,故不报错参见参见P.378 运算符的运算符的优先级与

15、结合性优先级与结合性通过指针引用数组元素通过指针引用数组元素例例教材教材 P.233-234 例例8.6三种表达方式三种表达方式P.235 例例8.7 不能达到目的不能达到目的数组名作为函数的参数数组名作为函数的参数进一步分析进一步分析用指针访问数组用指针访问数组 实参实参 形参形参数数 组组 名名 数数 组组 名名数数 组组 名名 指针变量指针变量指针变量指针变量 指针变量指针变量指针变量指针变量 数数 组组 名名数组名数组名指针变量指针变量数组名作为函数的参数数组名作为函数的参数以指针表示以指针表示P.239 例例8.8 数组元素逆序排列数组元素逆序排列 形参:数组名;实参:数组名形参:数

16、组名;实参:数组名P.241 例例8.8 程序修改程序修改 形参:指针变量形参:指针变量P.242 例例8.9 数组元素逆序排列数组元素逆序排列 形参:指针变量;实参:指针变量形参:指针变量;实参:指针变量P.244 例例8.10 选择排序选择排序 形参:数组;实参:指针变量形参:数组;实参:指针变量P.245 例例8.10 函数修改函数修改 形参:指针变量形参:指针变量多维数组的指针多维数组的指针以二维数组为例以二维数组为例例:声明数组例:声明数组 int a34a00 a01 a02 a03a10 a11 a12 a13a20 a21 a22 a23a &a00 a0a+1 &a10 a1

17、a+2 &a20 a2二维数组的行指针:二维数组的行指针:以二维数组名表示以二维数组名表示多维数组的指针多维数组的指针以二维数组为例以二维数组为例例:声明数组例:声明数组 int a34a00 a01 a02 a03a10 a11 a12 a13a20 a21 a22 a23二维数组的行指针:二维数组的行指针:以二维数组名表示以二维数组名表示int *p=a;p=a+1;p=a+2;p = a00p = a10p = a20多维数组的指针多维数组的指针以二维数组为例以二维数组为例例:声明数组例:声明数组 int a34a00 a01 a02 a03a10 a11 a12 a13a20 a21

18、a22 a23a0 &a00a0+1 &a01a1+2 &a12 a0+5 &a11二维数组的列指针:二维数组的列指针:以一维数组名表示以一维数组名表示多维数组的指针多维数组的指针以二维数组为例以二维数组为例例:声明数组例:声明数组 int a34a00 a01 a02 a03a10 a11 a12 a13a20 a21 a22 a23二维数组的列指针:二维数组的列指针:以指针变量表示以指针变量表示int *p;p=a;p+;p=p+5;p = a00p = a01p = a12通过指针引用字符串通过指针引用字符串字符串是在内存中连续存放的一组字符字符串是在内存中连续存放的一组字符以变量形式保

19、存字符串需要声明字符数组以变量形式保存字符串需要声明字符数组或声明一个或声明一个指针变量访问字符串指针变量访问字符串或字符数组或字符数组(P.257图图8.28)不是字符串变量不是字符串变量char *string;string=Work hard!;printf(%sn,string);printf(%cn,*string+);printf(%cn,*(string+5);printf(%sn,string);+在后,先取在后,先取p值,再值,再+,p用于用于*p请对照请对照*(+p)通过指针引用字符串通过指针引用字符串P.255 例例8.16 使用字符数组存放字符串使用字符数组存放字符串

20、使用使用字符数组名字符数组名输出字符串输出字符串 使用字符数组下标访问数组元素使用字符数组下标访问数组元素通过指针引用字符串通过指针引用字符串P.256 例例8.17 使用基类型为字符的指针使用基类型为字符的指针变量保存字符串首元素地址,从而访问变量保存字符串首元素地址,从而访问字符串字符串 char *p=China; printf(%s,p);P.256例例8.18数组名指针的应用数组名指针的应用(字符型字符型)P.256例例8.19指针变量访问字符型数组指针变量访问字符型数组相当于相当于 char *p; p=China;而不是而不是 char *p; *p=China;通过指针引用字符

21、串通过指针引用字符串字符指针作函数参数字符指针作函数参数 实参实参 形参形参数组名数组名 数组名数组名数组名数组名 指针变量指针变量指针变量指针变量 指针变量指针变量指针变量指针变量 数组名数组名P.259-263 例例8.20各种不同的表达方式各种不同的表达方式8.4.3节节 分析一些容易发生的错误分析一些容易发生的错误指向函数的指针指向函数的指针指向指向函数代码的起始地址函数代码的起始地址。若声明一个若声明一个指针变量存放指针变量存放该地址,则可通过此该地址,则可通过此指针变量来调用该函数。指针变量来调用该函数。 例:例:P.267 改写的代码改写的代码作用:可用同样的语句调用不同函数作用

22、:可用同样的语句调用不同函数定义一个以定义一个以指向函数的指针变量指向函数的指针变量作为形参的函作为形参的函数,可写出复杂程序数,可写出复杂程序(P.271例例8.24和和P.273分析分析)返回指针值的函数返回指针值的函数 一个函数,其运算结果和返回值是一个函数,其运算结果和返回值是指针值指针值 P.274 例例8.25 P.275 例例8.26指针数组和多重指针指针数组和多重指针u指针数组指针数组是存放指针数据的数组是存放指针数据的数组u指向上述数组的指针指向上述数组的指针指向指针数指向指针数据的指针据的指针u在操作系统下调用在操作系统下调用C语言程序时,如语言程序时,如果要向果要向C程序

23、传递数据,可使用程序传递数据,可使用带参数带参数的的main函数函数,其形参是指针数组,其形参是指针数组动态内存分配与指向它的指针变量动态内存分配与指向它的指针变量 关于内存地址分配,参见关于内存地址分配,参见7.9节。节。全局变量全局变量/静态变量:保存在静态存储区。声静态变量:保存在静态存储区。声明时分配存储空间,明时分配存储空间, 文件运行结束时释放。文件运行结束时释放。自动变量:声明时动态地分配存储空间,函自动变量:声明时动态地分配存储空间,函数运行结束时释放。数运行结束时释放。栈存储区栈存储区一些临时数据可在使用时动态地分配存储单一些临时数据可在使用时动态地分配存储单元,使用结束立即

24、释放。元,使用结束立即释放。堆存储区,只堆存储区,只能用指针访问。能用指针访问。动态内存分配与指向它的指针变量动态内存分配与指向它的指针变量 内存动态分配库函数内存动态分配库函数 (stdlib.h)(1) malloc(size) 分配分配size字节的存储空间字节的存储空间(2) calloc(n,size) 分配分配n个个size字节的连续空间字节的连续空间(3) free(p) 释放指针变量释放指针变量p占用的动态空间占用的动态空间(4) realloc(p,size) 改变指针变量改变指针变量p指向的空间大小指向的空间大小函数函数(1)(2)(4)返回返回void基类型的指针;基类型的指针;(3)无返回值无返回值使用使用void基类型的指针变量访问动态内存分配区基类型的指针变量访问动态内存分配区例例8.30小小 结结 理解指针,能深入计算机的内存,写出面理解指针,能深入计算机的内存,写出面向底层的程序,使程序简洁明快。向底层的程序,使程序简洁明快。 初学者首先做到理解概念,读懂例子,将初学者首先做到理解概念,读懂例子,将一些做过的题改用指针完成,初步了解指针一些做过的题改用指针完成,初步了解指针的概念与用法。的概念与用法。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

1,本文(C语言程序设计第四版-8-谭浩强课件.ppt)为本站会员(三亚风情)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|