《C语言程序设计教程(第二版)》-徐新华-电子教案 第09章 指针 1

上传人:E**** 文档编号:89400360 上传时间:2019-05-24 格式:PPT 页数:40 大小:363.50KB
返回 下载 相关 举报
《C语言程序设计教程(第二版)》-徐新华-电子教案 第09章 指针 1 _第1页
第1页 / 共40页
《C语言程序设计教程(第二版)》-徐新华-电子教案 第09章 指针 1 _第2页
第2页 / 共40页
《C语言程序设计教程(第二版)》-徐新华-电子教案 第09章 指针 1 _第3页
第3页 / 共40页
《C语言程序设计教程(第二版)》-徐新华-电子教案 第09章 指针 1 _第4页
第4页 / 共40页
《C语言程序设计教程(第二版)》-徐新华-电子教案 第09章 指针 1 _第5页
第5页 / 共40页
点击查看更多>>
资源描述

《《C语言程序设计教程(第二版)》-徐新华-电子教案 第09章 指针 1 》由会员分享,可在线阅读,更多相关《《C语言程序设计教程(第二版)》-徐新华-电子教案 第09章 指针 1 (40页珍藏版)》请在金锄头文库上搜索。

1、2019/5/24,1,第9章 指 针,指针是语言的重要概念和特色。使用指针,可以使程序更加简洁、紧凑、高效。 教学目的: 掌握指针的概念,指针变量的概念、定义与应用,指向1维数组(字符串)的指针变量应用,指针数组与带参主函数; 了解返回指针值的函数等。,2019/5/24,2,教学内容: 9.1 指针和指针变量的概念 9.2* 指针变量的定义与应用 9.3* 1维数组的指针与列指针变量 9.4 字符串的指针和指向字符串的指针变量 9.5 指针数组与主函数main()的参数 9.6 返回指针值的函数 本章要点 本章作业与上机实践,2019/5/24,3,9.1* 指针和指针变量的概念,1内存地

2、址内存中存储单元的编号。 (1)内存中拥有大量的存储单元(1字节)。为了方便管理,必须为每一个存储单元编号存储单元的“地址”。 每个存储单元,都有一个惟一的地址。 (2)在地址所标识的存储单元中,存放数据。 类比:住址(宿舍编号)与人。,2019/5/24,4,2变量地址系统分配给变量的内存单元的起始地址。 假设有如下程序: void main( ) int num; scanf(“%d“, 且系统分配给变量num的2个存储单元为 3000 和3001,则起始地址3000就是变量num在内存中的地址。,2019/5/24,5,3变量值的存取通过变量在内存中的地址进行 系统存取变量num的方式可

3、以有两种:,(1)直接访问直接利用变量的地址进行存取 用变量名num查找符号表(编译程序建立),取出其起始地址3000;然后访问num(将数据送入/取出),如右图所示。,2019/5/24,6,(2)间接访问通过另一变量访问num的值 语言规定:在程序中,可以定义一种特殊的变量(称为指针变量),用来存放其它变量的地址。 假设:定义了1个指针变量num_p,它被分配到4000、4001单元,通过赋值语句“num_p =num;”获得num的地址3000,如下图所示:,2019/5/24,7,通过指针变量num_p,存取变量num的过程如下: 首先找到指针变量num_p的地址(4000),取出其值

4、3000(num 的地址); 然后存取num的值(3)。,2019/5/24,8,(3) 两种访问方式的比较 类比:某人甲(系统)找某人乙(变量)办事 甲直接去找乙办事(即直接访问)。 甲委托丙(指针变量)去找乙办事。,2019/5/24,9,4指针与指针变量 (1)指针即地址,变量的地址称为该变量的指针。 (2)指针变量专门用于存储其它变量地址的变量。 例如,变量num_p是一个指针变量,其值是变量num的地址。 返回,2019/5/24,10,9.2* 指针变量的定义与应用,9.2.1 指针变量的定义与相关运算 案例9.1 指针变量的定义与相关运算示例。 #include “stdio.h

5、“ #include “conio.h“ void main( ) int num_int=12, *p_int; float num_f=3.14, *p_f; char num_ch=p, *p_ch; p_int = ,指向int型数据的指针变量p_int,使p_int指向变量num_int,2019/5/24,11,printf(“num_int=%d, *p_int=%dn”, num_int, *p_int); printf(“num_f=%4.2f, *p_f=%4.2fn”, num_f, *p_f); printf(“num_ch=%c, *p_ch=%cn”, num_ch

6、, *p_ch); getch(); 程序运行结果: num_int=12, *p_int=12 num_f=3.14, *p_f=3.14 num_ch=p, *p_ch=p,访问p_int所指向的变量,2019/5/24,12,1、指针变量的定义 数据类型 *指针变量,*指针变量2; 例如, 案例9.1中的语句: int num_int=12, *p_int ; 特别说明:定义而未初始化的指针变量(例如p_int)是悬空的。 使用悬空指针变量,很容易破坏系统,导致系统瘫痪。,指针变量的定义标识符,2019/5/24,13,2、取地址运算 : 变量名 例如,案例9.1中的&num_int、&

7、num_f、&num_ch的结果,分别为对应变量的地址(num_int、num_f、num_ch)。 注意:指针变量只能存放相同数据类型变量的地址。 例如, 案例9.1中的指针变量p_int、p_f、p_ch,只能接收int型、float型、char型变量的地址,否则出错。,2019/5/24,14,3、指针运算: *指针变量名 *p_int、*p_f、*p_ch ,分别输出各自所指向的变量num_int、num_f、num_ch的值。 案例9.2 使用指针变量求解:输入2个整数,按升序(从小到大排序)输出。,2019/5/24,15,#include “stdio.h“ #include “

8、conio.h“ void main() int num1, num2; int *num1_p= ,悬空指针,使num1_p指向num1,本身是地址,不能再加&。,2019/5/24,16,算法思路:交换指针变量num1_p 、num2_p的值,而不是变量num1和num2的值(保持原值),最后通过指针变量输出处理结果。 假设输入的数据为9和6,则指针变量num1_p和num2_p交换前后的指向,如下图所示:,2019/5/24,17,9.2.2 指针变量作函数参数 1、指针变量:形参 + 实参。 2、指针变量作实参时,是地址传递,即将指针变量的值(一个地址) ,传递给被调用函数的形参(必须

9、是一个指针变量)。,2019/5/24,18,案例9.3 使用函数调用方式改写案例9.2,要求函数参数为指针变量。 #include “stdio.h“ #include “conio.h“ void exchange( int *pointer1, int *pointer2 ) int temp; temp=*pointer1; *pointer1=*pointer2; *pointer2=temp; ,2019/5/24,19,void main() int num1, num2; int *num1_p= ,2019/5/24,20,算法思路:通过指针变量num1_p 、num2_p,

10、交换它们所指向的变量num1和num2的值,最后通过变量num1和num2输出结果。 假设输入的数据为9和6,则调用函数exchange()之前、之时、结束时和结束后的情况,如图9-4所示:,2019/5/24,21,2019/5/24,22,形参指针变量pointer1(num1)和pointer2 (num2),在函数调用开始时才分配存储空间,函数调用结束后立即被释放。 结论:地址传递时,形参指针变量不可改变实参指针变量,但可以改变它所指向的变量的值,通过不变的实参指针变量将变化的值保留下来。 返回,2019/5/24,23,9.3* 1维数组的指针与列指针变量,9.3.1 预备知识 9.

11、3.2 使用列指针变量引用数组的元素 9.3.3 数组作函数参数 返回,2019/5/24,24,9.3.1 预备知识,1、基本概念 数组指针数组在内存中的起始地址,用数组名表示。 数组元素指针数组元素在内存中的起始地址。,2019/5/24,25,2、指向数组的指针变量的定义 int array10, *pointer = array (或,数组名数组在内存中的起始地址(与第1个元素的地址相同),2019/5/24,26,(1) pointer + i和array + i都是指针,均指向元素arrayi,即: pointer + i = array + i = &arrayi 。 (2) *

12、( pointer + i )和*( array + i ) 均访问元素 arrayi。 (3)指向数组的指针变量,可以当作数组名用。 例如,pointeri *(pointer+i)。 注:pointer + 1使指针指向数组的下一个元素,而不是内存下一个存储单元。,2019/5/24,27,3、数组元素的引用方法 (1)下标法:arrayi,直观。 (2)指针法:*pointer,目标程序占用内存少、速度快。 返回,2019/5/24,28,案例9.5 使用指向数组的指针变量来访问数组元素。 #include “stdio.h“ #include “conio.h“ void main()

13、 int array10, *pointer = array, i; printf(“Input 10 numbers: ”); for(i=0; i10; i+) scanf(“%d”, pointer+i) ; printf(“array10: ”); for(i=0; i10; i+) printf(“%d ”, *(pointer+i) ) ; printf(“n”); getch(); ,使用指向数组的指针变量输入。,使用指向数组的指针变量输出,9.3.2 使用列指针变量引用1维数组的元素,2019/5/24,29,1指向数组的指针变量,可以指向数组后面的内存单元,虽然没有实际意义。

14、 例如,*(pointer+10),程序照样运行。 2对指向数组的指针变量(px和py),进行算术运算和关系运算的含义:,2019/5/24,30,(1) 算术运算: px n:将指针从当前位置向前(+)或回退(-)n个元素(不是n个字节)。 px+/+px和px-/-px是pxn的特例(n=1)。 px - py:两指针之间的元素个数,不是地址之差。,2019/5/24,31,(2) 关系运算:两个指针所指地址的前后关系:前者为小,后者为大。 例如,如果指针px所指地址在指针py所指地址之前,则px py的值为1。 返回,2019/5/24,32,两种形式: (1)数组元素(又称下标变量)作

15、为实参; (2)数组名作为函数的形参和实参。 1、数组元素作为函数参数实参 数组元素作为函数参数,用法与普通变量完全相同,属于值传递。,9.3.3 数组作函数参数,2019/5/24,33,案例 统计字符串中字母个数。 #include “stdio.h“ #include “conio.h“ void main( ) int i, num = 0; char str255; printf(“Input a string: “); gets(str); for(i=0; stri != 0; i+) if ( isalp(stri) = = 1 ) num+; puts(str); print

16、f(“num=%dn“,num); getch(); ,改为isalp(stri) ?,字符串未结束,2019/5/24,34,int isalp( char c ) return(c=a ,2019/5/24,35,2、数组名作为函数的形参和实参 数组名作实参时,传递的是数组指针,属于地址传递,对应的形参必须是同一数据类型的数组名(指针变量)。 案例 已知某个学生5门课程的成绩,求平均成绩。,2019/5/24,36,#include “stdio.h“ #include “conio.h“ float aver( float a , int n); void main( void ) float s

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

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

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