C语言程序设计PPT课件第9章指针.ppt

上传人:wuy****n92 文档编号:79009543 上传时间:2023-03-19 格式:PPT 页数:46 大小:1.69MB
返回 下载 相关 举报
C语言程序设计PPT课件第9章指针.ppt_第1页
第1页 / 共46页
C语言程序设计PPT课件第9章指针.ppt_第2页
第2页 / 共46页
点击查看更多>>
资源描述

《C语言程序设计PPT课件第9章指针.ppt》由会员分享,可在线阅读,更多相关《C语言程序设计PPT课件第9章指针.ppt(46页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、第第第第9 9 9 9章章章章 指针指针指针指针2023/1/162/46本章学习内容本章学习内容 指针数据类型指针数据类型 指针变量的定义和初始化指针变量的定义和初始化 取地址运算符,间接寻址运算符取地址运算符,间接寻址运算符 按值调用与按地址调用,指针变量作函数按值调用与按地址调用,指针变量作函数 参数参数 函数指针函数指针 2023/1/163/46void Swap(int x,int y)void Swap(int x,int y)int temp;int temp;temp=x;temp=x;x=y;x=y;y=temp;y=temp;int main()int a,b;a=5;b

2、=9;Swap(a,b);printf(a=%d,b=%d,a,b);return 0;程序程序 1:简单变量作函数参数:简单变量作函数参数例例7.9未能解决的问题:两数互换未能解决的问题:两数互换void Swap(int*x,int*y)int temp;temp=*x;*x=*y;*y=temp;int main()int a,b;a=5;b=9;Swap(&a,&b);printf(a=%d,b=%d,a,b);return 0;程序程序 2:指针变量作函数参数:指针变量作函数参数 Not Work!Why?指针指针为函数为函数提供修改变提供修改变量值的手段量值的手段 2023/1/1

3、64/469.1变量的内存地址变量的内存地址变量的地址变量的地址(Address)(Address)变量名变量名内存:计算机内的存储部件内存:计算机内的存储部件所有指令和数据都保存在内存里所有指令和数据都保存在内存里速度快,可随机访问,但掉电即失速度快,可随机访问,但掉电即失编译或函数调用时为变量分配内存单元编译或函数调用时为变量分配内存单元int a=0;int a=0;0 0 x0037b000 x0037b0000000ContentsContentsContentsContentsContentsContentsContents变量的值变量的值a a某存储区域2023/1/165/46

4、 9.1变量的内存地址变量的内存地址变量的地址变量的地址内存中的每个字节都有唯一的编号(地址)内存中的每个字节都有唯一的编号(地址)地址是一个十六进制无符号整数地址是一个十六进制无符号整数其字长一般与主机相同其字长一般与主机相同地址按字节编号,按类型分配空间地址按字节编号,按类型分配空间0 0 x0037b000 x0037b0000000ContentsContentsContentsContentsContentsContentsContents某存储区域0 0 x0037b001x0037b0010 0 x0037b002x0037b0020 0 x0037b003x0037b003&a

5、&aAddress Operatorint a=0;int a=0;a a2023/1/166/46 9.1变量的内存地址变量的内存地址如何读写内存中的数据?如何读写内存中的数据?0 0 x0037b000 x0037b0000000ContentsContentsContentsContentsContentsContentsContents某存储区域0 0 x0037b001x0037b0010 0 x0037b002x0037b0020 0 x0037b003x0037b003只要指明要访问的变量的内存单元地址只要指明要访问的变量的内存单元地址就可以立即访问到变量所在的存储单元就可以立即

6、访问到变量所在的存储单元&a&ascanf(%d,&a);int a=0;int a=0;a a2023/1/167/46 9.1变量的内存地址变量的内存地址【例例例例9.19.19.19.1】使用取地址运算符使用取地址运算符使用取地址运算符使用取地址运算符&取出变量的地址,取出变量的地址,取出变量的地址,取出变量的地址,然后将其显示在屏幕上。然后将其显示在屏幕上。然后将其显示在屏幕上。然后将其显示在屏幕上。表示输出变量表示输出变量a的地址值?的地址值?2023/1/168/46 9.1变量的内存地址变量的内存地址如何读写内存中的数据?如何读写内存中的数据?0 0 x0037b000 x003

7、7b0000000ContentsContentsContentsContentsContentsContentsContents某存储区域0 0 x0037b001x0037b0010 0 x0037b002x0037b0020 0 x0037b003x0037b003直接寻址:按变量地址存取变量值直接寻址:按变量地址存取变量值&a&ascanf(%d,&a);a aint a=0;int a=0;2023/1/169/46 9.1变量的内存地址变量的内存地址如何读写内存中的数据?如何读写内存中的数据?0 0 x0037b000 x0037b0000000ContentsContentsCo

8、ntentsContentsContentsContents0 x0037b000某存储区域0 0 x0037b001x0037b0010 0 x0037b002x0037b0020 0 x0037b003x0037b003间接寻址:通过存放变量地址的变量去访问变量间接寻址:通过存放变量地址的变量去访问变量&a&aa aint a=0;int a=0;2023/1/1610/46 intint i;i;scanf(%d,i);scanf(%d,i);/*/*/*/*这样会如何?这样会如何?这样会如何?这样会如何?*/charchar c;c;scanf(%d,&c);scanf(%d,&c);

9、/*/*/*/*这样呢?这样呢?这样呢?这样呢?*/i的值被当作地址。如的值被当作地址。如i=100,则输入的整数就会从地址则输入的整数就会从地址100开开始写入内存始写入内存输入以输入以int的二进制形式写到的二进制形式写到c所所在的内存空间。在的内存空间。c所占内存不足以放下一个所占内存不足以放下一个int,其后的空间也被覆盖其后的空间也被覆盖2023/1/1611/469.2指针变量的定义和初始化指针变量的定义和初始化 存放变量的地址需要一种特殊类型的变量存放变量的地址需要一种特殊类型的变量存放变量的地址需要一种特殊类型的变量存放变量的地址需要一种特殊类型的变量 指针指针指针指针(Poi

10、nterPointer)类型类型类型类型 指针变量指针变量指针变量指针变量具有指针类型的变量具有指针类型的变量具有指针类型的变量具有指针类型的变量 变量的指针变量的指针变量的指针变量的指针变量的地址变量的地址变量的地址变量的地址 指针变量指针变量 指向指向 变量变量变量的地址(指针)变量的地址(指针)变量值变量值变量地址存入变量地址存入指针变量指针变量2023/1/1612/46 9.2指针变量的定义和初始化指针变量的定义和初始化【例例例例9.29.29.29.2】使用指针变量在屏幕上显示变量的地址值使用指针变量在屏幕上显示变量的地址值使用指针变量在屏幕上显示变量的地址值使用指针变量在屏幕上显

11、示变量的地址值定义了指针变量定义了指针变量pa,但,但pa并未指向并未指向a?如果指针指向一个非你控制的内存空间如果指针指向一个非你控制的内存空间并对该空间进行访问,将可能造成危险并对该空间进行访问,将可能造成危险2023/1/1613/46 9.2指针变量的定义和初始化指针变量的定义和初始化【例例例例9.29.29.29.2】使用指针变量在屏幕上显示变量的地址值使用指针变量在屏幕上显示变量的地址值使用指针变量在屏幕上显示变量的地址值使用指针变量在屏幕上显示变量的地址值指针变量使用之前必须初始化指针变量使用之前必须初始化Never use uninitialized pointers2023/

12、1/1614/46 9.2指针变量的定义和初始化指针变量的定义和初始化【例例例例9.29.29.29.2】使用指针变量在屏幕上显示变量的地址值使用指针变量在屏幕上显示变量的地址值使用指针变量在屏幕上显示变量的地址值使用指针变量在屏幕上显示变量的地址值2023/1/1615/46 9.2指针变量的定义和初始化指针变量的定义和初始化【例例例例9.29.29.29.2】使用指针变量在屏幕上显示变量的地址值使用指针变量在屏幕上显示变量的地址值使用指针变量在屏幕上显示变量的地址值使用指针变量在屏幕上显示变量的地址值Pointers have names,types and values2023/1/16

13、16/46 9.2指针变量的定义和初始化指针变量的定义和初始化【例例例例9.29.29.29.2】使用指针变量在屏幕上显示变量的地址值使用指针变量在屏幕上显示变量的地址值使用指针变量在屏幕上显示变量的地址值使用指针变量在屏幕上显示变量的地址值指针变量指向的数据类型称为基类型指针变量指向的数据类型称为基类型指针变量只能指向同一基类型的变量指针变量只能指向同一基类型的变量2023/1/1617/46 9.2指针变量的定义和初始化指针变量的定义和初始化【例例例例9.29.29.29.2】使用指针变量在屏幕上显示变量的地址值使用指针变量在屏幕上显示变量的地址值使用指针变量在屏幕上显示变量的地址值使用指

14、针变量在屏幕上显示变量的地址值不能写成:不能写成:int*pa,pb;2023/1/1618/46 9.3 间接寻址运算符间接寻址运算符【例例例例9.39.39.39.3】使用指针变量,通过间接寻址输出变量的值使用指针变量,通过间接寻址输出变量的值使用指针变量,通过间接寻址输出变量的值使用指针变量,通过间接寻址输出变量的值papa*pa*paa a2023/1/1619/46 9.3 间接寻址运算符间接寻址运算符【例例例例9.39.39.39.3】使用指针变量,通过间接寻址输出变量的值使用指针变量,通过间接寻址输出变量的值使用指针变量,通过间接寻址输出变量的值使用指针变量,通过间接寻址输出变量

15、的值papa*pa*paa a9 9引用指针所指向的变量的值引用指针所指向的变量的值称为指针的解引用称为指针的解引用(Pointer Dereference)2023/1/1620/46 普通变量作函数参数普通变量作函数参数普通变量作函数参数普通变量作函数参数按值调用按值调用按值调用按值调用(Call by ValueCall by Value)Can not modify the Can not modify the argumentargument 形参形参形参形参(parameterparameter)实参变量实参变量实参变量实参变量(variablevariable)指针作函数参数指针

16、作函数参数指针作函数参数指针作函数参数按地址调用按地址调用按地址调用按地址调用(Call by ReferenceCall by Reference )In order to modify the In order to modify the argumentargument,use:use:指针形参指针形参指针形参指针形参(pointer parameter)(pointer parameter)&(&(variablevariable)a a&a&apointer parameterpointer parametera ax xparameterparameterargumentargum

17、ent9.4 按值调用与按地址调用按值调用与按地址调用2023/1/1621/46 9.4 按值调用与按地址调用按值调用与按地址调用【例例例例9.49.49.49.4】演示按值调用演示按值调用演示按值调用演示按值调用传变量的值传变量的值形参值的改变形参值的改变不会影响对应的实参不会影响对应的实参2023/1/1622/46 9.4 按值调用与按地址调用按值调用与按地址调用【例例例例9.59.59.59.5】演示按地址调用演示按地址调用演示按地址调用演示按地址调用传变量地址传变量地址2023/1/1623/46 9.4 按值调用与按地址调用按值调用与按地址调用【例例例例9.49.49.49.4】

18、演示按值调用演示按值调用演示按值调用演示按值调用指针变量作函数参数指针变量作函数参数可以修改实参的值可以修改实参的值【例例例例9.59.59.59.5】演示按地址调用演示按地址调用演示按地址调用演示按地址调用2023/1/1624/46 9.4 按值调用与按地址调用按值调用与按地址调用【例例例例9.49.49.49.4】演示按值调用演示按值调用演示按值调用演示按值调用return仅限于仅限于从函数返回一个值从函数返回一个值2023/1/1625/46void Swap(int*x,int*y)int temp;temp=*x;*x=*y;*y=temp;int main()int a,b;a=

19、5;b=9;Swap(&a,&b);printf(a=%d,b=%d,a,b);return 0;void Swap(int x,int y)void Swap(int x,int y)int temp;int temp;temp=x;temp=x;x=y;x=y;y=temp;y=temp;int main()int a,b;a=5;b=9;Swap(a,b);printf(a=%d,b=%d,a,b);return 0;程序程序 1程序程序 2 主调函数主调函数被调被调函数函数实实 参参形形 参参结果有何不同?结果有何不同?Not Work!Why?Trace the executionT

20、race the execution例例9.69.6:编写函数实现两数的互换:编写函数实现两数的互换2023/1/1626/46intint main()intint a,b;a=5;b=9;Swap(a,b);printf(a=%d,b=%d,a,b);returnreturn 0;voidvoid Swap(Swap(intint x,x,intint y y)intint temp;temp;temp=x;temp=x;x=y;x=y;y=temp;y=temp;55ab实实 参参形形 参参99xyabxy55temp9x 和和 y是内部变量是内部变量单向值传递单向值传递例例9.69.6

21、:编写函数实现两数的互换:编写函数实现两数的互换主调函数主调函数被调函数被调函数2023/1/1627/46intint main()intint a,b;a=5;b=9;Swap(&a,&b);printf(a=%d,b=%d,a,b);returnreturn 0;voidvoid Swap(Swap(intint*x,*x,intint*y*y)intint temp;temp;temp=*x;temp=*x;*x=*y;*x=*y;*y=temp;*y=temp;&a&a实实 参参形形 参参&b&bxyabxy5temp5ab995*x*y交换的是交换的是x 和和 y指向的单元内容指向

22、的单元内容主调函数主调函数被调函数被调函数例例9.69.6:编写函数实现两数的互换:编写函数实现两数的互换2023/1/1628/46voidvoid Swap(Swap(intint*x,*x,intint*y*y)intint temp;temp;temp=*x;temp=*x;*x=*y;*x=*y;*y=temp;*y=temp;指针指针pTemp未初始化未初始化指针指针pTemp指向哪里未知指向哪里未知对未知单元写操作是危险的对未知单元写操作是危险的voidvoid Swap(Swap(intint*x,*x,int int*y)*y)intint *pTemp*pTemp;*pTe

23、mp*pTemp=*x;=*x;*x=*y;*x=*y;*y=*y=*pTemp*pTemp;永远要清楚:永远要清楚:每个指针指向了哪里每个指针指向了哪里指针指向的内容是什么指针指向的内容是什么 2023/1/1629/46voidvoid Swap(Swap(intint*x,*x,intint*y*y)intint temp;temp;temp=*x;temp=*x;*x=*y;*x=*y;*y=temp;*y=temp;指针指针pTemp被赋了值被赋了值但交换的是地址值但交换的是地址值不是指针指向单元的内容不是指针指向单元的内容voidvoid Swap(Swap(intint*x,*x

24、,int int*y)*y)intint *pTemp*pTemp;pTemppTemp=x;=x;x=y;x=y;y=y=pTemppTemp;2023/1/1630/469.5用指针变量作函数参数的程序实例用指针变量作函数参数的程序实例 【例【例【例【例9.79.79.79.7】计算并输出最高分及相应学生的学号】计算并输出最高分及相应学生的学号】计算并输出最高分及相应学生的学号】计算并输出最高分及相应学生的学号2023/1/1631/46【例【例【例【例9.79.79.79.7】计算并输出最高分及相应学生的学号】计算并输出最高分及相应学生的学号】计算并输出最高分及相应学生的学号】计算并输出

25、最高分及相应学生的学号Not Work!Why?9.5用指针变量作函数参数的程序实例用指针变量作函数参数的程序实例 2023/1/1632/469.5用指针变量作函数参数的程序实例用指针变量作函数参数的程序实例 【例【例【例【例9.79.79.79.7】计算并输出最高分及相应学生的学号】计算并输出最高分及相应学生的学号】计算并输出最高分及相应学生的学号】计算并输出最高分及相应学生的学号真正的原因:普通变量作函数参数按值调用真正的原因:普通变量作函数参数按值调用不能在被调函数中改变相应的实参值不能在被调函数中改变相应的实参值2023/1/1633/469.5用指针变量作函数参数的程序实例用指针变

26、量作函数参数的程序实例 【例【例【例【例9.79.79.79.7】计算并输出最高分及相应学生的学号】计算并输出最高分及相应学生的学号】计算并输出最高分及相应学生的学号】计算并输出最高分及相应学生的学号2023/1/1634/469.5用指针变量作函数参数的程序实例用指针变量作函数参数的程序实例 【例【例【例【例9.79.79.79.7】计算并输出最高分及相应学生的学号】计算并输出最高分及相应学生的学号】计算并输出最高分及相应学生的学号】计算并输出最高分及相应学生的学号2023/1/1635/469.6函数指针及其应用函数指针及其应用 函数指针函数指针函数指针函数指针(Function Poin

27、ters)(Function Pointers)就是指向函数的指针(就是指向函数的指针(就是指向函数的指针(就是指向函数的指针(Pointer Pointer to a Functionto a Function)指向函数的指针变量存储的是函数在内存中的入口地址指向函数的指针变量存储的是函数在内存中的入口地址指向函数的指针变量存储的是函数在内存中的入口地址指向函数的指针变量存储的是函数在内存中的入口地址 编译器将不带编译器将不带编译器将不带编译器将不带()()的函数名解释为该函数的入口地址的函数名解释为该函数的入口地址的函数名解释为该函数的入口地址的函数名解释为该函数的入口地址数据类型数据类型

28、数据类型数据类型 (*(*(*(*指针名指针名指针名指针名)();)();)();)();例如:例如:例如:例如:int(*p)();int(*p)();常见错误:常见错误:常见错误:常见错误:忘记了前一个忘记了前一个忘记了前一个忘记了前一个()()()(),写成,写成,写成,写成 int*p();int*p();/*/*/*/*声明一个函数名为声明一个函数名为声明一个函数名为声明一个函数名为p p p p、返回值是整型指针的函数、返回值是整型指针的函数、返回值是整型指针的函数、返回值是整型指针的函数*/*/*/*/忘掉了后一个忘掉了后一个忘掉了后一个忘掉了后一个()()()(),写成,写成,

29、写成,写成 int(*p);int(*p);/*/*/*/*定义了一个整型指针定义了一个整型指针定义了一个整型指针定义了一个整型指针*/*/*/*/定义时后一个括号内的参数类型与指向的函数参数类型不匹配定义时后一个括号内的参数类型与指向的函数参数类型不匹配定义时后一个括号内的参数类型与指向的函数参数类型不匹配定义时后一个括号内的参数类型与指向的函数参数类型不匹配2023/1/1636/46 应用应用应用应用编写通用性更强的函数编写通用性更强的函数编写通用性更强的函数编写通用性更强的函数 典型实例典型实例典型实例典型实例1 1计算函数的定积分计算函数的定积分计算函数的定积分计算函数的定积分 典型

30、实例典型实例典型实例典型实例2 2既能按照升序排序,又能按照降序排序既能按照升序排序,又能按照降序排序既能按照升序排序,又能按照降序排序既能按照升序排序,又能按照降序排序9.69.6函数指针及其应用函数指针及其应用函数指针及其应用函数指针及其应用 2023/1/1637/46【例例例例9.89.89.89.8】修改例修改例修改例修改例8.88.88.88.8中的排序函数,使其既能实现中的排序函数,使其既能实现中的排序函数,使其既能实现中的排序函数,使其既能实现对学生成绩的升序排序,又能实现对学生成绩的对学生成绩的升序排序,又能实现对学生成绩的对学生成绩的升序排序,又能实现对学生成绩的对学生成绩

31、的升序排序,又能实现对学生成绩的降序排序降序排序降序排序降序排序 先不使用函数指针编程先不使用函数指针编程先不使用函数指针编程先不使用函数指针编程 9.69.6函数指针及其应用函数指针及其应用函数指针及其应用函数指针及其应用 2023/1/1638/469.69.6函数指针及其应用函数指针及其应用函数指针及其应用函数指针及其应用 2023/1/1639/469.69.6函数指针及其应用函数指针及其应用函数指针及其应用函数指针及其应用 2023/1/1640/462023/1/1641/46【例例例例9.99.99.99.9】修改例修改例修改例修改例9.89.89.89.8中的程序实例,用函数指

32、针编中的程序实例,用函数指针编中的程序实例,用函数指针编中的程序实例,用函数指针编程实现一个通用的排序函数,对学生成绩既能实程实现一个通用的排序函数,对学生成绩既能实程实现一个通用的排序函数,对学生成绩既能实程实现一个通用的排序函数,对学生成绩既能实现升序排序,又能实现降序排序现升序排序,又能实现降序排序现升序排序,又能实现降序排序现升序排序,又能实现降序排序 使用函数指针编程使用函数指针编程使用函数指针编程使用函数指针编程 9.69.6函数指针及其应用函数指针及其应用函数指针及其应用函数指针及其应用 2023/1/1642/469.69.6函数指针及其应用函数指针及其应用函数指针及其应用函数

33、指针及其应用 2023/1/1643/46Swap(&ai,&ak);9.69.6函数指针及其应用函数指针及其应用函数指针及其应用函数指针及其应用 2023/1/1644/46void SelectionSort(int a,int n,void SelectionSort(int a,int n,int(*compare)(int a,int b)int(*compare)(int a,int b)if(if(*compare)(aj,ak)(*compare)(aj,ak)/*/*决定数据是否按升序排序决定数据是否按升序排序决定数据是否按升序排序决定数据是否按升序排序,ab,ab为真为真为

34、真为真,则按升序排序则按升序排序则按升序排序则按升序排序*/int Ascending(int a,int b)int Ascending(int a,int b)return a b;return a b,ab为真为真为真为真,则按降序排序则按降序排序则按降序排序则按降序排序*/int Descending(int a,int b)int Descending(int a,int b)return a b;return a b;9.69.6函数指针及其应用函数指针及其应用函数指针及其应用函数指针及其应用 2023/1/1645/46指针变量与其他类型变量的对比指针变量与其他类型变量的对比指针

35、变量与其他类型变量的对比指针变量与其他类型变量的对比 共性共性共性共性在内存中占据一定大小的存储单元在内存中占据一定大小的存储单元在内存中占据一定大小的存储单元在内存中占据一定大小的存储单元先定义,后使用先定义,后使用先定义,后使用先定义,后使用 特殊性特殊性特殊性特殊性它的内容只能是地址它的内容只能是地址它的内容只能是地址它的内容只能是地址必须初始化必须初始化必须初始化必须初始化后才能使用,否则指向不确定的存储单元后才能使用,否则指向不确定的存储单元后才能使用,否则指向不确定的存储单元后才能使用,否则指向不确定的存储单元只能指向只能指向只能指向只能指向同一基类型同一基类型同一基类型同一基类型

36、的变量的变量的变量的变量可参与的运算:加、减整数,自增、自减、关系、赋值可参与的运算:加、减整数,自增、自减、关系、赋值可参与的运算:加、减整数,自增、自减、关系、赋值可参与的运算:加、减整数,自增、自减、关系、赋值 使用原则使用原则使用原则使用原则明确指针指向了哪里明确指针指向了哪里明确指针指向了哪里明确指针指向了哪里明确指针指向单元的内容是什么明确指针指向单元的内容是什么明确指针指向单元的内容是什么明确指针指向单元的内容是什么永远不要使用未初始化的指针变量永远不要使用未初始化的指针变量永远不要使用未初始化的指针变量永远不要使用未初始化的指针变量2023/1/1646/46 Questions and answersQuestions and answers

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

当前位置:首页 > 教育专区 > 大学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com