C语言程序设计 第2版 工业和信息化普通高等教育“十二五”规划教材立项项目 教学课件 ppt 作者 姚琳 C语言程序设计_第6章_指针

上传人:E**** 文档编号:89372285 上传时间:2019-05-24 格式:PPT 页数:87 大小:2.79MB
返回 下载 相关 举报
C语言程序设计 第2版  工业和信息化普通高等教育“十二五”规划教材立项项目  教学课件 ppt 作者  姚琳 C语言程序设计_第6章_指针_第1页
第1页 / 共87页
C语言程序设计 第2版  工业和信息化普通高等教育“十二五”规划教材立项项目  教学课件 ppt 作者  姚琳 C语言程序设计_第6章_指针_第2页
第2页 / 共87页
C语言程序设计 第2版  工业和信息化普通高等教育“十二五”规划教材立项项目  教学课件 ppt 作者  姚琳 C语言程序设计_第6章_指针_第3页
第3页 / 共87页
C语言程序设计 第2版  工业和信息化普通高等教育“十二五”规划教材立项项目  教学课件 ppt 作者  姚琳 C语言程序设计_第6章_指针_第4页
第4页 / 共87页
C语言程序设计 第2版  工业和信息化普通高等教育“十二五”规划教材立项项目  教学课件 ppt 作者  姚琳 C语言程序设计_第6章_指针_第5页
第5页 / 共87页
点击查看更多>>
资源描述

《C语言程序设计 第2版 工业和信息化普通高等教育“十二五”规划教材立项项目 教学课件 ppt 作者 姚琳 C语言程序设计_第6章_指针》由会员分享,可在线阅读,更多相关《C语言程序设计 第2版 工业和信息化普通高等教育“十二五”规划教材立项项目 教学课件 ppt 作者 姚琳 C语言程序设计_第6章_指针(87页珍藏版)》请在金锄头文库上搜索。

1、第6章 指 针,C 语言程序设计,北京科技大学 计算机系,2019/5/24,6.1 概述 6.2 指针和指针变量 6.3 指针与数组 6.4 指针和函数 6.5 动态存储分配,第6章 指针,2019/5/24,6.1概述,为什么要引入指针的概念? 指针可以有效地表示复杂数据结构,如队列、栈、链表等。 指针能象汇编语言一样处理内存地址,为动态内存分配提供支持。 指针可实现对数组和字符串的方便使用,提高某些子程序的效率。,6.1概述,关于指针的原则 学习原则 一定要学会 其实通常的应用很简单 使用原则 永远要清楚每个指针指向了哪里 永远要清楚指针的指向位置是什么,2019/5/24,2019/5

2、/24,main() int a=5; int b; float x=3.5; ,变量的两个物理意义,变量的内容,变量的地址,6.2 指针和指针变量,5,35.0,变量的内容,变量的内容,变量的地址,变量的地址,6.2.1 基本概念,变量的地址和变量的内容,变量的地址 变量所分配存储空间的首地址 变量的内容 变量在所分配的存储空间中存放的数据,2019/5/24,2019/5/24,main() int a,b; float x=35; a=5; b=a+3; ,1001 1002 1003 1004 1015 1016 1017 1018,a b,利用变量名存取数据的方式称为“直接存取”方式

3、。,直接存取和间接存取,8,2019/5/24,C 语言还提供了对内存单元的“间接存取”方式,5,1001,3,main( ) int a=5,b=3,*p; p = ,变量的地址称为变量的指针 存放地址的变量称为指针变量 p指向c,c为p所指向的目标变量。,直接存取和间接存取,8,指针的类型和指针所指向的类型,int a=5,b; float x; int *pi; float *pf; pi指针的类型:int * pf指针的类型:float * pi所指向的类型:int pf所指向的类型:float,2019/5/24,2019/5/24,void main() float x, *p1=

4、NULL; float *p2= ,2000,6.2 指针和指针变量,6.2.2 指针变量的定义,NULL,指针变量初始化,数据类型 * 指针变量名,2012,2020,6.2 指针和指针变量,说明: 当把一个变量的地址作为初值赋给指针时,该变量必须先给以定义,且该变量的数据类型必须与指针的数据类型一致 也可把一个已初始化的指针值作为初值赋予另一指针 也可通过初始化定义某种类型的空指针,2019/5/24,6.2.2 指针变量的定义,2019/5/24,6.2 指针和指针变量,取地址运算,间接存取运算* *指针变量或目标变量的地址 int i, *p; p = ,6.2.3 指针的基本运算,p

5、a指针变量 *pa指针pa的目标变量 &pa指针变量pa占用存 储区域地址,2019/5/24,2004,6.2 指针和指针变量,6.2.3 指针的基本运算,2000,*p = ,5,6.2 指针和指针变量,赋值运算 把一个变量的地址赋给一个同类型的指针,如: int a, *pa; pa=&a; /* 使pa指向变量a */ 把一个指针的值赋给另一同类型的指针,如: char c, *s1=&c, *s2; s2=s1; /* 结果s1和s2指向同一变量c */,2019/5/24,6.2.3 指针的基本运算,6.2 指针和指针变量,赋值运算 将地址常量如数组名赋给同类型的指针,如: cha

6、r *str,ch80; str=ch; /* 使str得到字符数组ch的首地址,即str指向数组ch */ 同类型指针算术运算的结果,如果还是地址量的话,可以赋值给同类型的指针。例如: int *p1,*p2,a20; p1=a; p2=p1+5; p1=p2-3;,2019/5/24,6.2.3 指针的基本运算,2019/5/24,c=,p=b;,p=,b=2000;,判断正确?,指针变量只 存放地址!,一个指针变量不能指向与其类型不同的变量!,应在类型相同的指针变量之间赋值,这是正确的!,设: int *c, a=20, *b=&a; float *p;,c=*b;,不能给指针赋非地址值

7、!,2019/5/24,方法1:目标变量值不变,改变指针变量的 指向求解。 void main( ) int a,b,*p1,*p2,*p; p1= ,【例6.1】输入a、b两个整数, 使用指针变量按大小顺序输出 这两个整数。,6 8 a=6,b=8 max=8,min=6,6.2.3 指针的基本运算(续),2019/5/24,方法2:利用指针变量直接改变目标变量的值。 void main( ) int a,b,t,*p1,*p2; p1= ,6 8 a=8,b=6 max=8,min=6,6,6.2.3 指针的基本运算,2019/5/24,指针的算术运算,6.2.3 指针的基本运算,void

8、 main( ) int a=10,20,30,40,50,60,70,80,90,100; int i,*ptr,*p1,*p2; ptr=a; for (i=0;i10;i+) (*ptr)+; ptr+; p1=p2=a; p1+=5; p2+; printf(a=%un”,a); printf(“p1=%u,*p1=%dn,p1,*p1); printf(“p2=%u,*p2=%dn”,p2,*p2); printf(p1-p2=%dn”,p1-p2); printf(“*(p1+2)=%d,(*p1)+2=%dn”,*(p1+2),(*p1)+2); ,指针加减运算要点: 两个指针变

9、量不能做加法运算。 只有当指针变量指向数组时,并且只有当运算结果仍指向同一数组中的元素时,指针的加减运算才有意义。 指针加减运算的结果不以字节为单位,而是以数据类型的大小(即sizeof(类型))为单位。 只有当两个指针变量指向同一数组时,进行指针相减才有实际意义。 *(p1+n)与(*p1)+n是两个不同的概念。,ptr,31,21,11,41,51,61,71,81,91,101,2019/5/24,指针的关系运算, 指向同一数组的两个指针可以进行关系运算 指针与一个整型数据比较是没有意义的,不同类型指针变量之间的比较是非法的。 NULL可以与任何类型指针进行=、!=的运算,用于判断指针是

10、否为空指针。,6.2.3 指针的基本运算,6.2 指针与指针变量,2019/5/24,6.2.4 指针作为函数参数,【例6.3】从键盘任意输入两个整数,编程将其交换后再重新输出。,2019/5/24,void swap(int *p1,int *p2) int temp; printf(“调用中交换前: *p1=%d,*p2=%dn”,*p1,*p2); temp=*p1;*p1=*p2;*p2= temp; printf(“调用中交换后:*p1=%d,*p2=%dn”,*p1,*p2); ,void main() int x1, x2; scanf(“%d%d”, ,void swap(in

11、t x,int y) int temp; printf(“调用中交换前: x=%d,y=%dn”,x,y); temp = x;x = y;y = temp; printf(“调用中交换后:x=%d,y=%dn”,x,y); ,void main() int x1, x2; scanf(“%d%d”, ,方法 1,方法 2,编写函数实现两数的互换,Not Work!Why?,20 10 1: x1=20,x2=10 调用中交换前:x=20,y=10 调用中交换后:x=10,y=20 2: x1=20,x2=10,20 10 1: x1=20,x2=10 调用中交换前:*p1=20,*p2=10

12、 调用中交换后:*p1=10,*p2=20 2: x1=10,x2=20,2019/5/24,主调函数,被调函数,void main() int x1,x2; scanf(“%d%d”, ,void swap(int x, int y) int temp; printf(“调用中交换前: x=%d,y=%dn”,x,y); temp=x; x=y; y=temp; printf(“调用中交换后: x=%d,y=%dn“,x,y); ,20,20,x1,x2,实 参,形 参,10,10,方法 1,x,y,2019/5/24,主调函数,被调函数,main() int x1,x2; scanf(“%

13、d%d”, ,void swap(int *p1, int *p2) int temp; printf(“调用中交换前: *p1=%d,*p2=%dn“,*p1,*p2); temp=*p1; *p1=*p2; *p2=temp; printf(“调用中交换后: *p1=%d,*p2=%dn“,*p1,*p2); ,&x1,&x1,实 参,形 参,&x2,&x2,方法 2,p1,p2,20,x1,x2,10,2019/5/24,void swap(int *p1,int *p2) int *p; printf(“调用中交换前:*p1=%d,*p2=%dn“,*p1,*p2); p=p1; p1

14、=p2; p2=p; printf(“调用中交换后:*p1=%d,*p2=%dn“,*p1,*p2); ,void main() int x1,x2; scanf(“%d%d”, ,方法 3,编写函数实现两数的互换,10 1: x1=20,x2=10 调用中交换前:*p1=20,*p2=10 调用中交换后:*p1=10,*p2=20 2: x1=20,x2=10,Not Work too!Why?,2019/5/24,主调函数,被调函数,main() int x1,x2; scanf(“%d%d”, ,void swap(int *p1,int *p2) int *p; printf(“调用中

15、交换前: *p1=%d,*p2=%dn”,*p1,*p2); p=p1; p1=p2; p2=p; printf(“调用中交换后:*p1=%d,*p2=%dn“,*p1,*p2); ,&x1,&x1,实 参,形 参,&x2,&x2,方法3,p1,p2,20,x1,x2,10,&x1,p,2019/5/24,数组名是该数组的指针 a&a0,a+1&a1, ,a+4&a4 数组元素的下标表示法: a0,a1, ,ai, ,a4 数组元素的指针表示法: *(a+0),*(a+1), ,*(a+i), ,*(a+4),6.3 指针与数组,6.3.1 指针与一维数组,1. 建立指针与一维数组的联系,例如: int a5;,a0,a4,a,2019/5/24,用p表示数组元素 下标法: p0,p1, ,p9 指针法: *(p+0),*(p+1), ,*(p+9),2. 通过指针引用数组元素,例如:int a10,*p; p = a;(或 p = ),a,6.3.1 指针与一维数组,2019/5/24,【例6.4】用指针变量引用数组元素,完成给数组元素赋值并输出数组元素。 #include void main( )

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

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

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