C语言程序设计能力教程(第二版) 教学课件 ppt 作者 赵凤芝 第8章-应用指针设计程序

上传人:E**** 文档编号:89386241 上传时间:2019-05-24 格式:PPT 页数:57 大小:539.50KB
返回 下载 相关 举报
C语言程序设计能力教程(第二版) 教学课件 ppt 作者 赵凤芝 第8章-应用指针设计程序_第1页
第1页 / 共57页
C语言程序设计能力教程(第二版) 教学课件 ppt 作者 赵凤芝 第8章-应用指针设计程序_第2页
第2页 / 共57页
C语言程序设计能力教程(第二版) 教学课件 ppt 作者 赵凤芝 第8章-应用指针设计程序_第3页
第3页 / 共57页
C语言程序设计能力教程(第二版) 教学课件 ppt 作者 赵凤芝 第8章-应用指针设计程序_第4页
第4页 / 共57页
C语言程序设计能力教程(第二版) 教学课件 ppt 作者 赵凤芝 第8章-应用指针设计程序_第5页
第5页 / 共57页
点击查看更多>>
资源描述

《C语言程序设计能力教程(第二版) 教学课件 ppt 作者 赵凤芝 第8章-应用指针设计程序》由会员分享,可在线阅读,更多相关《C语言程序设计能力教程(第二版) 教学课件 ppt 作者 赵凤芝 第8章-应用指针设计程序(57页珍藏版)》请在金锄头文库上搜索。

1、第八章 应用指针编制程序 8.1 指针概述 8.2 指针变量 8.3 指针与数组 8.4 指针与函数 8.5 指针数组 8.6 指向指针的指针, 8.1 指针概述,储备知识1指针的特点,1、可有效地表示数据结构; 2、能够动态地分配内存; 3、能方便地使用字符串和数组; 4、在调用函数时能够得到多于1个值; 5、能直接处理内存地址等。,储备知识2数据的存取过程,变量是以字节为单位存放在内存上的,每一个字节成为一个单元。,例如: int a; float b; char c;,经过编译,将变量名转换为变量的地址,对变量值的存取是通过地址进行的。,每个字节的编号,2000 2001,3000 30

2、01 3002 3003,4000,储备知识2数据的存取过程,例如: int a,b,c; scanf(“%d,%d”,2000,2002,2004,地址,直接访问,变量名,2,5,7,C 提供了另一种方式,将变量 k的地址存放在另一个变量处(假定为pk),通过访问 pk,就可以间接地访问变量k,这种方式称为间接访问。,变量 int k; 变量 pk 中存放 k 在内存中的地址。,变量pk 就是一个指针变量,指向变量k,存放k的地址 因此:指针就是地址。,谁的地址? 有何特点? *,3、间接访问:多次直接访问方式;,一、基本概念,1、地址:内存单元的字节编号。 2、直接访问:按变量地址存取变量

3、值的方式;,a_pointer=,6、指针变量的值:指针变量中存放的值;,4、指针:一个变量的地址称为该变量的指针;,5、指针变量:专门存放另一个变量地址的变量;,二、对指针的深入理解 指针可以指向所有类型的数据,a_pi=,1、指针指向变量:变量的指针(存放变量的地址)。,2、指针指向函数:函数型指针(存放函数的入口地址)。,4、指针指向指针:指针型指针(存放某指针的地址)。,b_pi=b;或b_pi=,3、指针指向数组:数组的指针(存数组的起始地址)。,指针是定位其他数据类型的特殊类型的数据(存放其他数据的地址)。, 8.2 变量的指针,一、指针变量的定义,指针变量定义的一般格式: 数据类

4、型 *指针变量名;,功能: 定义指向给定“数据类型”的变量或数组的指针变量,允许一次定义多个指针变量。,如:int *ptr1; float *ptr2; char *ptr3;,二、 指针变量的初始化,1、指针变量使用前必须有值,2、指针变量的初值必须是地址值(不能是整数),3、方法有两种:,(1) pk =(此句不是赋值语句),地址:数组名 &变量名,4、可以为指针赋空值(NULL),此时指针不指向任何变量 pk=NULL;,变量必须与说明过的类型应一致,练习1 int i; int *p=,练习3 int i=1; int *p=,练习2 int *p=,int i,*p,*q; i=1

5、; p=,三、指针变量的引用,&:表示提取一个变量的存储区域的地址; *:表示访问指针指向的存储区域中的数据;,C语言提供两个指针运算 &:取地址运算符; *:指针运算符(或称“间接访问”运算符);,例如: int a10; int *pointer_1; pointer_1=,将a的地址赋给指针变量pointer_1,通过间接访问符,访问变量a中的数据,例1: 运用指针变量间接访问变量的值。,#include main( ) int a=-35, b5=1,2,3,4,5; int *ptr1, *ptr2; ptr1= ,定义指针变量ptr1和ptr2,ptr1指向变量a,直接访问,间接访

6、问,ptr2指向数组b,例2:分析以下程序的执行结果。,main( ) int a,b,c; int *p ; a=100; b=200; p= ,*p=c; c=a+b;,例3: 改变指针变量指向的变量的值。,#include main( ) int a=3,b=5,t; int *ptr1= ,输出结果: a:value 5 b:value 3 ptr1:value 5 ptr2:value 3,#include main( ) int a=3,b=5; int *ptr1= ,输出结果: a:value 3 b:value 5 ptr1:value 5 ptr2:value 3,四、指针

7、变量的运算,1. C语言中两个关于指针的运算符: &运算符: 取地址运算符。 *运算符:指针运算符。,说明: 优先级:高于所有双目运算符的单目运算符; 结合性:均为自右向左; “取地址符 *(&k)*pkk &(*pk)&kpk。,2.与指针变量相关的其它运算,(1) 指针变量的比较运算,Turbo C仅允许对指针变量作三种运算: 关系运算、减法运算、与整数的加减运算。,在内存中,假设两个指针变量 p,q指向同一个数组,则允许对p、q进行比较运算。,如:p 指针所指元素位于q所指元素之后时, 则pq的值为1,否则值为0。 两指针p、q指向同一元素时, 则p=q的值为1。,(2) 指针变量的减法

8、运算,当两指针变量p,q指向同一数组时,pq的结果为p所指元素与q所指元素之间相隔的元素的个数(而不是地址值之差,也不是变量值之差)。,(3) 指针变量与整数的加减运算,一个指针指向一个数组时,指针与一个整数n相加或相减,表示将指针向后或向前移动了n个元素。,五、指针变量作函数的参数,例4 输入两个变量的值,按由大到小的顺序输出。,main( ) int a,b; scanf(“%d,%d”, ,输入:3,5,输出:3,5,输出:5,3,输出:3,5,swap(int *p1, int *p2) int pk; pk=*p1; *P1=*P2; *p2=pk; printf(“2: %d,%d

9、n”, *p1, *p2); main( ) int a , b; int *po1,*po2; scanf(“%d,%d”, ,交换,形参为指针,实参为指针,9,5,a,b,&a,&b,po1,po2,5,a,&a,&a,p1,po1,9,&b,&b,p2,po2,&a,&a,&b,&b,9,5,p2,po2,p1,po1,&a,&b,5,9,po1,po2,b,a,b,a,b,1、 功能函数 swap(a,b)的作用是实现两个数的交换,当参数为指针 型时,实参,形参都为指针变量。 2、 当函数被调用时,实参值传给形参(值传递)结果为:形参指针p1,实参 指针po1指向同一个变量a。 3、

10、当函数调用结束时,交换的是指针所指的变量的 值。pk=*p1;*p1=*p2;*p2=pk;此时,pk是一个int 变量,不是指针。,main( ) int a,b; scanf(“%d,%d”, 主调函数中不定义指针,直接用变量的地址作为实参,作用相同,函数swap接受的都是地址值。,题目中的主函数可改为:,题目 分析,指针的值为地址,一、 用指针引用数组元素,定义指针,定义数组,int a10,*pa;,指针初始化,pa=,将数组中第一个元素的地址赋给指针变量: 等价于: pa=a;,pa=a;,间接访问:*pa=a0;,可以移动指针使其指向数组中后面的元素。,向后移动i个元素 pa+i

11、指针指向元素ai。,8. 3 指针与数组,pa+i=&ai (将a i 的地址赋给指针pa),pa+i=a+i=a+i*m (每个元素占字节),m,*(pa+i)=*(a+i)=a i (间接访问),当i的值在下标范围内变化,就可访问数组中所有元素。,pa+i,下标法: 循环语句,逐一访问 a i 指针法: 移动指针访问 *(pa+i)=ai=*(a+i),访问数组元素,地址值,main( ) static int a = 1,2,3,4,5,6; int i; for(i=0;i6;i+) printf(“%d”,ai ); ,main( ) static int a =1,2,3,4,5,

12、6; int i; for(i=0;i6;i+) printf(“%d”,*(a+i); ,main( ) static int a=1,2,3,4,5,6; int i; int *pa=a; for( i=0;i6;i+) printf(“%d”,*(pa+i); ,ai *(a+i) *(pa+i),下标法,地址法,指针法,程序如下: #include main( ) int n,a10; int *ptr=a; for(n=0;n=9;n+) scanf(“%d“,ptr+n); printf(“output!n“); for(n=0;n=9;n+) printf(“%4d“,*(pt

13、r+n); printf(“n“); ,例5 采用指针法输入输出数组各元素。,#include main( ) int n,a10; int *ptr=a; for(n=0;n=9;n+) scanf(“%d“,ptr+); printf(“output!n“); for(n=0;n=9;n+) printf(“%4d“,*ptr+); printf(“n“); ,ptr=a;,运行上述程序均可获得如下结果: 1 2 3 4 5 6 7 8 9 0 output! 1 2 3 4 5 6 7 8 9 0,程序(1)、(2)的运行结果一致,但运行结束后指针变量的指向却不相同,为什么?,运行程序,

14、练习1: int a =1,2,3,4,5,6,7,8,9,10; int *p=a,i; 数组元素地址的正确表示( ) A、&(a+1) B、a+ C、&p D、&pi,数组名是地址常量 p+,p- () a+,a- () a+1, *(a+2) (),练习2:下列程序运行的结果是() main( ) int a =5,8,7,6,2,7,3; int y,*p= ,输出:5 6,练习3:仔细阅读下面程序,分析指针的当前值。 main( ) int i,*p,a7; p=a; for(i=0;i7;i+) scanf(“%d“,p+); printf(“n“); for(i=0;i7;i+,

15、p+) printf(“%d“,*p); ,p=a;,指针变量可以指到数组后的内存单元,main( ) int i,*p,t,a5; for(p=a;pa+5;p+) scanf(“%d“,p); printf(“n“); p= ,练习4:找出5个整数中的最大数,并指明位置。,main() int n,i,j,k,x,a10; int *p=a; for(i=0; i10;i+) scanf(“%d“,p+i); for(k=1;k10;k+) for(j=9,i=0;i10-k;i+,j-) if(*(p+j)*(p+j-1) x=*(p+j); *(p+j)=*(p+j-1); *(p+j-1)=x; for(i=0;i10;i+) printf(“%5d“,*(p+i); printf(“n“); ,例6 用一维数组的指针解决冒泡法排序问题。,二、指针与二维数组,1、二维数组的地址,对于一维数组: (1)数组名array表示数组 的首地址,即array0 的地址; (2)数组名array是地址 常量; (3)array+i是元素 arrayi的地址; (4)arrayi*(array+i),对于二维数组: 1

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

当前位置:首页 > 高等教育 > 大学课件

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