C程序语言课件:第9章 指针

上传人:桔**** 文档编号:570196808 上传时间:2024-08-02 格式:PPT 页数:35 大小:2.18MB
返回 下载 相关 举报
C程序语言课件:第9章 指针_第1页
第1页 / 共35页
C程序语言课件:第9章 指针_第2页
第2页 / 共35页
C程序语言课件:第9章 指针_第3页
第3页 / 共35页
C程序语言课件:第9章 指针_第4页
第4页 / 共35页
C程序语言课件:第9章 指针_第5页
第5页 / 共35页
点击查看更多>>
资源描述

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

1、第第第第9 9 9 9章章章章 指针指针指针指针2024/8/22/46本章学习内容本章学习内容本章学习内容本章学习内容 指针数据类型指针数据类型 指针变量的定义和初始化指针变量的定义和初始化 取地址运算符,间接寻址运算符取地址运算符,间接寻址运算符 按值调用与按地址调用,指针变量作函数按值调用与按地址调用,指针变量作函数 参数参数2024/8/23/46void 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=

2、%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:指针变量作函数参数:指针变量作函数参数 指针指针为函数为函数提供修改变提供修改变量值的手段量值的手段 2024/8/24/469.19.1

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

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

5、b003x0037b003&a&aAddress Operatorint a=0;int a=0;a a2024/8/26/46 9.19.1变量的内存地址变量的内存地址变量的内存地址变量的内存地址如何读写内存中的数据?如何读写内存中的数据?0 0x0037b000x0037b0000000ContentsContentsContentsContentsContentsContentsContents某存储区域0 0x0037b001x0037b0010 0x0037b002x0037b0020 0x0037b003x0037b003只要指明要访问的变量的内存单元地址只要指明要访问的变量的内存

6、单元地址就可以立即访问到变量所在的存储单元就可以立即访问到变量所在的存储单元&a&ascanf(%d, &a);int a=0;int a=0;a a2024/8/27/46 9.19.1变量的内存地址变量的内存地址变量的内存地址变量的内存地址【例例例例9.19.19.19.1】使用取地址运算符使用取地址运算符使用取地址运算符使用取地址运算符& & & &取出变量的地址,取出变量的地址,取出变量的地址,取出变量的地址,然后将其显示在屏幕上。然后将其显示在屏幕上。然后将其显示在屏幕上。然后将其显示在屏幕上。表示输出变量表示输出变量a的地址值?的地址值?2024/8/28/46 9.19.1变量的

7、内存地址变量的内存地址变量的内存地址变量的内存地址如何读写内存中的数据?如何读写内存中的数据?0 0x0037b000x0037b0000000ContentsContentsContentsContentsContentsContentsContents某存储区域0 0x0037b001x0037b0010 0x0037b002x0037b0020 0x0037b003x0037b003直接寻址:按变量地址存取变量值直接寻址:按变量地址存取变量值&a&ascanf(%d, &a);a aint a=0;int a=0;2024/8/29/46 9.19.1变量的内存地址变量的内存地址变量的内

8、存地址变量的内存地址如何读写内存中的数据?如何读写内存中的数据?0 0x0037b000x0037b0000000ContentsContentsContentsContentsContentsContents0x0037b000某存储区域0 0x0037b001x0037b0010 0x0037b002x0037b0020 0x0037b003x0037b003间接寻址:通过存放变量地址的变量去访问变量间接寻址:通过存放变量地址的变量去访问变量&a&aa aint a=0;int a=0;2024/8/210/46 intint i; i;scanf(%d, i); scanf(%d, i)

9、; /* /* /* /* 这样会如何?这样会如何?这样会如何?这样会如何?* * * */ / / / charchar c; c;scanf(%d, &c); scanf(%d, &c); /* /* /* /* 这样呢?这样呢?这样呢?这样呢?* * * */ / / /i的值被当作地址。如的值被当作地址。如i=100,则输入的整数就会从地址则输入的整数就会从地址100开开始写入内存始写入内存输入以输入以int的二进制形式写到的二进制形式写到c所所在的内存空间。在的内存空间。c所占内存不足以放下一个所占内存不足以放下一个int,其后的空间也被覆盖其后的空间也被覆盖2024/8/211/4

10、69.29.2指针变量的定义和初始化指针变量的定义和初始化指针变量的定义和初始化指针变量的定义和初始化 存放变量的地址需要一种特殊类型的变量存放变量的地址需要一种特殊类型的变量存放变量的地址需要一种特殊类型的变量存放变量的地址需要一种特殊类型的变量 指针指针指针指针(PointerPointer)类型类型类型类型 指针变量指针变量指针变量指针变量具有指针类型的变量具有指针类型的变量具有指针类型的变量具有指针类型的变量 变量的指针变量的指针变量的指针变量的指针变量的地址变量的地址变量的地址变量的地址 指针变量指针变量 指向指向 变量变量变量的地址(指针)变量的地址(指针)变量值变量值变量地址存入

11、变量地址存入指针变量指针变量2024/8/212/46 9.29.2指针变量的定义和初始化指针变量的定义和初始化指针变量的定义和初始化指针变量的定义和初始化【例例例例9.29.29.29.2】使用指针变量在屏幕上显示变量的地址值使用指针变量在屏幕上显示变量的地址值使用指针变量在屏幕上显示变量的地址值使用指针变量在屏幕上显示变量的地址值定义了指针变量定义了指针变量pa,但,但pa并未指向并未指向a?如果指针指向一个非你控制的内存空间如果指针指向一个非你控制的内存空间并对该空间进行访问,将可能造成危险并对该空间进行访问,将可能造成危险2024/8/213/46 9.29.2指针变量的定义和初始化指

12、针变量的定义和初始化指针变量的定义和初始化指针变量的定义和初始化【例例例例9.29.29.29.2】使用指针变量在屏幕上显示变量的地址值使用指针变量在屏幕上显示变量的地址值使用指针变量在屏幕上显示变量的地址值使用指针变量在屏幕上显示变量的地址值指针变量使用之前必须初始化指针变量使用之前必须初始化Never use uninitialized pointers2024/8/214/46 9.29.2指针变量的定义和初始化指针变量的定义和初始化指针变量的定义和初始化指针变量的定义和初始化【例例例例9.29.29.29.2】使用指针变量在屏幕上显示变量的地址值使用指针变量在屏幕上显示变量的地址值使用

13、指针变量在屏幕上显示变量的地址值使用指针变量在屏幕上显示变量的地址值2024/8/215/46 9.29.2指针变量的定义和初始化指针变量的定义和初始化指针变量的定义和初始化指针变量的定义和初始化【例例例例9.29.29.29.2】使用指针变量在屏幕上显示变量的地址值使用指针变量在屏幕上显示变量的地址值使用指针变量在屏幕上显示变量的地址值使用指针变量在屏幕上显示变量的地址值Pointers have names, types and values2024/8/216/46 9.29.2指针变量的定义和初始化指针变量的定义和初始化指针变量的定义和初始化指针变量的定义和初始化【例例例例9.29.2

14、9.29.2】使用指针变量在屏幕上显示变量的地址值使用指针变量在屏幕上显示变量的地址值使用指针变量在屏幕上显示变量的地址值使用指针变量在屏幕上显示变量的地址值指针变量指向的数据类型称为基类型指针变量指向的数据类型称为基类型指针变量只能指向同一基类型的变量指针变量只能指向同一基类型的变量2024/8/217/46 9.29.2指针变量的定义和初始化指针变量的定义和初始化指针变量的定义和初始化指针变量的定义和初始化【例例例例9.29.29.29.2】使用指针变量在屏幕上显示变量的地址值使用指针变量在屏幕上显示变量的地址值使用指针变量在屏幕上显示变量的地址值使用指针变量在屏幕上显示变量的地址值不能写

15、成:不能写成:int *pa, pb;2024/8/218/46 9.3 9.3 间接寻址运算符间接寻址运算符间接寻址运算符间接寻址运算符【例例例例9.39.39.39.3】使用指针变量,通过间接寻址输出变量的值使用指针变量,通过间接寻址输出变量的值使用指针变量,通过间接寻址输出变量的值使用指针变量,通过间接寻址输出变量的值papa*pa*paa a2024/8/219/46 9.3 9.3 间接寻址运算符间接寻址运算符间接寻址运算符间接寻址运算符【例例例例9.39.39.39.3】使用指针变量,通过间接寻址输出变量的值使用指针变量,通过间接寻址输出变量的值使用指针变量,通过间接寻址输出变量的

16、值使用指针变量,通过间接寻址输出变量的值papa*pa*paa a9 9引用指针所指向的变量的值引用指针所指向的变量的值称为指针的解引用称为指针的解引用(Pointer Dereference)2024/8/220/46 普通变量作函数参数普通变量作函数参数普通变量作函数参数普通变量作函数参数按值调用按值调用按值调用按值调用( (Call by ValueCall by Value) )Can not modify the Can not modify the argumentargument 形参形参形参形参(parameterparameter) 实参变量实参变量实参变量实参变量(vari

17、ablevariable) 指针作函数参数指针作函数参数指针作函数参数指针作函数参数按地址调用按地址调用按地址调用按地址调用( (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

18、xparameterparameterargumentargument9.4 9.4 按值调用与按地址调用按值调用与按地址调用按值调用与按地址调用按值调用与按地址调用2024/8/221/46 9.4 9.4 按值调用与按地址调用按值调用与按地址调用按值调用与按地址调用按值调用与按地址调用【例例例例9.49.49.49.4】演示按值调用演示按值调用演示按值调用演示按值调用传变量的值传变量的值形参值的改变形参值的改变不会影响对应的实参不会影响对应的实参2024/8/222/46 9.4 9.4 按值调用与按地址调用按值调用与按地址调用按值调用与按地址调用按值调用与按地址调用【例例例例9.59.5

19、9.59.5】演示按地址调用演示按地址调用演示按地址调用演示按地址调用传变量地址传变量地址2024/8/223/46 9.4 9.4 按值调用与按地址调用按值调用与按地址调用按值调用与按地址调用按值调用与按地址调用【例例例例9.49.49.49.4】演示按值调用演示按值调用演示按值调用演示按值调用指针变量作函数参数指针变量作函数参数可以修改实参的值可以修改实参的值【例例例例9.59.59.59.5】演示按地址调用演示按地址调用演示按地址调用演示按地址调用2024/8/224/46 9.4 9.4 按值调用与按地址调用按值调用与按地址调用按值调用与按地址调用按值调用与按地址调用【例例例例9.49

20、.49.49.4】演示按值调用演示按值调用演示按值调用演示按值调用return仅限于仅限于从函数返回一个值从函数返回一个值2024/8/225/46void 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; void Swap(int x,int y) int temp; temp = x; x = y; y = temp;int main() int a

21、, b; a = 5; b = 9; Swap(a, b); printf( a=%d,b=%d ,a,b); return 0;程序程序 1程序程序 2 主调函数主调函数被调被调函数函数实实 参参形形 参参结果有何不同?结果有何不同?Trace the executionTrace the execution例例9.69.6:编写函数实现两数的互换:编写函数实现两数的互换2024/8/226/46intint main() intint a, b; a = 5; b = 9; Swap(a, b); printf( a=%d,b=%d ,a,b); returnreturn 0;voidvo

22、id 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:编写函数实现两数的互换:编写函数实现两数的互换主调函数主调函数被调函数被调函数2024/8/227/46intint main() intint a, b; a = 5; b = 9; Swap( &a, &b ); printf( a=%d,

23、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指向的单元内容指向的单元内容主调函数主调函数被调函数被调函数例例9.69.6:编写函数实现两数的互换:编写函数实现两数的互换2024/8/228/46voidvoid Swap

24、( 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; ; *pTemp*pTemp = *x; = *x; *x = *y; *x = *y; *y

25、= *y = *pTemp*pTemp; ; 永远要清楚:永远要清楚:每个指针指向了哪里每个指针指向了哪里指针指向的内容是什么指针指向的内容是什么 2024/8/229/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

26、 *x, *x, int int *y)*y) intint *pTemp*pTemp; ; pTemppTemp = x; = x; x = y; x = y; y = y = pTemppTemp; ; 2024/8/230/469.59.5用指针变量作函数参数的程序实例用指针变量作函数参数的程序实例用指针变量作函数参数的程序实例用指针变量作函数参数的程序实例 【例【例9.79.7】计算并输出最高分及相应学生的学号】计算并输出最高分及相应学生的学号2024/8/231/46【例【例9.79.7】计算并输出最高分及相应学生的学号】计算并输出最高分及相应学生的学号9.59.5用指针变量作函数参

27、数的程序实例用指针变量作函数参数的程序实例用指针变量作函数参数的程序实例用指针变量作函数参数的程序实例 2024/8/232/469.5用指针变量作函数参数的程序实例用指针变量作函数参数的程序实例 【例【例9.79.7】计算并输出最高分及相应学生的学号】计算并输出最高分及相应学生的学号真正的原因:普通变量作函数参数按值调用真正的原因:普通变量作函数参数按值调用不能在被调函数中改变相应的实参值不能在被调函数中改变相应的实参值2024/8/233/469.5用指针变量作函数参数的程序实例用指针变量作函数参数的程序实例 【例【例9.79.7】计算并输出最高分及相应学生的学号】计算并输出最高分及相应学生的学号2024/8/234/469.5用指针变量作函数参数的程序实例用指针变量作函数参数的程序实例 【例【例9.79.7】计算并输出最高分及相应学生的学号】计算并输出最高分及相应学生的学号2024/8/235/46本章学习内容本章学习内容 指针数据类型指针数据类型 指针变量的定义和初始化指针变量的定义和初始化 取地址运算符,间接寻址运算符取地址运算符,间接寻址运算符 按值调用与按地址调用,指针变量作函数按值调用与按地址调用,指针变量作函数 参数参数

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

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