书签 分享 收藏 举报 版权申诉 / 137
上传文档赚钱

类型C语言程序设计实用教程-教学课件-第9章-指针.ppt

  • 上传人(卖家):三亚风情
  • 文档编号:2448894
  • 上传时间:2022-04-19
  • 格式:PPT
  • 页数:137
  • 大小:711.50KB
  • 【下载声明】
    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各元

    26、素的值赋给p。 第9章9.19.29.39.49.59.69.79.8佳木斯大学439-4-2 通过指针引用数组元素通过指针引用数组元素如果如果p的初值为的初值为&a0,则:,则:(1)p+i和和a+i就是就是ai的地址,或者说,它们的地址,或者说,它们指向指向a数组的第数组的第i个元素,这里需要说明的个元素,这里需要说明的是是a代表数组首地址,代表数组首地址,a+i也是地址,它的也是地址,它的计算方法同计算方法同p+i,即它的实际地址为,即它的实际地址为a+id(d是一个数组元素所占的字节数是一个数组元素所占的字节数 )。例如,例如,p+9 和和a+9的值是的值是a9,它指向,它指向a9。

    27、第9章9.19.29.39.49.59.69.79.8佳木斯大学449-4-2 通过指针引用数组元素通过指针引用数组元素(2)*(p+i)或或*(a+i)是是p+i或或a+i所指向的数组所指向的数组元素,即元素,即ai。例如,例如,*(p+5)或或*(a+5)就是就是a5,*(p+5)=*(a+5)=a5。在编译时,把数组元素在编译时,把数组元素ai处理成处理成*(a+i),即按数组首地址加上相对位移量得到要找即按数组首地址加上相对位移量得到要找的元素的地址,然后找出该单元中的内容。的元素的地址,然后找出该单元中的内容。第9章9.19.29.39.49.59.69.79.8佳木斯大学459-4

    28、-2 通过指针引用数组元素通过指针引用数组元素 (3)指向数组的指针变量也可以带下标,如指向数组的指针变量也可以带下标,如pi与与*(p+i)等价。等价。 根据以上叙述,引用一个数组元素,可根据以上叙述,引用一个数组元素,可以用:以用: 下标法,下标法,如如ai形式。形式。 指针法,指针法,如如*(a+i)或或*(p+i)。其中。其中a是数组是数组名,名,p是指向数组的指针变量,初值是指向数组的指针变量,初值p= a。第9章9.19.29.39.49.59.69.79.8佳木斯大学469-4-2 通过指针引用数组元素通过指针引用数组元素(4)当指针指向一串连续的存储单元时,当指针指向一串连续的

    29、存储单元时,可以对指针进行加上或减去一个整数,可以对指针进行加上或减去一个整数,这种操作称为指针的移动。这种操作称为指针的移动。例如例如p+;或或p-;都可以使指针移动。移动指针都可以使指针移动。移动指针后,指针不应超出数组元素的范围。后,指针不应超出数组元素的范围。第9章9.19.29.39.49.59.69.79.8佳木斯大学479-4-2 通过指针引用数组元素通过指针引用数组元素(5)指针不允许进行乘、除运算,移动指针不允许进行乘、除运算,移动指针时,不允许加上或减去一个非整指针时,不允许加上或减去一个非整数,对指向同一串连续存储单元的两数,对指向同一串连续存储单元的两个指针只能进行相减

    30、操作。个指针只能进行相减操作。第9章9.19.29.39.49.59.69.79.8佳木斯大学48【例【例9-6】输出数组中的全部元素。】输出数组中的全部元素。方法一:方法一:(1)下标法。下标法。main( ) int a10; int i; printf(n); for(i=0;i10;i+) scanf(%d,&ai); printf(n); for(i=0;i10;i+) printf(%d ,ai); 运行情况如下:运行情况如下:1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0第9章9.19.29.39.49.59.69.79.8佳木斯大学49(2)通过

    31、数组名计算数组元素地址,找出元素的值。main( ) int a10; int i; printf(n); for(i=0;i10;i+) scanf(%d,&ai); printf(n); for(i=0;i10;i+) printf(%d ,*(a+i); 运行情况如下:运行情况如下:1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0第9章9.19.29.39.49.59.69.79.8佳木斯大学50(3)用指针变量指向数组元素。main( ) int a10; int *p,i; printf(n); for(i=0;i10;i+) scanf(%d,&ai)

    32、; printf(n); for(p=a;p(a+10);p+) printf(%d ,*p);运行情况如下:运行情况如下:1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0第9章9.19.29.39.49.59.69.79.8佳木斯大学51例9-6的第(1)和(2)种方法执行效率相同。C编译系统将ai转换成*(a+i)进行处理。即先计算元素地址。因此用第(1)和(2)种方法找数组元素比较费时。第(3)种方法比(1)(2)法快,用指针变量直接指向元素,不需要每次都重新计算地址,像p+这样的自加是比较快的,能大大提高执行效率。第9章9.19.29.39.49.59.6

    33、9.79.8佳木斯大学52用下标法比较直观,能直接知道是第几个元素。用地址法或指针变量的方法不直观,难以很快地判断出当前处理的是哪一个元素。第9章9.19.29.39.49.59.69.79.8佳木斯大学53 在使用指针变量时,有几个问题要注意:(1)指针变量可以实现使本身的值指针变量可以实现使本身的值改变改变(2)要注意指针变量的当前值。要注意指针变量的当前值。 第9章9.19.29.39.49.59.69.79.8佳木斯大学54【例【例9-7】 通过指针变量输出数组通过指针变量输出数组a的的10个元素。个元素。 main( ) int *p,i,a10; p=a; printf(n); f

    34、or(i=0;i10;i+) scanf(%d,p+); printf(n); p=a; for(i=0;i10;i+,p+) printf(%d ,*p); 运行情况如下:运行情况如下:1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0第9章9.19.29.39.49.59.69.79.8佳木斯大学55在使用指针变量时,有几个问题要注意:(3)注意指针变量的运算。如果先使如果先使p指向数组指向数组a(即即p=a),则:,则:p+(或或p+=1),使,使p指向下一元素,即指向下一元素,即a1。若再执行。若再执行*p,取出下一个元素,取出下一个元素a1值。值。 *p+

    35、,由于,由于+和和*同优先级,结合方同优先级,结合方向为自右而左,因此它等价于向为自右而左,因此它等价于*(p+)。作用是先得到作用是先得到p指向的变量的值指向的变量的值(即即*p),然后再使然后再使p+1=p。第9章9.19.29.39.49.59.69.79.8佳木斯大学56在使用指针变量时,有几个问题要注意:(3)注意指针变量的运算。如果先使如果先使p指向数组指向数组a(即即p=a),则:,则: *(p+)与与*(+p)作用不同。前者是先作用不同。前者是先取取*p值,后使值,后使p加加1。后者是先使。后者是先使p加加1,再取再取*p。若。若p初值为初值为a(即即a0),输出,输出*(p+

    36、)时,得时,得a0的值,而输出的值,而输出*(+p),则得到则得到a1的值。的值。第9章9.19.29.39.49.59.69.79.8佳木斯大学57在使用指针变量时,有几个问题要注意:(3)注意指针变量的运算。如果先使如果先使p指向数组指向数组a(即即p=a),则:,则:(*p)+表示表示p所指向的元素值加所指向的元素值加1,即,即(a0)+,如果,如果a0=3,则执行,则执行(a0)+后,后,a0的值为的值为4。注意:是元素值加。注意:是元素值加1,而不是指针值加而不是指针值加1。第9章9.19.29.39.49.59.69.79.8佳木斯大学58在使用指针变量时,有几个问题要注意:(3)

    37、注意指针变量的运算。如果先使如果先使p指向数组指向数组a(即即p=a),则:,则:如果如果p当前指向当前指向a数组中第数组中第i个元素,则:个元素,则:*(p-)相当于相当于ai-,先对,先对p进行进行“*”运算,再使运算,再使p自减。自减。*(+p)相当于相当于a+i,先使,先使p自加,再作自加,再作*运算。运算。*(-p)相当于相当于a-i,先使,先使p自减,再作自减,再作*运算。运算。第9章9.19.29.39.49.59.69.79.8佳木斯大学599-4-3 用数组名作函数参数用数组名作函数参数 实参类型变量名数组名要求形参的类型变量名数组名或指针变量传递的信息变量的值数组的起始地址

    38、通过函数调用能否改变实参的值不能能第9章9.19.29.39.49.59.69.79.8佳木斯大学60数组作为参数传递的实质是传递数组数组作为参数传递的实质是传递数组的首地址,实参数组和形参数组共享的首地址,实参数组和形参数组共享一段内存空间一段内存空间形参形参实参实参1数组名数组名数组名数组名2数组名数组名指针变量指针变量3指针变量指针变量数组名数组名4指针变量指针变量指针变量指针变量第9章9.19.29.39.49.59.69.79.8佳木斯大学61【例【例9-8】将数组】将数组a中中n个整数按相反顺序存放个整数按相反顺序存放void inv(int x ,int n) /*形参x是数组名

    39、*/ int temp,i,j,m=(n-1)/2; for(i=0;i=m;i+) j=n-1-i; temp=xi;xi=xj;xj=temp; main( ) int i,a10=3,7,9,11,0,6,7,5,4,2; printf(The original array:n); for(i=0;i10;i+) printf(%d,ai); printf(n); inv(a,10); printf(The array has been inverted:n); for(i=0;i10;i+) printf(%d,ai); printf(n); 运行情况如下:运行情况如下:The ori

    40、ginal array:3,7,9,11,0,6,7,5,4,2,The array has been inverted:2,4,5,7,6,0,11,9,7,3, 第9章9.19.29.39.49.59.69.79.8佳木斯大学62void inv(int *x,int n) /*形参x为指针变量*/int *p,temp,*i,*j,m=(n-1)/2; i=x;j=x+n-1;p=x+m; for(;i=p;i+,j-) temp=*i;*i=*j;*j=temp; return; main() int i,a10=3,7,9,11,0,6,7,5,4,2; printf(The ori

    41、ginal array:n); for(i=0;i10;i+) printf(%d,ai); printf(n); inv(a,10); printf(The array has been inverted:n); for(i=0;i10;i+) printf(%d,ai); printf(n);运行情况如下:运行情况如下:The original array:3,7,9,11,0,6,7,5,4,2,The array has been inverted:2,4,5,7,6,0,11,9,7,3, 第9章9.19.29.39.49.59.69.79.8佳木斯大学63【例【例9-9】从】从10

    42、个数中找出其中最大值和最小值。个数中找出其中最大值和最小值。int max,min; /*全局变量*/void max_min (int array ,int n) int *p,*array_end; array_end=array+n; max=min=*array; for(p=array+1;pmax) max=*p; else if(*pmin) min=*p; return;main( ) int i,number10; printf(enter 10 integer numbers:n); for(i=0;i10;i+) scanf(%d,&numberi); max_min (

    43、number,10); printf(nmax=%d,min=%dn,max,min);运行结果如下:运行结果如下:enter 10 integer numbers:-2 14 6 28 0 -3 5 89 67 -34max=89,min=-34第9章9.19.29.39.49.59.69.79.8佳木斯大学64 int max,min; void max_min(int *array,int n) int *p,*array_end; array_end=array+n; max=min=*array; for(p=array+1;pmax) max=*p; else if(*pmin)m

    44、in=*p; main( ) int i,number10,*p; p=number; /*使p指向number数组*/ printf(enter 10 integer numbers:n); for(i=0;i10;i+,p+) scanf(%d,p); printf(the 10 integer numbers:n); for(p=number,i=0;i10;i+,p+) printf(%d,*p); p=number; max_min(p,10); /*实参用指针变量*/ printf(nmax=%d,min=%dn,max,min); 运行结果如下:运行结果如下:enter 10 i

    45、nteger numbers:-2 14 6 28 0 -3 5 89 67 -34the 10 integer numbers:-2 14 6 28 0 -3 5 89 67 -34max=89,min=-34第9章9.19.29.39.49.59.69.79.8佳木斯大学65 【例【例9-10】有程序如下:】有程序如下:float average(float *array,int n) int i; float aver,sum=0; for(i=0;in;i+) sum=sum+arrayi; aver=sum/n; return(aver);main() float score_15=

    46、98.5,97,91.5,60,55; float score_210=67.5,89.5,99,69.5,77,89.5,76.5,54,60,99.5; printf (Aaverage:%6.2fn,average(score_1,5); printf(Baverage:%6.2fn,average(score_2,10); 运行结果如下:运行结果如下:Aaverage:80.40Baverage:78.20第9章9.19.29.39.49.59.69.79.8佳木斯大学66【例【例9-11】 已知一维数组中存放互不相同的已知一维数组中存放互不相同的10个整数,从键盘输入一个整数,从键盘

    47、输入一个数,并从数组中删除与该值相同的元素中的值。个数,并从数组中删除与该值相同的元素中的值。main( )int i,t,a10=2,4,1,6,5,9,7,0,8,3; for(i=0;i10;i+) printf(%4d,ai); printf(nInput t:n); scanf(%d,&t); del(a,t); for(i=0;i9;i+) printf(%4d,ai); printf(n); del(int a10,int t)int i,j; for(i=0;i10;i+)if(t=ai) break; for(j=i;j9;j+)aj=aj+1;运行结果:运行结果:2 4 1

    48、 6 5 9 7 0 8 3Input t:62 4 1 5 9 7 0 8 3第9章9.19.29.39.49.59.69.79.8佳木斯大学67【例【例9-12】 假定假定a数组中已存放由小到大顺序排好序的数组中已存放由小到大顺序排好序的10个数,在个数,在a数组中插入一个数,数组中插入一个数,插入后数组中的数仍有序。插入后数组中的数仍有序。 main() int i,x,a11=1,3,5,7,9,11,13,15,17,19; for(i=0;i10;i+) printf(%4d,ai); printf(n); printf(Input x:n); scanf(%d,&x); inse

    49、rt(a,x); for(i=0;i11;i+) printf(%4d,ai); printf(n); insert(int *a,int x) int i,j; i=0; while(i10&ai=i;j-) aj+1=aj; ai=x; 运行结果:运行结果:1 3 5 7 9 11 13 15 17 19Input x:81 3 5 7 8 9 11 13 15 17 19第9章9.19.29.39.49.59.69.79.8佳木斯大学68【例【例9-13】用选择法对】用选择法对10个整数按由小到大顺序排序。个整数按由小到大顺序排序。main() int i,a10; for(i=0;i1

    50、0;i+) scanf(%d,&ai); sort(a,10); for(i=0;i10;i+) printf(%4d,ai); printf(n);sort(int p ,int n) int i,j,k,temp; for(i=0;in-1;i+) k=i; for(j=k+1;jn;j+) if(pjpk) k=j; temp=pi;pi=pk;pk=temp; 运行结果:运行结果:1 3 5 15 17 7 9 11 13 191 3 5 7 9 11 13 15 17 19第9章9.19.29.39.49.59.69.79.8佳木斯大学699-4-4 指向多维数组的指针和指针变量指向

    展开阅读全文
    提示  163文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    关于本文
    本文标题:C语言程序设计实用教程-教学课件-第9章-指针.ppt
    链接地址:https://www.163wenku.com/p-2448894.html

    Copyright@ 2017-2037 Www.163WenKu.Com  网站版权所有  |  资源地图   
    IPC备案号:蜀ICP备2021032737号  | 川公网安备 51099002000191号


    侵权投诉QQ:3464097650  资料上传QQ:3464097650
       


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

    163文库