c语言程序设计第三版谭浩强第十章指针演示教学

上传人:go****e 文档编号:137375637 上传时间:2020-07-07 格式:PPT 页数:110 大小:649.50KB
返回 下载 相关 举报
c语言程序设计第三版谭浩强第十章指针演示教学_第1页
第1页 / 共110页
c语言程序设计第三版谭浩强第十章指针演示教学_第2页
第2页 / 共110页
c语言程序设计第三版谭浩强第十章指针演示教学_第3页
第3页 / 共110页
c语言程序设计第三版谭浩强第十章指针演示教学_第4页
第4页 / 共110页
c语言程序设计第三版谭浩强第十章指针演示教学_第5页
第5页 / 共110页
点击查看更多>>
资源描述

《c语言程序设计第三版谭浩强第十章指针演示教学》由会员分享,可在线阅读,更多相关《c语言程序设计第三版谭浩强第十章指针演示教学(110页珍藏版)》请在金锄头文库上搜索。

1、第十章,指针,10.1地址和指针的概念,为了说清楚什么是指针,必须弄清楚数据在内存中是如何存储的,又是如何读取的。,内存区的每一个字节有一个编号,这就是“地址” 。如果在程序中定义了一个变量,在对程序进行编译时,系统就会给这个变量分配内存单元。,、按变量地址存取变量值的方式称为“直接访问”方式,另一种存取变量值的方式称为“间接访问”的方式。即,将变量的地址存放在另一个变量中。,在语言中,指针是一种特殊的变量,它是存放地址的。假设我们定义了一个指针变量i_pointer用来存放整型变量的地址,它被分配地址为(3010)、(3011)的两个字节。可以通过语句:i_pointer ; 将的地址(20

2、00)存放到i_pointer中。这时, i_pointer的值就是(2000) ,即变量所占用单元的起始地址。要存取变量的值,可以采用间接方式:先找到存放“的地址”的变量i_pointer ,从中取出的地址(2000),然后到2000 、 200字节取出的值()。,一个变量的地址称为该变量的“指针”。 例如,地址2000是变量的指针。如果有一个变量专门用来存放另一变量的地址(即指针),则它称为“指针变量”。上述的i_pointer就是一个指针变量。,指针和指针变量的定义:,指针变量的值(即指针变量中存放的值)是地址(即指针)。请区分“指针”和“指针变量”这两个概念。,10.2 变量的指针和指

3、向变量的指针变量,10.1 定义一个指针变量,定义指针变量的一般形式为 基类型 *指针变量名;,下面都是合法的定义: float *pointer_; / pointer_是指向float型变量的指针变量 char *pointer_; /pointer_是指向字符型变量的指针变量 可以用赋值语句使一个 指针变量得到另一个变 量的地址,从而使它指 向一个该变量。如: pointer_; pointer_;,在定义指针变量时要注意两点:,10. 指针变量的引用,请牢记,指针变量中只能存放地址(指针), 不要将一个整数(或任何其他非地址类型的数据) 赋给一个指针变量。,例10. 通过指针变量访问整

4、型变量,#include voidmain ( ) int ,; int*pointer_, *pointer_; ; pointer_; /*把变量的地址赋给 pointer_1 */,pointer_; /*把变量的地址赋给 pointer_ */ printf(%,%,); printf(%,%,*pointer_, *pointer_); ,对“”和“*”运算符说明: 如果已执行了语句 pointer_; (1)* pointer_的含义是什么?“”和“*”两个运算符的优先级别相同,但按自右而左方向结合,因此先进行* pointer_的运算,它就是变量,再执行运算。因此,* point

5、er_与相同,即变量a的地址。如果有pointer_2 * pointer_ ; 它的作用是将(的地址)赋给pointer_2 ,如果pointer_2原来指向,经过重新赋值后它已不再指向了,而指向了。,(2) *的含义是什么?先进行运算,得的地址,再进行*运算。即所指向的变量,也就是变量a。*和*pointer_的作用是一样的,它们都等价于变量。即*与等价。,(3) (*pointer_)相当于。注意括号是必要的,如果没有括号,就成为了*pointer_,从附录可知:+和*为同一优先级别,而结合方向为自右而左,因此它相当于*(pointer_)。由于+在pointer_1的右侧,是“后加”,

6、因此先对pointer_的原值进行*运算,得到的值,然后使pointer_的值改变,这样pointer_不再指向了。,例10 . 2 输入和两个整数,按先大后小的顺序输出 和。,#include void main() int *1,*2,*,; scanf(,); 1; if() ; printf(=,=,); printf(max=,min=,*1,*2); ,运行情况如下: , , , 当输入,时,由于,将和交换。交换前的情况见图(),交换后见图()。,10.3 指针变量作为函数参数,例10 . 3 对输入的两个整数按大小顺序输出,#include void main() void sw

7、ap(int *,int *); int ,; int *pointer_,*pointer_; scanf(,); pointer_ ; pointer_2 ; if(swap( pointer_ , pointer_2 ); printf(,); ,void swap(int *,int *) int temp; temp*1; *; *temp; ,例10. 输入、 3个整数,按大小顺序输出,#include void main() void exchange(int *1, int *2, int *3); int ,*,*,*; scanf(%,%,%, if(*) swap(,);

8、 if(*) swap(,); if(* swap(,); void swap(int *, int *) int temp; temp*; *; *temp; ,10.3 数组与指针,一个变量有地址,一个数组包含若干元素,每个数组元素都在内存中占用存储单元,它们都有相应的地址。指针变量既然可以指向变量,当然也可以指向数组元素(把某一元素的地址放到一个指针变量中)。所谓数组元素的指针就是数组元素的地址。,定义一个指向数组元素的指针变量的方法,与以前介绍的指向变量的指针变量相同。例如: ; (定义为包含个整型数据的数组) *; (定义为指向整型变量的指针变量) 应当注意,如果数组为型,则指针变量

9、的基类型亦应为型。,10.3.1 指向数组元素的指针,对该指针变量赋值: ; 把元素的地址赋给指针变量。也就是使指向数组的第号元素,如图:,10.通过指针引用数组元素,引用一个数组元素,可以用: () 下标法,如形式; () 指针法,如*()或*()。其中是数组名,是指向数组元素的指针变量,其初值。,例10.5 输出数组中的全部元素,假设有一个数组,整型,有个元素。要输出各元素的值有三种方法:,(1)下标法 #include void main() int ; int; for(;) scanf(,); printf(); for(;) printf(,); ,(2) 通过数组名计算数组元素地

10、址,找出元素的值。 #include voidmain() int ; int ; for(; ) scanf(,); printf(); for(;) printf(,*(); ,(3) 用指针变量指向数组元素。 #include void main() int ; int *,; for(;) scanf(,); printf(); for(;();) printf( ,*); ,例10. 通过指针变量输出数组的个元素。,有人编写出以下程序: #include void main() int*,; ; for(; ) scanf(,); printf(); for(;, ) printf(

11、,*); ,这个程序乍看起来好像没有什么问题。有的人即使已被告知此程序有问题,还是找不出它有什么问题。我们先看一下运行情况: 1 2 3 4 5 6 7 8 9 0 22153 234 0 0 30036 25202 11631 8259 8237 28483 显然输出的数值并不是数组中各元素的值,解决这个问题的办法,只要在第二个循环之前加一个赋值语句: ;,#include void main() int*,; ; for(;) scanf(,); printg(); p=a; for(;, ) printf(,*); ,10.3 用数组名作函数参数,在第8章8.7节中介绍过可以用数组名作函

12、数的参数 如: void main() i(int ,int ); int ; (,); void (int ,int ) ,f (int arr , int n) 但在编译时是将arr按指针变量处理的,相当于将函数f的首部写成 f (int *arr, int n) 以上两种写法是等价的。,需要说明的是:C语言调用函数时虚实结合的方法都是采用“值传递”方式,当用变量名作为函数参数时传递的是变量的值,当用数组名作为函数参数时,由于数组名代表的是数组首元素地址,因此传递的值是地址,所以要求形参为指针变量。,例10 将数组中个整数按相反顺序存放,#include void main() void

13、inv(int ,int ); int , ,; printf(The original array:); for(;) printf (,); printf(); inv (,); printf(The array has been in verted:); for(;) printf (,); printf (); ,void inv(int ,int ) /*形参x是数组名*/ int temp,(); for(;) ; temp; ; temp; return; ,运行情况如下: The original array: , The array has been inverted: ,,

14、#include void main() void inv(int *,int ); int , ,; printf( The original array: ); for(;) printf (,); printf (); inv(,); printf ( The array has been in verted: ); for(;) printf (,); printf ();,对这个程序可以作一些改动。将函数inv中的形参改成指针变量。,void inv(int *,int ) /*形参x为指针变量*/ int,temp,*,*,(); ; for(;,) emp*;*;*temp; r

15、eturn; ,归纳起来,如果有一个实参数组,想在函数中改变此数组中的元素的值,实参与形参的对应关系有以下种情况:,(1) 形参和实参都用数组名,如: void main() void (int ,int ) int ; (,); ,(2) 实参用数组名,形参用指针变量。如: void () void (int *,int ) int ; (,); ,(3)实参形参都用指针变量。例如: void main() void (int *,int ) int , *p=a; (p,); ,(4) 实参为指针变量,形参为数组名。如: void main() void (int x ,int ) ,*p=a; (p,); ,#include void main() void inv(int *,int ); int ,*; printf(The original array:n ); for(;,) scanf(,); printf(); ; inv(,); /* 实参为指针变量 */ printf(The array has been

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

当前位置:首页 > 幼儿/小学教育 > 其它小学文档

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