收藏 分享(赏)

评估课件_指针.ppt

上传人:dwy79026 文档编号:5424213 上传时间:2019-03-01 格式:PPT 页数:62 大小:1.12MB
下载 相关 举报
评估课件_指针.ppt_第1页
第1页 / 共62页
评估课件_指针.ppt_第2页
第2页 / 共62页
评估课件_指针.ppt_第3页
第3页 / 共62页
评估课件_指针.ppt_第4页
第4页 / 共62页
评估课件_指针.ppt_第5页
第5页 / 共62页
点击查看更多>>
资源描述

1、高级语言程序设计,授课班级:04通讯工程行知班 上课地点:25406 授课时间:星期三1、2、3 教学目标:利用指针进行编程 授课方式:讲课 教学方法:多媒体教学,重点难点,指针和指针变量的区别 指针变量作为函数参数的应用 指针作为数组元素的应用 多维数组和指针的应用 字符数组的应用,第10章 指 针,10.1 地址和指针的概念 10.2 变量的指针和指向变量的指针变量 10.3 数组的指针和指向数组的指针变量 10.4 字符串的指针和指向字符串的指针变量 10.5 函数的指针和指向函数的指针变量 10.6 返回指针值的函数 10.7 指针数组和指向指针的指针 10.8 有关指针的数据类型和指

2、针运算的小结,10.1 地址和指针的概念,C语言中,将地址形象化地称为“指针”。一个变量的地址称为该变量的“指针”。例如,地址2000是变量i的指针。如果有一个变量专门用来存放另一变量的地址(即指针),则它称为“指针变量”。 请区分“指针”和“指针变量”这两个概念。,举例: printf(“%d”,i)的执行过程 scanf(“%d”,&i)的执行过程 直接访问方式:按变量地址存取变量值的方式称为“直接访问”方式。 “间接访问”的方式:将变量i的地址存放在另一个变量中。 该变量是存放变量所占用单元的起始地址。要存取变量i的值,也可以采用间接方式:先找到存放“变量地址”的变量,再去找。,变量的指

3、针就是变量的地址。存放变量地址的变量是指针变量,用来指向另一个变量。 “*”符号表示“指向”,表示指针变量和它所指向的变量之间的联系。 例如:i-pointer代表指针变量,而*i-pointer是i-pointer所指向的变量,10.2 变量的指针和指向变量的指针变量,下面两个语句作用相同吗? i=3; *i-pointer=3;,一般形式:基类型*指针变量 基类型:用来指定该指针变量可以指向的变量的类型。 例如: int*pointer_1,*pointer_2; char*pointer_4; (pointer-4是指向字符型变量的指针变量) pointer-1=100;,10.2.1

4、定义一个指针变量,怎样使一个指针变量指向另一个变量呢? pointer_1=,在定义指针变量时要注意两点: (1) 指针变量前面的“*”,表示该变量的类型为指针型变量。 注意:指针变量名是pointer_1、pointer_2,而不是*pointer_1、*pointer_2。(2) 在定义指针变量时必须指定基类型。请牢记,指针变量中只能存放地址(指针),,有两个有关的运算符: (1) &:取地址运算符。 (2) *:指针运算符(或称“间接访问”运算符)。 例如:&a,*p 例10.1通过指针变量访问整型变量。,10.2.2 指针变量的引用,对程序的说明: (1) 程序第5、6行的作用就是使p

5、ointer-1指向a,pointer-2指向b,此时pointer-1的值为&a(即a的地址),pointer-2的值为&b。,(2) 最后一行的pointer-1和*pointer-2就是变量a和b。最后两个printf函数作用是相同的。 (3) 程序中有两处出现pointer-1和*pointer-2,请区分它们的不同含义。 (4) 第5、6行“pointer-1=”。因为a的地址是赋给指针变量pointer-1,而不是赋给*pointer-1(即变量a)。,对“”语句,若有 &*pointer-1它的含义是什么?“&”和“*”两个运算符的优先级相同,但按自右向左结合。因此,&*poin

6、ter-1与&a相同,即变量a的地址。,(2) *&a的含义是什么?,(3) (*pointer-1)+相当于a+。 注意和*(pointer-1+)的区别。,例10.2输入a和b两个整数,按先大后小的顺序输出a和b。,注意:a和b并未交换,它们仍保持原值,但p1和p2的值改变了。,例10.3题目同例10.2,即对输入的两个整数按大小顺序输出。,10.2.3 指针变量作为函数参数,对程序的说明: swap是用户定义的函数,它的作用是交换两个变量(a和b)的值。 注意实参pointer-1和pointer-2是指针变量,在函数调用时,将实参变量的值传送给形参变量。采取的依然是“值传递”方式。,注

7、意:交换*p1和*p2的值如果写成 swap(int *p1,int *p2) inttemp;*temp=*p1; /*此语句有问题*/p1=*p2;p2=*temp; ,注意,不能企图通过改变指针形参的值而使指针实参的值改变。请看下面的程序: swap(int *p1,int *p2) intp;p=p1;p1=p2;p2=p; ,main() int a,b;intpointer-1,*pointer-2;scanf(“%d,%d“, ,例10.4输入a、b、C 3个整数,按大小顺序输出。,数组的指针是指数组的起始地址,数组元素的指针是数组元素的地址。 引用数组元素的方法:下标法、指针法

8、。,10.3 数组的指针和指向数组的指针变量,10.3.1 指向数组元素的指针,对指针元素赋值:p= 把a0元素的地址赋给指针变量p。也就是说,p指向a数组的第0号元素,“p=a;”的作用是“把a数组的首地址赋给指针变量p”,而不是“把数组a各元素的值赋给p” intp=a;的作用是将a的首地址(即a0的地址)赋给指针变量p(而不是赋给*p)。,p已定义为指针变量,并已给它赋了一个地址,指向某一个数组元素。 赋值语句:p=1;表示对p当前所指向的数组元素赋予一个值(值为1)。则p+1指向同一数组中的下一个元素,10.3.2 通过指针引用数组元素,如果p的初值为&a0,则: (1) p+i和a+

9、i就是ai的地址, (2) *(p+i)或*(a+i)是p+i或a+i所指向的数组元素,即ai。 实际上是变址运算符,即将ai按a+i计算地址,然后找出此地址单元中的值。 (3) 指向数组的指针变量也可以带下标,如pi与(p+i)等价。,引用一个数组元素,可以用: (1) 下标法,如ai形式; (2) 指针法,如*(a+i)或(p+i)。其中a是数组名,p是指向数组的指针变量,其初值p=a。 例10.5输出数组中的全部元素。假设有一个a数组,整型,有10个元素。要输出各元素的值有三种方法: (1) 下标法。 (2) 通过数组名计算数组元素地址,找出元素的值。 (3) 用指针变量指向数组元素。,

10、对三种方法的比较: (1) 第(1)和(2)种方法执行效率是相同的。找数组元素费时较多。 (2) 第(3)种方法比(1)(2)法快,用指针变量直接指向元素,不必每次都重新计算地址,像p+这样的自加操作是比较快的。这种有规律地改变地址值(p+)能大大提高执行效率。 (3) 用下标法比较直观,能直接知道是第几个元素。,在使用指针变量时,要注意的问题: (1) 指针变量可以实现使本身的值改变。 (2) 要注意指针变量的当前值。(例10.6) (3) 虽然定义数组时指定它包含10个元素,可以用p指向当前的数组元素。但是实际上指针变量p可以指向数组以后的内存单元。如果引用数组元素a10,C编译程序并不认

11、为非法,系统把它按*(a+10)处理。,例10.6通过指针变量输出a数组的10个元素。,(4) 注意指针变量的运算。如果先使p指向数组a(即p=a),则: p+(或p+=1),使p指向下一元素,即a1。若再执行*p,取出下一个元素a1值。 p+,由于+和*同优先级,结合方向为自右而左,因此它等价于*(p+)。作用是先得到p指向的变量的值(即*p),然后再使p+1=p。 (p+)与*(+p)作用不同。前者是先取*p值,后使p加1。后者是先使p加1,再取*p。 (*p)+表示p所指向的元素值加1,即(a0)+ 如果p当前指向a数组中第i个元素,则:(p-)相当于ai-,先对p进行“*”运算,再使p

12、自减。,10.3.3 用数组名作函数参数,f(int arr , int n) f(int *arr, int n) 以上两种写法是等价的。,需要说明的是:C语言调用函数时虚实结合的方法都是采用“值传递”方式,当用变量名作为函数参数时传递的是变量的值,当用数组名作为函数参数时,由于数组名代表的是数组起始地址,因此传递的值是数组首地址,所以要求形参为指针变量。,说明: 实参数组后代表一个固定的地址,或者说是指针型常量,而形参数组并不是一个固定的地址值。作为指针变量,在函数调用开始时,它的值等于实参数组起始地址,但在函数执行期间,它可以再被赋值。如: f(arr , int n) printf(“

13、%dn“, *arr);/*输出array0的值,*/ arr=arr+3; printf(“%dn“, *arr);/*输出array3的值,*/ ,例10.7将数组a中n个整数按相反顺序存放,见图示意。,程序执行示意图,例10.8从10个数中找出其中最大值和最小值。,(1) 形参和实参都用数组名,如: main() f(intx ,int n) int a10; f(a,10); ,如果有一个实参数组,想在函数中改变此数组的元素的值,实参与形参的表示形式有以下4种情况:,(2) 实参用数组名,形参用指针变量。如: main() f(int *x,int n) int a10; f(a,10

14、); ,(3) 实参形参都用指针变量。例如: main() f(int *x,int n) int a10, *p; p=a; f(p,10); ,(4) 实参为指针变量,形参为数组名。如: main() f(int x ,int n) int a10,*p; p=a; f(p,10); ,例10.9用实参指针变量改写例10.7。 应注意,如果用指针变量作实参,必须先使指针变量有确定值,指向一个已定义的数组. 例10.10用选择法对10个整数排序。,1. 多维数组的地址 设有一个二维数组a,它有3行4列。它的定义为 int a34=1,3,5,7,9,11,13,15,17,19,21,23;

15、,10.3.4 指向多维数组的指针和指针变量,从二维数组的角度来看,a代表整个二维数组的首地址,也就是第0行的首地址。a+1代表第1行的首地址。,举例:,例10.11输出二维数组有关的值。,(1) 指向数组元素的指针变量。 例10.12用指针变量输出数组元素的值。,2. 指向多维数组的指针变量,(2) 指向由m个元素组成的一维数组的指针变量。,例10.13输出二维数组任一行任一列元素的值。,注意应输入“i=1,j=2”,以与scanf函数中指定的字符串相对应。 “(*p)4”这种形式不好理解。可以对下面二者做比较: int a4;(a有4个元素,每个元素为整型) int (*p)4;,用指针变

16、量作形参接受实参数组名传递来的地址时,有两种方法: 用指向变量的指针变量; 用指向一维数组的指针变量。 例10.14有一个班,3个学生,各学4门课,计算总平均分数,以及第n个学生的成绩。,3. 多维数组的指针作函数参数,例10.15在上题基础上,查找有一门以上课程不及格的学生,打印出他们的全部课程的成绩。,10.4.1 字符串的表示形式 访问一个字符串方法: (1) 用字符数组存放一个字符串,然后输出该字符串。例10.16,10.4 字符串的指针和指向字符串的指针变量,(2) 用字符指针指向一个字符串。,例10.18将字符串a复制为字符串b。 例10.19用指针变量来处理例10.18问题。,例

17、10.20用函数调用实现字符串的复制。 (1) 用字符数组作参数。,10.4.2 字符串指针作函数参数,用字符型指针变量。main函数可改写如下: main() char *a=“I am a teacher.“; char *b=“you are a student.“; printf(“string a=%snstring b=%sn“,a,b); Copy-string(a,b); printf(“nstring a=%snstring b=%sn“,a,b); ,(2) 形参用字符指针变量。,(3) 对Copy-string函数还可作简化。 将Copy-string函数改写为 void

18、 Copy-string(char *from,char *to) while(*to=*from)!=0) to+;from+; Copy-string函数的函数体还可改为 while(*to+=*from+)!=0); , 函数体还可写成 while(*from!=0) *to+=*from+; to=0; 上面的while语句还可以进一步简化为下面的while语句:while(*to+=*from+);它与下面语句等价:while(*to+=*from+)!=0);, 函数体中while语句也可以改用for语句: for(;(*to+=*from+)!=0;); 或 for(;*to+=

19、*from+;); 也可用指针变量,函数Copy-string可写为 void Copy-string(char from ,char to ) charp1,*p2;p1=from;p2=to;while(*p2+=*p1+)!=0); ,用字符数组和字符指针变量实现字符串的存储和运算的区别: (1) 字符数组由若干个元素组成,每个元素中放一个字符,而字符指针变量中存放的是地址(字符串的首地址),决不是将字符串放到字符指针变量中。 (2) 赋值方式。对字符数组只能对各个元素赋值,不能用以下办法对字符数组赋值。 char str14; str=“I love China!“;,10.4.3 对

20、使用字符指针变量和字符数组的讨论,(3) 对字符指针变量赋初值: chara=“I love China!“; 等价于 chara; a=“I love China!“; (4) 如果定义了一个字符数组,在编译时为它分配内存单元,它有确定的地址。而定义一个字符指针变量时,给指针变量分配内存单元,在其中可以放一个地址值,也就是说,该指针变量可以指向一个字符型数据,但如果未对它赋予一个地址值,则它并未具体指向一个确定的字符数据。,(5) 指针变量的值是可以改变的,如:例10.21main()chara=“I love China!“;a=a+7;printf(“%s“,a); 运行结果如下: China!,(6) 用指针变量指向一个格式字符串,可以用它代替printf函数中的格式字符串。如: charformat; format=“a=%d,b=%fn“; printf(format,a,b); 它相当于 printf(“a=%d,b=%fn“,a,b);,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 中等教育 > 职业教育

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报