C语言程序设计 - 指针-样本教案

2018-11-12 21:16

主要 内容 重点 难点 问题 提出 指针程序设计 第一讲 内容 说明 重点:变量指针和一维数组指针 1.指针与指针变量的概念 2.变量指针、一维数组指针、字符串指针 3.指向变量、数组、字符串的指针变量 1. 指针的概念 2. 变量指针和一维数组指针 3.指向变量、一维数组的指针变量 1.变量指针和一维数组指针的引用 2.指向变量、一维数组的指针变量的引用 定义变量时,系统会为变量开辟相应数量的内存单元存储数据,是否可以通过内存单元对应的内存地址来访问内存单元中存储的数据呢?如果可以的话,如何来实现呢? 一、间接访问与直接访问 举例:打开A抽屉方法 直接访问:将A钥匙带在身上,需要时直接打开 间接访问:将A钥匙放在B抽屉,需要时,打开B抽屉取出A钥匙,打开A抽屉。 二、指针与地址 1.什么是指针 定义:指针就是地址。 2.内存单元和地址 内存单元地址:计算机内部存储器由很多内存单元组成,每个内存单元都有自己唯一的地址编码,称内存单元地址。 3.变量与地址 当一个变量只占用一个内存单元时,内存单元的地址就是变量的地址;当变量占用连续的若干个内存单元时,最前面一个单元的地址就是该变量的地址。 例:int i=3;float f; 地址 内存单 2001 整型变量i 3 2002 。。 。 2008 2009 单精度变量f 2010 变量i的地址:2001,变量f的地址:2008 由于地址起到寻找操作对象的作用,像一个指向对象的指针,所以常把地址称为“指针”。 主要针对一维数组 重点讲解 通过此图讲解变量与地址的关系 4.数组与地址 数组元素要占用连续的内存单元。数组类型不同,每个数组元素占用的内存单元数也不同。数组占用的总单元数=数组长度×每个数组元素占用的内存单元数。 数组元素a[i]的地址=数组首地址+i×数组元素的数据类型所占用的内存单元数 例:int a[3]={1,2,3}; 三、指针变量 地址 3000 3001 3002 3003 3004 3005 3006 内存单 1 2 3 整型数组元素a[0] 整型数组元素a[1] 整型数组元素a[2] 通过例子说明指针变量的定义和初始化应注意的问题 1.什么是指针变量 定义:存放内存地址的变量称为“指针变量”。 2.指针变量的定义和初始化 指针变量在使用前必须定义,定义的同时可以赋初值。 【格式】存储类型 数据类型 *指针变量名1[=初值1],?; 【功能】定义指向指定“数据类型”或数组的若干个指针变量,同时给这些变量赋初值。 例:int a;int *p=&a;float f1,f[10],*p1=&f1,*p2=f; 3.指针变量的引用方式 (1)给指针变量赋值 【格式】指针变量=地址表达式 例: int i,*p;p=&i; (2)直接引用指针变量名 例:int i,j,*p=&i,*q;q=p;scanf(“%d,%d”,q,&j); (3)通过指针变量来引用它所指向的变量 【格式】*指针变量名 注意:这种引用方式要求指针变量必须有值。 例如:int i=1,j=2,k,*p=&i;k=*p+j; 四、取地址运算符与指针运算符 取地址运算符(&):取运算对象的地址。如&a 指针运算符(*):取所指向的变量或数组元素。 例如:int *p,a;p=&a;则*p= =a为真。 五、指向一维数组的指针变量的使用 如何将指针变量指向数组的首地址? (1)初始化:数据类型 *指针变量=数组名 (2)程序中赋值:指针变量=数组名 (3)若指针变量指向某数组元素:*指针变量=&数组名[下标] 1.用指向一维数组的指针变量处理数组元素 (1)当指针变量指向数组的首地址,引用数组元素的方法 引用“数组元素[0]”: *(指针变量+0)或*指针变量 数组名的特殊性 实例讲解 引用“数组元素[i]”: *(指针变量+i) (2)当指针变量指向下标为i的数组元素,引用数组元素的方法 举例 引用“数组元素[i]”: *(指针变量+0)或*指针变量 引用“数组元素[i-k]”: *(指针变量-k) 引用“数组元素[i+k]”: *(指针变量+k) (3)当指针变量指向数组首地址,对下标i的数组元素引用方法 ① *(指针变量+i)②*(数组名+i)③ 指针变量[i]④数组名[i] 注意:数组名2.指向一维数组的指针变量的运算 (1)指针变量算术运算 指针变量++ 指针变量-- 指针变量1-指针变量2 (2)指针变量的关系运算 指针变量1 关系运算符 指针变量2 六、指向字符串的指针变量的使用 1.将指针变量指向字符串常量的方法 例:将字符指针变量p指向“abcd” 方法一:初始化形式 数据类型 *指针变量=字符串常量 char *p=“abcd”; 方法二:赋值语句 指针变量=字符串常量 char *p;p=“abcd”; 2.指向字符串常量的指针变量的使用 (1)处理整个字符串 输出字符串 printf(“%s”,指针变量); 输入新的字符串代替原字符串 scanf(“%s”,指针变量); (2)处理字符串中的单个字符 第i个字符的表示方法: *(指针变量+i) 3.指向存放字符串的字符数组的指针变量的使用 处理字符串中的单个字符就是处理一维数组的元素,方法同 处理一维数组元素。注意:字符数组元素的类型是字符型。 七、小结 指向变量、一维数组、字符串的指针变量的定义和应用。 八、作业 是否可以进行这些运指针变量+整数 指针变量-整数 ++指针变量 --指针变量 算? 两个指针变量必须指向同一数组 举例 指针程序设计 第 二 讲 主要 内容 重点 难点 问题 提出 重点 难点 内容 1.多维数组指针和指向多维数组的指针变量的引用 2.函数指针和指向函数的指针变量 3.指针数组和多级指针 1. 指向二维数组的指针变量的引用 2. 指向函数的指针变量的引用 1. 指向二维数组的指针变量 2. 指向函数的指针变量 前面学习了通过指针访问一维数组,那么如何通过指针对二维数组进行访问呢?二维数组中隐含着怎样的地址关系呢? 一 、指针表示二维数组 1、 二维数组元素的地址 int a[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}}; 二维数组a[3][4]可看成由3个一维数组a[0]、a[1]、a[2]组成,每个一维数组由4个元素组成。如下图所示。 a[0] a[0]+1 a[0]+2 a[0]+3 a a[0] 1 3 5 7 a[1] a+1 9 11 13 23 15 a[2] a+2 17 19 21 23 a代表二维数组首元素的地址,a[0]、a[1]、a[2]是一维数组名,而C语言规定数组名代表数组首元素的地址,即a[0]等价于&a[0][0]、a[1]等价于&a[1][0]、a[2]等价于&a[2][0]。 2、使用指针表示二维数组元素 进一步分析:a[0]等价于&a[0][0],a[0]+1等价于&a[0][1],a[0]+2等价于&a[0][2],a[0]+3等价于&a[0][3]。 因为a[0]和*(a+0)等价,a[1]和*(a+1)等价,a[i]和*(a+i)等价,因此: a[0]+1等价 *(a+0)+1等价 &a[0][1] a[1]+2等价 *(a+1)+2等价 &a[1][2] 注意:不要将*(a+1)+2 错写成*(a+1+2)。 进一步分析:因为&a[0][1]等价a[0]+1等价 *(a+0)+1,那么*(*(a+0)+1)或*(*a+1)等价a[0][1]的值。*(a[i]+j)或*(*a+i)+j)等价a[i][j]的值 二、如何使用指针变量指向二维数组? 当定义了二维数组和同类型的指针变量后,可使这个指针变量: ①指向二维数组的首地址 说明 主要讲二维数组指针 先复习二维数组的性质 为什么? ②指向二维数组中某个一维数组 ③指向二维数组的某个数组元素 1.指针变量指向二维数组的某个元素 (1)让指针变量指向二维数组的某个元素的方法 初始化:数据类型 *指针变量=&数组名[下标1][下标2] 赋值:指针变量=&数组名[下标1][下标2] (2)二维数组元素的引用方法 *指针变量 该指针变量体现不出二维数组“维”的概念。 【例1】输入2行3列的矩阵元素,存入二维数组,再按行列格式 输出 main() {int a[2][3],*p,i,j; for (i=0;i<2;i++) for (j=0;j<3;j++) {p=&a[i][j];scanf(“%d”,p);} for (i=0;i<2;i++) { printf(“\\n”); for (j=0;j<3;j++) { p=&a[i][j];printf(“d”,*p); } } } 2.指针变量指向二维数组的首地址 (1)让指针变量指向二维数组首地址的方法 初始化:① 数据类型 *指针变量=二维数组名 ② 数据类型 *指针变量=&二维数组名[0][0] 赋值: ① 指针变量=二维数组名 ② 指针变量=&二维数组名[0][0] (2)二维数组元素的引用方法 *(指针变量+i*列数+j) 【例2】使用指向二维数组首地址的指针变量重编上个例1 main() {int a[2][3],*p,i,j; for (i=0;i<2;i++) for (j=0;j<3;j++) scanf(“%d”,p+i*3+j); for (i=0;i<2;i++) { printf(“\\n”); for (j=0;j<3;j++) printf(“d”,*(p+i*3+j)); } } 3.指针变量指向二维数组中某个一维数组 (1) 让指针变量指向二维数组中某个一维数组的方法 步骤:①定义指针变量 数据类型(*指针变量)[m] 说明:m是二维数组的列长 注意scanf 注意printf 该指针变量体现了二维数组“维”的概念。

②用初始化或赋值方法将指针变量指向二维数组的首地址 数据类型 (*指针变量)[m]=二维数组名 (初始化) 指针变量=二维数组名 (赋值) 注意:( )不能丢,不能写成“*指针变量[m]”;[ ]运算符高于* ③二维数组中第i行对应的一维数组首地址的表示 *(指针变量+i) (2)二维数组元素的引用方法 数组元素地址:*(指针变量+行下标)+列下标 数组元素引用:*(*(指针变量+行下标)+列下标) 其中:*(指针变量+行下标)是行下标对应的一维数组的首地址。 例:int a[2][3],(*p)[3]=a; 说明:定义二维数组a[2][3]和指向具有3个元素的一维数组指针变量p,并使p指向二维数组a的首地址。 对应二维数组中2个一维数组的首地址表示如下: 二维数组中的一维数组 指针变量表示一维数组的首地址 a[0] *(p+0) a[1] *(p+1) 二维数组元素的引用格式: 数组元素 a[0][0] a[0][1] a[0][2] 引用格式 *(*(p+0)+0) *(*(p+0)+1) *(*(p+0)+2) 数组元素 a[1][0] a[1][1] a[1][2] 引用格式 *(*(p+1)+0) *(*(p+1)+1) *(*(p+1)+2) 【例3】用指向二维数组中一维数组的指针变量重新编写例1 main() {int a[2][3],(*p)[3]=a;int i,j; for (i=0;i<2;i++) for (j=0;j<3;j++) scanf(“%d”,*(p+i)+j); for (i=0;i<2;i++) { printf(“\\n”); for (j=0;j<3;j++) printf(“d”,*(*(p+i)+j)); } } 难点 三、如何使用指针处理函数问题 1.指针变量做函数参数 函数的参数可以是整型、浮点型、字符型、指针类型的数据。指针类型做函数参数的作用是将一个地址值传送到函数中。 【例4】编写一函数,通过函数调用显示一个字符串。 Main()

{ void disp(); char *p=”C is a programming language.”; disp(p); } void disp(char *q); { printf(“%s\\n”,q);} 2. 返回值为地址 当函数返回指针类型数据时,应当在定义函数时对返回值的类型进行说明。 格式:基本类型 *函数名(形式参数表) 3.指向函数的指针变量的定义 类型说明符 (*指针函数的指针变量名)( ); 例如:int (*fp)( ); 注意:( )不能省略 4.用指向函数的指针变量调用函数 方法:(1)将函数的入口地址(函数名)赋给指向函数的指针变量 (2)用指向函数的指针变量(连同圆括号)代替函数名使用 四、指针数组 1.定义:当某个数组被定义为指针类型,称该数组为指针数组。 注意:指针数组是指针类型的,对其元素所赋的值必须是地址值。 格式:存储类型 数据类型 *指针数组名 [长度]={初值}? 例如:int a,b,c,*p[3]={&a,&b,&c}; 定义指针型数组p,其3个元素p[0]、p[1]、p[2]分别指向a,b, c。 2.指针数组元素的引用 引用方法和普通数组元素的引用方法完全相同,可利用它来引用所指向的普通变量或数组元素,可对其赋值,也可参加运算。 【例5】输入5个字符串存入一个二维数组中,定义一个指针数组,使其元素分别指向这5个字符串并输出。 main() { char s[5][20],*p[5]; int i; for (i=0;i<5;i++) p[i]=s[i]; for (i=0;i<5;i++) scanf(“%s”,p[i]); for (i=0;i<5;i++) printf(“%s\\n”,p[i]); } 【例6】输入a和b两个整数,调用函数swap对a,b从大到小排序,然后输出。 比较 int (*fp)();和int *fp(); swap(int *p1,int *p2) { int temp; if (*p1<*p2) { temp=*p1;*p1=*p2;*p2=temp;} } main() { int a,b,*pa,*pb; printf(“\\nPlease input a,b:\\n”); scanf(“%d,%d”,&a,&b); pa=&a;pb=&b; swap(pa,pb); printf(“%d,%d”,a,b); } 五、多级指针 1. 什么是多级指针 定义:指向指针变量的指针变量,称为多级指针。常使用的多级指针是二级指针。 2.二级指针变量的定义和初始化 【格式】存储类型 数据类型 **指针变量名={初值},? 【功能】定义指向“数据类型”指针变量的二级指针变量,同时给二级指针变量赋初值。 例如:int a,*p1=&a,**p2=&p1; *p1代表变量a, *p2代表指针变量p1,**p2代表变量a。 举例说明二级指针的应用。 六、小结 指向二维数组的指针变量的引用、指向二维数组的行指针变量的引用;指向函数的指针变量的引用;指针数组和多级指针。 七、作业 分析程 序运行 过程


C语言程序设计 - 指针-样本教案.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:《青铜器与甲骨文》名师教案(新部编人教版七年级上册历史)

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: