C语言程序设计 教学课件 ppt 作者 郑山红 李万龙 宋立明 侯秀萍 第6章 指针

上传人:E**** 文档编号:89370394 上传时间:2019-05-24 格式:PPT 页数:91 大小:1.49MB
返回 下载 相关 举报
C语言程序设计 教学课件 ppt 作者  郑山红 李万龙 宋立明 侯秀萍 第6章  指针_第1页
第1页 / 共91页
C语言程序设计 教学课件 ppt 作者  郑山红 李万龙 宋立明 侯秀萍 第6章  指针_第2页
第2页 / 共91页
C语言程序设计 教学课件 ppt 作者  郑山红 李万龙 宋立明 侯秀萍 第6章  指针_第3页
第3页 / 共91页
C语言程序设计 教学课件 ppt 作者  郑山红 李万龙 宋立明 侯秀萍 第6章  指针_第4页
第4页 / 共91页
C语言程序设计 教学课件 ppt 作者  郑山红 李万龙 宋立明 侯秀萍 第6章  指针_第5页
第5页 / 共91页
点击查看更多>>
资源描述

《C语言程序设计 教学课件 ppt 作者 郑山红 李万龙 宋立明 侯秀萍 第6章 指针》由会员分享,可在线阅读,更多相关《C语言程序设计 教学课件 ppt 作者 郑山红 李万龙 宋立明 侯秀萍 第6章 指针(91页珍藏版)》请在金锄头文库上搜索。

1、,第6章 指针,第6章 指 针,本章目标 了解地址和指针的概念,指针在函数中 的应用 熟悉指针的定义和引用方法 掌握指针与数组、指针与字符串综合的程 序设计方法 掌握使用指针灵活处理问题,6.1 指针变量,地址和指针的概念 为了说清楚什么是指针,必须弄清楚数据在内存中是如何存储的,又是如何读取的。如果在程序中定义了一个变量,在编译时就给这个变量分配内存单元。系统根据程序中定义的变量类型,分配一定长度的空间。例如,一般微机使用的C系统为整型变量分配2个字节,对实型变量分配4个字节,对字符型变量分配1个字节。内存区的每一个字节有一个编号,这就是“地址” 。在地址所标志的内存单元中可以存放数据。如图

2、6.1所示。,6.1 指针变量,图6.1,6.1 指针变量,“直接访问”方式:按变量地址存取变量值的方式。 “间接访问”方式:将变量i的地址存放在另一个变量中,然后通过该变量访问变量i。 下图是直接访问和间接访问的示意图。,6.1 指针变量,6.1 指针变量,由以上知识可知,一个变量的地址称为该变量的“指针”。例如,地址2000是变量i的指针。如果有一个变量专门用来存放另一变量的地址(即指针),则它称为“指针变量”。上述的i_pointer就是一个指针变量。指针变量的值(即指针变量中存放的值)是指针(地址)。请区分“指针”和“指针变量”这两个概念。例如,可以说变量i的指针是2000,而不能说i

3、的指针变量是2000。,6.1 指针变量,如前所述,变量的指针就是变量的地址。存放变量地址的变量是指针变量。为了表示指针变量和它所指向的变量之间的联系,在程序中用“*”符号表示“指向”,例如,i_pointer代表指针变量,而*i_pointer是i_pointer所指向的变量,见下图,6.1 指针变量,指针变量的定义 定义指针变量的一般形式为: 基类型 *指针变量名 如:int i,j; /普通变量 int *pointer_1,*pointer_2;,6.1 指针变量,那么,怎样使一个指针变量指向另一个变量呢?下面用赋值语句使一个指针变量指向一个整型变量: pointer_1= 将变量i的

4、地址存放到指针变量pointer_1中,因此pointer_1就“指向”了变量i。同样,将变量j的地址存放到指针变量pointer_2中,因此pointer_2就“指向”了变量j。,6.1 指针变量,在定义指针变量时要注意两点: (1) 指针变量前面的“*”,表示该变量的类型为指针型变量。注意:指针变量名是pointer_1、pointer_2,而不是*pointer_1、*pointer_2。这是与以前所介绍的定义变量的形式不同的。 (2) 在定义指针变量时必须指定基类型。,6.1 指针变量,指针变量的引用 请牢记,指针变量中只能存放地址(指针),不要将一个整型量(或任何其他非地址类型的数据

5、)赋给一个指针变量。下面的赋值是不合法的: pointer_1=100; (pointer_1为指针变量,100为整数) 有两个有关的运算符: (1) &: 取地址运算符。 (2) *: 指针运算符(或称“间接访 问”运算符)。,6.1 指针变量,例6.1通过指针变量访问整型变量。 main() int a,b; int *pointer-1, *pointer-2; a=100; b=10; pointer-1= ,6.1 指针变量,下面对“”语句,则: (1)&*pointer-1的含义等价于&a,即变量a的地址。 (2) *&a的含义等价于变量a (3) (*pointer_1)+相当于

6、a+,注意括号是必要的。,6.1 指针变量,例6.2对输入的两个整数按大小顺序输出。 void main() int*p1,*p2,*p,a,b; scanf(“%d,%d“, ,6.1 指针变量,请注意,a和b并未交换,它们仍保持原值,但p1和p2的值改变了。p1的值原为&a,后来变成&b,p2原值为&b,后来变成&a。这样在输出*p1和*p2时,实际上是输出变量b和a的值,所以先输出9,然后输出5。,图6.4,6.1 指针变量,指针变量作为函数参数 函数的参数不仅可以是整型、实型、字符型等数据,还可以是指针类型。它的作用是将一个变量的地址传送到另一个函数中。 例6.3对输入的两个整数按大小

7、顺序输出。,6.1 指针变量,Swap(int *p1,int *p2) int temp; temp=*p1; *p1=*p2; *p2=temp; void main() int a,b; int *pointer_1,*pointer_2; scanf(“%d,%d“,,6.1 指针变量,pointer-1= ,6.1 指针变量,6.1 指针变量,注意:以下做法是错误的,(1) Swap(int *p1,int *p2) inttemp; *temp=*p1; p1=*p2; p2=*temp; /此函数不能执行,(2) Swap(int x,int y) int temp; temp=

8、x; x=y; y=temp; /此函数并不能交换值,6.1 指针变量,(3) void Swap(int *p1,int *p2) int *p; p=p1; p1=p2; p2=p; /此函数也不能交换值,6.1 指针变量,例6.4输入a、b、c 3个整数,按大小顺序输出。 void Swap(int *pt1,int *pt2) int temp; temp=*pt1; pt1=*pt2; pt2=temp; void exchange(int *q1,int *q2,int *q3) if(*q1*q2) Swap(q1,q2); if(*q1*q3) Swap(q1,q3); if(

9、*q2*q3) Swap(q2,q3); ,6.1 指针变量,void main() int a,b,c,*p1,*p2,*p3; scanf(“%d,%d,%d“, ,6.2 指针与数组,1、指针与一维数组 数组的指针是指数组的起始地址,数组元素的指针是数组元素的地址。 引用数组元素可以用下标法(如a3),也可以用指针法,即通过指向数组元素的指针找到所需的元素。使用指针法能使目标程序质量高(占内存少,运行速度快)。,6.2 指针与数组,指向数组元素的指针 定义一个指向数组元素的指针变量的方法,与以前介绍的指向变量的指针变量相同。 例如: int a10; /*定义a为包含10个整型数据的数组

10、*/ int *p; /*定义p为指向整型变量的指针变量*/,6.2 指针与数组,p=,6.2 指针与数组,注意: (1)如果数组为int型,则指针变量亦应指向int型。 (2)数组名a不代表整个数组,上述“p=a;”的作用是“把a数组的首地址赋给指针变量p”,而不是“把数组a各元素的值赋给p”。,6.2 指针与数组,在定义指针变量时可以赋给初值: int *p= 它的作用是将a的首地址(即a0的地址)赋给指针变量p(而不是赋给*p)。,6.2 指针与数组,通过指针引用数组元素 如果指针变量p已指向数组中的一个元素,则p+1指向同一数组中的下一个元素(而不是将p值简单地加1)。 如果p的初值为

11、&a0,则: (1) p+i和a+i就是ai的地址。 (2) *(p+i)或*(a+i)是p+i或a+i所指向的 数组元素,即ai。 (3) 指向数组的指针变量也可以带下标, 如pi与*(p+i)等价。,6.2 指针与数组,根据以上叙述,引用一个数组元素,可 用: (1) 下标法,如ai形式; (2) 指针法,如*(a+i)或(p+i)。其中a是 数组名,p是指向数组的指针变量,其 初值p=a。,6.2 指针与数组,例6.5输出数组中的全部元素。假设有一个a数 组,整型,有10个元素。要输出各元素的值有三 种方法: (1) 下标法。 void main() int a10; int i; fo

12、r(i=0;i10;i+) scanf(“%d“, ,6.2 指针与数组,(2) 通过数组名计算数组元素地址,找出元素的值。 void main() int a10; int i; for(i=0;i10;i+) scanf(“%d“, ,6.2 指针与数组,(3) 用指针变量指向数组元素。 void main() int a10; int*p,i; for(i=0;i10;i+) scanf(“%d“, ,6.2 指针与数组,在使用指针变量时,有几个问题要注意: 指针变量可以实现使本身的值改变。 例如,上述第(3)种方法是用指针变量p来指向元素,用p+使p的值不断改变,这是合法的。如果不用p

13、而使a变化(例如,用a+)行不行呢?假如将上述(3)程序的最后两行改为: for(p=a;a(p+10);a+) printf(“%d“,*a); 是不行的。因为a是数组名,它是数组首地址,它的值在程序运行期间是固定不变的,是常量。,6.2 指针与数组,(2) 要注意指针变量的当前值。 例如: void main() int *p,i,a10; p=a; for(i=0;i10;i+) scanf(“%d“,p+); printf(“n“); for(i=0;i10;i+,p+) printf(“%d”,*p); /结果有误,注意当前值 ,6.2 指针与数组,(3)在使用指针变量指向数组元素时

14、,应切实保证指向数组中有效的元素。 从上例可以看到,虽然定义数组时指定它包含10个元素,可以用p指向当前的数组元素。但是实际上指针变量p可以指向数组以后的内存单元。如果引用数组元素a10,C编译程序并不认为非法,系统把它按*(a+10)处理,即先找出(a+10)的值(是一个地址),然后找出它指向的单元的内容。这样做虽然是合法的(在编译时不出错),但应避免出现这样的情况,这会使程序得不到预期的结果。这种错误比较隐蔽,初学者往往难以发现。,6.2 指针与数组,(4) 注意指针变量的运算。 如果先使p指向数组a(即p=a),则: p+(或p+=1),使p指向下一元素,即 a1。 *p+,由于+和*同

15、优先级,结合方向为 自右而左,因此它等价于*(p+)。作用是 先得到p指向的变量的值(即*p),然后再 使p+1=p。 *(p+)与*(+p)作用不同。前者是先取*p 值,后使p加1。后者是先使p加1,再取 *p。若p初值为a(即&a0),输出*(p+) 时,得a0的值,而输出*(+p),则得到 a1的值。,6.2 指针与数组, (*p)+表示p所指向的元素值加1,即 (a0)+,如果a0=3,则(a0)+ 的值为4。注意:是元素值加1,而不 是指针值加1。 如果p当前指向a数组中第i个元素, 则:*(p-)相当于先对p进行“*”运 算,即ai的值,再使p自减。,6.2 指针与数组,2、指针与二维数组 用指针变量可以指向一维数组,也可以指向二维数组。但在概念上和使用上,二维数组的指针比一维数组的指针要复杂一些。 为了说清楚多维数组的指针,先回顾一下多维数组的性质。今以二维数组为例,设有一个二维数组a,它有3行4列。 它的定义为 int a34=1,3,5,7,9,11,13,15 ,17,19,21,23 ;,6.2 指针与数组,a是一个数组名。a数组包含3行,即3个元素: a0,a1,a2。而每一元素又是一个一维数组,它包含4个元素(即4个列元素)。 从二维数组的角度来看,a代表整个二维数组的首地址,也就是第0行的首地址。a+1代表第1行的首地址。如果二维数组的首

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

最新文档


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

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