




已阅读5页,还剩4页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
指针程序设计 第一讲内容说明主要内容重点难点问题提出1指针与指针变量的概念2变量指针、一维数组指针、字符串指针3指向变量、数组、字符串的指针变量重点:变量指针和一维数组指针主要针对一维数组重点讲解通过此图讲解变量与地址的关系通过例子说明指针变量的定义和初始化应注意的问题1 指针的概念2 变量指针和一维数组指针3指向变量、一维数组的指针变量1变量指针和一维数组指针的引用2指向变量、一维数组的指针变量的引用定义变量时,系统会为变量开辟相应数量的内存单元存储数据,是否可以通过内存单元对应的内存地址来访问内存单元中存储的数据呢?如果可以的话,如何来实现呢?一、间接访问与直接访问举例:打开A抽屉方法直接访问:将A钥匙带在身上,需要时直接打开间接访问:将A钥匙放在B抽屉,需要时,打开B抽屉取出A钥匙,打开A抽屉。二、指针与地址1什么是指针定义:指针就是地址。2内存单元和地址内存单元地址:计算机内部存储器由很多内存单元组成,每个内存单元都有自己唯一的地址编码,称内存单元地址。3变量与地址当一个变量只占用一个内存单元时,内存单元的地址就是变量的地址;当变量占用连续的若干个内存单元时,最前面一个单元的地址就是该变量的地址。例:int i=3;float f;内存单元地址 整型变量i2001 32002。 2008 单精度变量f20092010变量i的地址:2001,变量f的地址:2008由于地址起到寻找操作对象的作用,像一个指向对象的指针,所以常把地址称为“指针”。4数组与地址数组元素要占用连续的内存单元。数组类型不同,每个数组元素占用的内存单元数也不同。数组占用的总单元数=数组长度每个数组元素占用的内存单元数。数组元素ai的地址=数组首地址+i数组元素的数据类型所占用的内存单元数例:int a3=1,2,3;地址内存单元 13000300130023003300430053006 整型数组元素a0 2 3 整型数组元素a1 整型数组元素a2三、指针变量1什么是指针变量定义:存放内存地址的变量称为“指针变量”。2指针变量的定义和初始化指针变量在使用前必须定义,定义的同时可以赋初值。【格式】存储类型 数据类型 *指针变量名1=初值1,;【功能】定义指向指定“数据类型”或数组的若干个指针变量,同时给这些变量赋初值。例:int a;int *p=&a;float f1,f10,*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数组名i2指向一维数组的指针变量的运算(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 a34=1,3,5,7,9,11,13,15,17,19,21,23;二维数组a34可看成由3个一维数组a0、a1、a2组成,每个一维数组由4个元素组成。如下图所示。2313579131115171921a0a1a2aa+1a+2a0a0+1a0+2a0+323a代表二维数组首元素的地址,a0、a1、a2是一维数组名,而C语言规定数组名代表数组首元素的地址,即a0等价于&a00、a1等价于&a10、a2等价于&a20。2、使用指针表示二维数组元素进一步分析:a0等价于&a00,a0+1等价于&a01,a0+2等价于&a02,a0+3等价于&a03。因为a0和*(a+0)等价,a1和*(a+1)等价,ai和*(a+i)等价,因此:a0+1等价 *(a+0)+1等价 &a01a1+2等价 *(a+1)+2等价 &a12注意:不要将*(a+1)+2 错写成*(a+1+2)。进一步分析:因为&a01等价a0+1等价 *(a+0)+1,那么*(*(a+0)+1)或*(*a+1)等价a01的值。*(ai+j)或*(*a+i)+j)等价aij的值二、如何使用指针变量指向二维数组?当定义了二维数组和同类型的指针变量后,可使这个指针变量:指向二维数组的首地址指向二维数组中某个一维数组指向二维数组的某个数组元素1指针变量指向二维数组的某个元素(1)让指针变量指向二维数组的某个元素的方法初始化:数据类型 *指针变量=&数组名下标1下标2赋值:指针变量=&数组名下标1下标2(2)二维数组元素的引用方法 *指针变量【例1】输入2行3列的矩阵元素,存入二维数组,再按行列格式输出main()int a23,*p,i,j; for (i=0;i2;i+) for (j=0;j3;j+)p=&aij;scanf(“%d”,p); for (i=0;i2;i+) printf(“n”);for (j=0;j3;j+) p=&aij;printf(“%10d”,*p); 2指针变量指向二维数组的首地址(1)让指针变量指向二维数组首地址的方法初始化: 数据类型 *指针变量=二维数组名 数据类型 *指针变量=&二维数组名00赋值: 指针变量=二维数组名 指针变量=&二维数组名00(2)二维数组元素的引用方法 *(指针变量+i*列数+j)【例2】使用指向二维数组首地址的指针变量重编上个例1main()int a23,*p,i,j; for (i=0;i2;i+) for (j=0;j3;j+)scanf(“%d”,p+i*3+j); for (i=0;i2;i+) printf(“n”);for (j=0;j3;j+)printf(“%10d”,*(p+i*3+j); 3指针变量指向二维数组中某个一维数组(1) 让指针变量指向二维数组中某个一维数组的方法步骤:定义指针变量 数据类型(*指针变量)m 说明:m是二维数组的列长该指针变量体现不出二维数组“维”的概念。注意scanf注意printf该指针变量体现了二维数组“维”的概念。用初始化或赋值方法将指针变量指向二维数组的首地址数据类型 (*指针变量)m=二维数组名 (初始化) 指针变量=二维数组名 (赋值)注意:( )不能丢,不能写成“*指针变量m”; 运算符高于*二维数组中第i行对应的一维数组首地址的表示 *(指针变量+i)(2)二维数组元素的引用方法数组元素地址:*(指针变量+行下标)+列下标数组元素引用:*(*(指针变量+行下标)+列下标)其中:*(指针变量+行下标)是行下标对应的一维数组的首地址。例:int a23,(*p)3=a;说明:定义二维数组a23和指向具有3个元素的一维数组指针变量p,并使p指向二维数组a的首地址。对应二维数组中2个一维数组的首地址表示如下:二维数组中的一维数组 指针变量表示一维数组的首地址a0 *(p+0)a1 *(p+1)二维数组元素的引用格式:数组元素 a00 a01 a02引用格式 *(*(p+0)+0) *(*(p+0)+1) *(*(p+0)+2)数组元素 a10 a11 a12引用格式 *(*(p+1)+0) *(*(p+1)+1) *(*(p+1)+2)【例3】用指向二维数组中一维数组的指针变量重新编写例1main()int a23,(*p)3=a;int i,j; for (i=0;i2;i+) for (j=0;j3;j+)scanf(“%d”,*(p+i)+j); for (i=0;i2;i+) printf(“n”);for (j=0;j3;j+)printf(“%10d”,*(*(p+i)+j); 三、如何使用指针处理函数问题难点1指针变量做函数参数函数的参数可以是整型、浮点型、字符型、指针类型的数据。指针类型做函数参数的作用是将一个地址值传送到函数中。【例4】编写一函数,通过函数调用显示一个字符串。Main() void disp(); char *p=”C is a programming language.”; disp(p); void disp(char *q); printf(“%sn”,q);2. 返回值为地址当函数返回指针类型数据时,应当在定义函数时对返回值的类型进行说明。比较int (*fp)();和int *fp();格式:基本类型 *函数名(形式参数表)3指向函数的指针变量的定义类型说明符 (*指针函数的指针变量名)( );例如:int (*fp)( ); 注意:( )不能省略4用指向函数的指针变量调用函数方法:(1)将函数的入口地址(函数名)赋给指向函数的指针变量(2)用指向函数的指针变量(连同圆括号)代替函数名使用四、指针数组1定义:当某个数组被定义为指针类型,称该数组为指针数组。注意:指针数组是指针类型的,对其元素所赋的值必须是地址值。格式:存储类型 数据类型 *指针数组名 长度=初值例如:int a,b,c,*p3=&a,&b,&c;定义指针型数组p,其3个元素p0、p1、p2分别指向a,b,c。2指针数组元素的引用引用方法和普通数组元素的引用方法完全相同,可利用它来引用所指向的普通变量或数组元素,可对其赋值,也可参加运算。【例5】输入5个字符串存入一个二维数组中,定义一个指针数组,使其元素分别指向这5个字符串并输出。main() char s520,*p5;int i; for (i=0;i5;i+) pi=si; for (i=0;i5;i+) scanf(“%s”,pi); for (i=0;i5;i+) printf(“%sn”,pi);【例6】输入a和b两个整数,调用函数swap对a,b从大到小排序,然后输出。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(“
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年低压电工操作证模拟考试复审题库及答案
- 识测试题及答案
- 电工(初级工)测试题+答案
- 2025全国企业员工全面质量管理知识竞赛题库(含答案)
- 2025河北省社区《网格员》模拟试题(含答案)
- 北京少儿乐理知识培训班费用课件
- 标准化销售流程课件
- (2025)医疗护理员理论考试试题含答案
- 柴油发动机基础培训课件
- 查验业务知识培训课件
- 成人急性淋巴白血病
- 新职员工安全培训
- 给公司老总培训财务知识
- 混凝土现浇楼板协议书(2篇)
- 机械通气:异常波形解读
- 初中数学教学经验分享
- 剑桥KET口语题库(含满分答案)
- DB13-T 5997-2024 公路桥梁混凝土结构裂缝处治施工技术规范
- 专题11初高衔接之计算补充练习新高一数学暑假衔接与新课重难点预习(人教A版2019)
- 12D401-3 爆炸危险环境电气线路和电气设备安装
- 涉县中小学教师招聘考试真题2023年
评论
0/150
提交评论