版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
任务6.3指针与数组的等价性探究主讲:陈静目录教学目标与重难点指针与一维数组指针表达式与运算指针与二维数组任务实施与训练教学总结010203040506教学目标与重难点01教学目标知识目标数组名是指向首元素的常量指针理解数组名在内存中的本质含义,建立指针与数组的关联认知指针访问数组的四种等价方式掌握下标法、指针法、数组名法、指针偏移法的互换使用二维数组的行地址与列地址概念理解二维数组在内存中的线性存储与逻辑二维结构的映射关系行指针变量的定义与使用方法掌握指向一维数组的指针变量(行指针)的声明与运算规则能力目标核心使用指针遍历一维数组并计算元素和能够编写循环结构,通过指针移动实现数组求和运算使用指针查找数组中的最大值和最小值能够运用指针比较运算,实现极值查找算法的程序设计使用行指针访问二维数组元素能够通过行指针定位二维数组行,结合列偏移访问任意元素能力目标使用指针遍历一维数组并计算元素和能够编写循环结构,通过指针移动实现数组求和运算使用指针查找数组中的最大值和最小值能够运用指针比较运算,实现极值查找算法的程序设计使用行指针访问二维数组元素能够通过行指针定位二维数组行,结合列偏移访问任意元素教学重难点教学重点指针与数组下标的等价关系理解指针与数组下标的等价关系,建立地址偏移与索引访问的统一认知指针表达式运算辨析运算符优先级差异,如
*p++、*++p、(*p)++、++*p多种访问方式综合整合二维数组元素的多种访问形式,建立指针视角下的多维数组认知框架教学难点二维数组地址转换掌握行地址与列地址的转换机制,理解二维数组的线性存储本质四种访问方式a[i][j]/*(a[i]+j)/*(*(a+i)+j)行地址等价关系a[i]与*(a+i)元素地址等价关系&a[i][j]与a[i]+j与*(a+i)+j行指针变量正确声明与使用行指针变量
int(*p)[n],区分与列指针的本质差异指针与一维数组02指针与一维数组的关系数组名即指针数组名本身就是一个指向数组首元素的指针,代表数组在内存中的起始地址两种初始化等价p=a;与p=&a[0];完全等价,均将指针指向数组首元素等价关系:三种运算符完全互换数组名本质数组名是数组首元素的地址运算符组合+(偏移)、*(解引用)、[](下标)访问任意元素等价写法*(p+i)、p[i]、*(a+i)三者等价数组名a指针常量,地址固定不可变禁止赋值操作,a++非法指针变量p可赋值变量,地址可修改支持重新指向,p++合法访问数组元素的四种等价方式方式一:a[i]常规下标法访问数组元素,最直观、最常用的数组元素访问方式inta[5]={10,20,30,40,50};printf("%d",a[2]);输出结果:30方式二:*(a+i)数组名作为指针访问数组元素,数组名即首元素地址inta[5]={10,20,30,40,50};printf("%d",*(a+2));输出结果:30方式三:p[i]指针变量下标法访问数组元素,指针变量也可使用下标语法inta[5]={10,20,30,40,50};int*p=a;printf("%d",p[2]);输出结果:30方式四:*(p+i)使用指针变量访问数组元素,最灵活的指针运算形式inta[5]={10,20,30,40,50};int*p=a;printf("%d",*(p+2));输出结果:30训练项目:访问数组元素验证四种访问方式等价性训练目标:通过代码实践理解指针与数组的等价关系1数组下标法a[i]使用传统数组下标语法访问元素2数组指针法*(a+i)数组名作为基址进行指针运算3指针下标法p[i]指针变量使用下标语法访问4指针运算法*(p+i)指针变量进行偏移解引用操作四种方式输出结果完全相同验证结论:数组名
a
与指向首元素的指针
p
在访问元素时完全等价,下标运算
[i]
与指针偏移
*(+i)
本质相同使用指针访问相对位置元素向前访问p[-i]访问从指针位置向前偏移i个位置的元素*(p-i)等价写法,通过指针运算实现向前访问示例说明关键若指针p指向数组第3个元素a[2]:当前位置访问*p、p[0]表示
a[2]向前偏移一位p[-1]、*(p-1)表示
a[1]向后偏移一位p[1]、*(p+1)表示
a[3]向后访问p[i]访问从指针位置向后偏移i个位置的元素*(p+i)等价写法,通过指针运算实现向后访问训练项目:相对位置访问训练概览训练内容详述训练目标掌握指针偏移运算与数组下标的等价关系初始定义inta[]={1,2,3,4,5};int*p=&a[2];关键操作当前、向前、向后三种位置访问预期输出3、2、4验证等价性当前位置访问*p解引用写法=p[0]下标写法结果:3(p指向a[2])向前偏移一位p[-1]负下标写法=*(p-1)指针运算写法结果:2(a[1]的值)向后偏移一位p[1]正下标写法=*(p+1)指针运算写法结果:4(a[3]的值)指针表达式与运算03指针表达式的含义*p++等价形式:*(p++)执行顺序:先取值,后指针后移//示例:m=*p++;//等价于m=*p;p++;后缀++优先级高*++p等价形式:*(++p)执行顺序:先指针后移,后取值//示例:m=*++p;//等价于++p;m=*p;前缀++优先级高(*p)++括号优先:作用于数组元素执行结果:数组元素自加,指针不变//示例:(*p)++;//等价于*p=*p+1;p不变括号改变优先级++*p等价形式:++(*p)执行顺序:元素值先自加,后使用//示例:m=++*p;//等价于*p=*p+1;m=*p;解引用优先指针表达式运算示例指针变化m=*(p++);执行步骤:m=*p(值为1),然后p指向a[1]m=*(++p);执行步骤:先++p指向a[1],然后m=a[1](值为2)(*p)++;执行步骤:等价于a[0]++,数组元素a[0]自加一次,a[0]的值自加变为2,指针p保持不变m=++(*p);执行步骤:相当于++a[0],元素值先自加后使用值变化先取值,后移指针*p++的运算逻辑:先取当前指针指向的值,再将指针向后移动先移指针,后取值*++p的运算逻辑:先将指针向后移动,再取新位置的值*p++先取值,后移指针*++p先移指针,后取值VS指针与二维数组04二维数组的内存布局二维数组各元素在内存中按行连续存放,存放方式与一维数组并无区别inta[3][3]内存布局可视化第0行a[0][0]2000a[0][1]2004a[0][2]2008第1行a[1][0]2012a[1][1]2016a[1][2]2020第2行a[2][0]2024a[2][1]2028a[2][2]2032←连续递增,每个int占4字节→2000起始地址2032结束地址9个元素总数行地址与列地址行地址二维数组被看作元素为一维数组的一维数组行地址指向二维数组每一行(一维数组)的地址a指向a[0],a+1指向a[1],a+2指向a[2]列地址核心概念列地址指向一维数组中的具体元素在行地址基础上移动指针:a[0]+0、a[0]+1、a[0]+2转换规则:行地址前加"*"变为列地址列地址前加"&"变为行地址转换规则行地址→列地址:行地址前加"*"列地址→行地址:列地址前加"&"行地址
*⟷&
列地址二维数组地址表示方法表示形式含义类型a指向一维数组a[0],即0行首地址
行地址
a+1或&a[1]第1行的首地址
行地址
*(a+1)或a[1]或&a[1][0]第1行第0列元素a[1][0]的地址
列地址
*(a+1)+2或a[1]+2第1行第2列元素a[1][2]的地址
列地址
重要提示:只能在"列地址"前加"*"才能获得具体元素的值指针方式访问二维数组元素下标法a[1][2]最直观的数组访问形式列地址法*(a[1]+2)先取行地址再偏移列行列地址法*(*(a+1)+2)纯指针运算访问元素三种方式完全等价,编译后生成相同机器码指向二维数组元素的指针二维数组一维映射公式a[i][j]=i×
列数+j取地址指向&p=&a[i][j]解引用首行p=*a访问方式一维数组处理取地址指向指针变量名=&二维数组名[行下标][列下标];指针变量名=二维数组名[行下标];解引用首行指针变量名=*二维数组名;访问方式当指针变量指向二维数组首地址时,可将二维数组当做一维数组处理一维数组映射公式对于元素a[i][j],在一维数组中被看作i×列数+j位置上的元素二维下标转一维位置:a[i][j]=i×
列数+j训练项目:指针访问二维数组3×4数组规格12总元素数1维访问方式训练目标使用指针变量以一维数组方式访问二维数组关键代码for(i=0;i<3*4;i++)printf("%4d",*(p+i));训练内容定义二维数组
a[3][4]
和指针
*p=&a[0][0],使用指针遍历输出所有元素说明总元素个数:3×4,即行数乘以列数元素位置公式:a[i][j]
在一维数组中位置为
i×列数+j行指针变量括号、星号、方括号均不可省略()、*、[n]三者均不可省略类型名
(
*
指针变量名
)
[
n
]符号约束类型名:指针变量所指向数组的数据类型n:被指向的一维数组的元素个数(即二维数组的列数)()号、*号和[n]都不可省略示例int
(
*
p
)
[
4
]int—数据类型*p—行指针变量[4]—每行4个元素使用行指针访问二维数组等价访问方式两种遍历方式定义与初始化inta[M][N],(*p)[N]=a;*(*(a+i)+j)⇩*(*(p+i)+j)*(a[i]+j)⇩*(p[i]+j)a[i][j]⇩p[i][j]1方式一不移动行指针,使用
*(*(p+i)+j)
访问2方式二移动行指针,使用
*(*p+j)
访问后执行
p=p+1训练项目:行指针应用训练目标使用行指针遍历二维数组inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};int(*p)[4]=a;训练内容方式一不移动行指针,输出所有元素方式二移动行指针,输出所有元素预期结果两种方式输出结果相同任务实施与训练05任务实施:数组元素统计器功能要求任务目标设计C语言程序,实现指针与数组等价性的综合验证定义整型数组并初始化使用下标法输出数组所有元素使用指针递增法输出数组所有元素使用指针与下标混用法输出数组元素用指针遍历数组计算元素和用指针查找最大值和最小值演示数组名作为指针常量的特性任务实施:代码实现数组定义初始化整型数组,包含8个无序元素intarr[]={12,45,23,67,89,34,56,78};实现步骤1下标法输出使用
arr[i]
输出全部元素2指针递增法使用
*p
输出后执行
p++3指针与下标混用使用
*(p+i)
输出全部元素4指针求和遍历累加
*(p+i)5指针查找最值比较
*(p+i)
更新最大值和最小值6地址验证输出
arr
和
&arr[0]
的值证明相等六种访问方式对比arr[i]下标访问*p++指针递增*(p+i)混用方式任务实施:关键代码指针p指向数组首地址循环通过偏移量i访问元素解引用累加到sum变量首元素同时赋给max和min从i=1开始遍历比较条件判断更新最值指针求和p=arr;sum=0;for(i=0;i<n;i++){sum+=*(p+i);}指针查找最值p=arr;max=*p;min=*p;for(i=1;i<n;i++){if(*(p+i)>max)max=*(p+i);if(*(p+i)<min)min=*(p+i);}任务实施:验证结果地址验证输出
arr
和
&arr[0]
的地址值,证明数组名等于首元素地址intarr[5]={10,20,30,40,50};printf("%p",arr);//0x
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 防踩踏安全演练课件
- 非产品项目管理课件
- 妇产科素材插图课件
- 妇产科管路护理课件
- 副厨竞聘课件
- 帆船酒店英文下载课件
- 粉尘防治技术课件
- 防触电素材课件
- 粉尘爆炸整改内容课件
- 2026-2027学年初中心理健康七年级下册北师大版(2021)第十课 勇敢正视挫折课时过关卷
- 中医火熨术课件
- d级足球教练员笔试题目及答案
- 红山文化艺术中心设计规划方案
- DBJ51T062-2016 四川省旋挖孔灌注桩基技术规程
- 中职高教版(2023)语文职业模块-第五单元:走近大国工匠(二)学习工匠事迹 领略工匠风采【课件】
- QGW17991-2025《电力安全工作规程变电部分》
- 2023-2024学年广东省广州六中教育集团七年级(上)期中数学试卷
- (高清版)DZT 0216-2020 煤层气储量估算规范
- 年产40万吨纯碱搬迁改造项目环评报告书
- 《卫生监督协管培训》课件
- 《倾听技能案例》课件
评论
0/150
提交评论