C语言程序设计实用教程-教学课件-第9章-指针.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《C语言程序设计实用教程-教学课件-第9章-指针.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言程序设计 实用教程 教学 课件 指针
- 资源描述:
-
1、佳木斯大学1第9章9.19.29.39.49.59.69.79.8佳木斯大学2掌握指针与指针变量的概念,熟练使用指针与地址运算符掌握变量、数组、字符串、函数、结构体的指针以及指向变量、数组、字符串、函数、结构体的指针变量。通过指针引用以上各类型数据掌握用指针作函数参数掌握返回指针值的指针函数掌握指针数组,指向指针的指针,main函数的命令行参数第9章9.19.29.39.49.59.69.79.8佳木斯大学31、掌握直接访问和间接访问、指针的、掌握直接访问和间接访问、指针的概念概念2、掌握指针变量的概念,熟练使用指、掌握指针变量的概念,熟练使用指针与地址运算符针与地址运算符3、掌握指向变量指针
2、的定义和使用、掌握指向变量指针的定义和使用第9章9.19.29.39.49.59.69.79.8佳木斯大学41、相、相 关关 概概 念念2、指针变量的定义和使用、指针变量的定义和使用3、指针变量作函数参数、指针变量作函数参数第9章9.19.29.39.49.59.69.79.8佳木斯大学51、间接访问的概念、指针变量作函数、间接访问的概念、指针变量作函数参数是难点参数是难点2、指针的概念、指针变量的定义和使、指针的概念、指针变量的定义和使用和指针变量作函数参数是重点用和指针变量作函数参数是重点第9章9.19.29.39.49.59.69.79.8佳木斯大学6采用理论讲解、形象教学方法采用理论讲
3、解、形象教学方法第9章9.19.29.39.49.59.69.79.8佳木斯大学7带着问题学习:带着问题学习:1)什么是直接访问和间接访问)什么是直接访问和间接访问2)指向变量的指针如何定义?指针有)指向变量的指针如何定义?指针有哪些运算?哪些运算?3)指针变量作函数参数时如何进行参)指针变量作函数参数时如何进行参数传递?数传递?第9章9.19.29.39.49.59.69.79.8佳木斯大学8指针是C语言中的一个重要的概念,也是C语言的一个重要特色。正确而灵活地运用它,可以有效地表示复杂的数据结构,能动态分配内存,能方便地使用字符串,有效而方便地使用数组,在调用函数时能得到多于一个的值,能直
4、接处理内存地址等,这对设计系统软件是很必要的。 第9章9.19.29.39.49.59.69.79.8佳木斯大学99.1.1 变量的地址 如果在程序中定义了一个变量,在编译时就给这个变量分配内存单元。系统根据程序中定义的变量类型,分配一定长度的空间。 第9章9.19.29.39.49.59.69.79.8佳木斯大学10如图9-1所示。假设程序中已定义了3个整型变量i、j、k,编译时内存用户数据区系统分配2000和2001两个字节给变量i,2002和2003字节给变量j,2004和2005给变量k。如果执行赋值语句i=3;j=6;k=9;则3、6、9分别是i、j、k的值,而2000、2002 、
5、2004分别是i、j、k的地址。20003变量i20026变量j20049变量k30102000变量i_pointer内存用户数据区图9-1 内存单元地址与内容第9章9.19.29.39.49.59.69.79.8佳木斯大学11直接访问直接访问-按名存取按名存取一般程序一般程序中通过变中通过变量名对内量名对内存数据进存数据进行存取操行存取操作作,实质上实质上是程序经是程序经编译后将编译后将变量名转变量名转变为内存变为内存地址地址.int a 0 x10010 x10030 x10050 x10070 x10090 x100B0 x100D0 x100F0 x1011 内存空间内存空间第9章9.
6、19.29.39.49.59.69.79.8佳木斯大学12int *pa 0 x10010 x10030 x10050 x10070 x10090 x100B0 x100D0 x100F0 x1011 内存空间内存空间0 x100F指针变量指针变量指针指针指向指向从另一个内存空间首先获取被访问的地从另一个内存空间首先获取被访问的地址址,再进行存取操作再进行存取操作.第9章9.19.29.39.49.59.69.79.8佳木斯大学139.1.3 指针和指针变量一个变量的地址称为该变量的指针。例如,地址2000是变量i的指针。如果有一个变量专门用来存放另一变量的地址(即指针),则其称为指针变量。上
7、述的i_pointer就是一个指针变量。注意区分指针和指针变量这两个概念。例如,可以说变量i的指针是2000,而不能说i的指针变量是2000。第9章9.19.29.39.49.59.69.79.8佳木斯大学14变量的指针就是变量的地址。存放变量地址的变量是指针变量,用来指向另一个变量。为了表示指针变量和它所指向的变量之间的联系,在程序中用“*”符号表示“指向”, 第9章9.19.29.39.49.59.69.79.8佳木斯大学159-2-1 指针变量的定义指针变量的定义 定义指针变量的一般形式为: 基类型基类型 *指针变量名指针变量名下面都是合法的定义: float *pointer_3; (
8、pointer_3是指向实是指向实型变量的指针变量型变量的指针变量) char *pointer_4; (pointer_4是指向字是指向字符型变量的指针变量符型变量的指针变量)第9章9.19.29.39.49.59.69.79.8佳木斯大学169-2-1 指针变量的定义指针变量的定义(1)指针变量前面的“*”,表示该变量的类型为指针型变量。注意:指针变量名是pointer_l、pointer_2,而不是*pointer_l、*pointer_2。 (2)在定义指针变量时必须指定基类型。指针变量所指向的变量的类型,即基类型。一个指针变量只能指向同一个类型的变量。第9章9.19.29.39.49
9、.59.69.79.8佳木斯大学179.2.2 指针变量的初始化和赋值指针变量在定义的同时也可以初始化。在C语言中,变量的地址是由编译系统分配的,对用户完全透明,用户不知道变量的具体地址。变量地址可以通过取地址运算符“&”来获得。运算对象是变量或数组元素,运算结果是对应变量或数组元素的地址。例如:int k=1;*p=&k;它有两个含义,一是定义指针变量p,二是给指针变量p赋初值取k的地址,相当于int *p;p=&k; 第9章9.19.29.39.49.59.69.79.8佳木斯大学18一个指针变量可以通过不同的方式获得一个确定的地址值,从而指向一个具体的对象。1通过求地址运算符(&)获得地
10、址值例如:定义:int k=1, *q; 则赋值语句:q=&k;把变量k的地址赋给q,这时可以说q指向变量k第9章9.19.29.39.49.59.69.79.8佳木斯大学192通过指针变量获得地址值 通过赋值运算把一个指针变量的值赋给另一个指针变量,使这两个指针指向同一地址。例如:有定义:int k,*p=&k, *q; 则语句q=p;使指针变量q中也存放变量k的地址,即变量p和变量q都指向k。注意:进行赋值运算时,赋值号两边指针变量的基类型必须相同。第9章9.19.29.39.49.59.69.79.8佳木斯大学203通过调用库函数获得地址值可以通过调用库函数malloc()和calloc
11、(),在内存中动态存储单元的地址赋给指针变量。具体相关内容将在第10章介绍。第9章9.19.29.39.49.59.69.79.8佳木斯大学214给指针变量赋空值除了给指针变量赋地址值外,还可以给指针变量赋NULL。它是在stdio.h头文件中定义的,其代码值为0,当执行p=NULL;后称p为空指针。p=NULL;等价于p=0或p=0;。第9章9.19.29.39.49.59.69.79.8佳木斯大学229-2-3 指针变量的引用指针变量的引用指针变量中只能存放地址指针变量中只能存放地址(指针指针),不要将一个整型量不要将一个整型量(或任何其它非地或任何其它非地址类型的数据址类型的数据)赋给一
12、个指针变量。赋给一个指针变量。第9章9.19.29.39.49.59.69.79.8佳木斯大学239-2-3 指针变量的引用指针变量的引用 两个有关的运算符:两个有关的运算符:(1)&:取地址运算符。:取地址运算符。(2) *:指针运算符:指针运算符(或称或称“间接访问间接访问”运算符运算符)。 “”和和“*”两个运算符的优先级两个运算符的优先级别相同,但按自右而左方向结合。别相同,但按自右而左方向结合。例如:例如:&a为变量为变量a的地址,的地址,*p为指针变为指针变量量p所指向的存储单元。所指向的存储单元。 第9章9.19.29.39.49.59.69.79.8佳木斯大学249-2-3 指
13、针变量的引用指针变量的引用【例【例9-1】 通过指针变量访问整型变量。通过指针变量访问整型变量。main( ) int a,b; int *p1,*p2; a=100;b=10; p1=&a; /*把变量把变量a的地址赋给的地址赋给p1*/ p2=&b; /*把变量把变量b的地址赋给的地址赋给p2*/ printf(%d,%dn,a,b); printf(%d,%dn,*p1,*p2);运行结果为:运行结果为:100,10100,10第9章9.19.29.39.49.59.69.79.8佳木斯大学259-2-2 指针变量的引用指针变量的引用【例【例9-2】 输入输入a和和b两个整数,按由大到小
14、的顺序两个整数,按由大到小的顺序输出。输出。main( )int *p1,*p2,*p,a,b; scanf(%d,%d,&a,&b); p1=&a;p2=&b; if(ab) p=p1;p1=p2;p2=p; printf(na=%d,b=%dnn,a,b); printf(max=%d,min=%dn,*p1,*p2);运行情况如下:运行情况如下:5,9a=5,b=9max=9,min=5第9章9.19.29.39.49.59.69.79.8佳木斯大学269.2.4 指针的运算1在指针值上加减一个整数指向数组或字符串的指针变量,可以加上或减去一个整数n。设pa是指向数组a的指针变量,则pa
15、+n、pa-n、pa+、+pa、pa-、-pa运算都是合法的。指针变量加上或减去一个整数n的意义是把指针指向的当前位置(指向某数组元素)向前或向后移动n个位置。 第9章9.19.29.39.49.59.69.79.8佳木斯大学27指向数组的指针变量向前或向后移动一个位置与地址加1或减1在概念上是不同的。因为数组可以有不同的类型,各种类型的数组元素所占的字节长度是不同的。如指针变量加1,即向后移动一个位置表示指针变量指向下一个数据元素的首地址,而不是在原地址基础上加1。例如:int a10,*pa;pa=a;pa=pa+3; /*pa指向a3,即pa的值为&a3*/指针变量的加减运算只能在指向数
16、组或字符串的指针变量中进行,对指向其他类型变量的指针变量是不能进行加减运算的,因为指向其他类型变量的指针变量的值不一定是连续的。第9章9.19.29.39.49.59.69.79.8佳木斯大学282指针变量和指针变量的减法运算指针变量和指针变量的减法运算规则如下:指针变量1一指针变量2只有指向同一数组的两个指针变量之间才能进行减法运算,否则不能进行运算。两指针变量相减所得之差是两个指针所指的数组元素之间相差的元素个数 第9章9.19.29.39.49.59.69.79.8佳木斯大学293指针变量的关系运算指针变量和指针变量的关系运算规则如下:指针变量1关系运算符 指针变量2指向同一数组的两个指
17、针变量进行关系运算可以表示其所指数组元素之间的关系。例如:Pl=p2,表示p1和p2指向同一数组元素。plp2,表示pl处于高地址位置。指针变量还可以与0进行比较。例如:设P为指针变量,则p=0表明P是空指针,其不指向任何变量。第9章9.19.29.39.49.59.69.79.8佳木斯大学30函数的参数不仅可以是整型、实函数的参数不仅可以是整型、实型、字符型等数据,还可以是指型、字符型等数据,还可以是指针类型。它的作用是将一个变量针类型。它的作用是将一个变量的地址传送到另一个函数中。的地址传送到另一个函数中。第9章9.19.29.39.49.59.69.79.8佳木斯大学31【例【例9-3】
18、 阅读下面程序,判断程序能否交换主函数中阅读下面程序,判断程序能否交换主函数中a和和b的值。的值。main( ) int a=1,b=2;printf(1:a=%d,b=%dn,a,b);swap(&a,&b); /*传传a,b的地址值的地址值*/printf(3:a=%d,b=%dn,a,b); /*再不能用再不能用*p,*q输出输出a,b的值。的值。p,q已不存在已不存在*/swap(int *p,int *q) /*p,q是指针变量是指针变量,分别指向分别指向a和和b。*p,*q分别代表分别代表a,b*/ int c; c=*p; *p=*q; *q=c; /*只能用指针只能用指针p,q
19、访问访问a,b,在此函数中在此函数中a,b无效无效*/ printf(2:%d,%dn,*p,*q); /*相当于输出主函数中相当于输出主函数中a,b的值的值*/ 运行结果是:运行结果是:1:a=1,b=22:2,13:a=2,b=1第9章9.19.29.39.49.59.69.79.8佳木斯大学329-2-3 指针变量作为函数参数指针变量作为函数参数 【例【例9-4】对输入的两个整数按大小顺序输出。】对输入的两个整数按大小顺序输出。swap (int *p1,int *p2) /* 交换两个变量交换两个变量a和和b的值的值*/ int temp;temp=*p1;*p1=*p2;*p2=te
20、mp;main( )int a,b;int *pointer_1,*pointer_2;scanf(%d,%d,&a,&b);pointer_1=&a; /*将将a的地址赋给指针变量的地址赋给指针变量pointer_1, 使使pointer_1指向指向a*/pointer_2=&b; /*将将b的地址赋给指针变量的地址赋给指针变量pointer_1, 使使pointer_1指向指向b*/if(ab) swap(pointer_1,pointer_2);printf(n%d,%dn,a,b); 运行情况如下:运行情况如下: 5,9 9,5第9章9.19.29.39.49.59.69.79.8佳木
21、斯大学33如果想通过函数调用得到n个要改变的值,可以按如下方法进行操作: 在主调函数中设n个变量; 将这n个变量的地址作为实参传给所调用函数的形参; 通过形参指针变量,改变该n个变量的值; 主调函数中可以使用这些改变了值的变量。第9章9.19.29.39.49.59.69.79.8佳木斯大学34【例【例9-5】 输入输入a、b、c 三个整数,按大小顺序输出。三个整数,按大小顺序输出。swap (int *pt1,int *pt2) int temp; temp=*pt1; *pt1=*pt2; *pt2=temp; change (int *q1,int *q2,int *q3) if( *q
22、1 *q2) swap(q1,q2); if( *q1 *q3) swap(q1,q3); if( *q2 *q3) swap(q2,q3); main( ) int a,b,c,*p1,*p2,*p3; scanf(%d,%d,%d,&a,&b,&c); p1=&a;p2=&b;p3=&c; change(p1,p2,p3); printf(n%d,%d,%dn,a,b,c);运行情况如下:运行情况如下:9,0,1010,9,0第9章9.19.29.39.49.59.69.79.8佳木斯大学351、数组的指针和指向数组的指针变量第9章9.19.29.39.49.59.69.79.8佳木斯大学
23、361、掌握数组的指针概念、用不同的方、掌握数组的指针概念、用不同的方式访问数组元素。式访问数组元素。2、掌握数组名作函数的参数、掌握数组名作函数的参数3、利用指针编写程序,培养学生动手、利用指针编写程序,培养学生动手编程的能力。编程的能力。第9章9.19.29.39.49.59.69.79.8佳木斯大学371、指向数组元素的指针、指向数组元素的指针2、通过指针引用数组元素、通过指针引用数组元素3、数组名作函数参数、数组名作函数参数第9章9.19.29.39.49.59.69.79.8佳木斯大学381、指向数组元素的指针、通过指针引、指向数组元素的指针、通过指针引用数组元素、数组名作函数参数是
24、重点用数组元素、数组名作函数参数是重点2、数组名作函数参数、利用指针编写、数组名作函数参数、利用指针编写程序是难点程序是难点第9章9.19.29.39.49.59.69.79.8佳木斯大学39采用理论讲解、讨论的教学方法采用理论讲解、讨论的教学方法第9章9.19.29.39.49.59.69.79.8佳木斯大学40带着问题学习指向数组的指针如何定义?数组名作参数和变量作参数在调用时传递过程有何不同第9章9.19.29.39.49.59.69.79.8佳木斯大学41所谓数组的指针是指数组的起始地所谓数组的指针是指数组的起始地址,数组元素的指针是数组元素的址,数组元素的指针是数组元素的地址。地址。
25、引用数组元素可以用下标法引用数组元素可以用下标法(如如a3),也可以用指针法,即通过指,也可以用指针法,即通过指向数组元素的指针找到所需的元素。向数组元素的指针找到所需的元素。使用指针法能使目标程序质量高使用指针法能使目标程序质量高(占占内存少,运行速度快内存少,运行速度快)。第9章9.19.29.39.49.59.69.79.8佳木斯大学429-4-1 指向数组元素的指针指向数组元素的指针 C语言规定数组名代表数组的首地址,也就是第0号元素的地址。因此,下面两个语句等价: p=&a0; p=a; 注意数组a不代表整个数组,上述p=a; 语句是把a数组的首地址赋给指针变量p,而不是把数组a各元
展开阅读全文