版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、指 针就是地址。一、指向普通变量的指针(变量)1定义 int a; int *p; float b; float *q; char c; char *r; p=&a; q=&b; r=&c;【格式】 类型名 *指针变量名;【说明】 (1)“*”是单目运算符,是“取内容符”,但是,在定义时“*”不具备“取内容符”的含义,仅仅是指针变量的标志。(2)指针变量在使用前必须获得合法空间的地址值或空地址值(NULL)。(3)“NULL”与0和0等值使用。它是一个系统提供的符号常量,使用前必须加头文件“stdio.h”。【举例】例1、任意读入一个整数,输出它的平方。 main()int a, *p; p=
2、&a; scanf(%d,p); printf(%dn,(*p)*(*p);【法二】main()int a, *p =&a; /*定义时“*”没有取内容的含义*/ scanf(%d,p); printf(%dn,(*p)*(*p);【结论】本题中有如下等价式:(1) p与&a等价(2) *p与a等价(*p的含义是p所指空间里的值;或p所指变量的值;或取p对应空间中的值)(3) *&a与a(4) *&p与p【注意:(1)*后面只能跟地址型数据;上例的程序段可以改写成:int a, *p =&a;(2)定义时“*”只是一个标志!】二、指向一维数组的指针(变量)1定义(与指向普通变量的指针的定义格式
3、一样)【格式】类型名 *指针变量名;【举例】 int a5,*p; p=a; /* 与p=&a0;等价 */ 则有用p表示的数组a的5个元素的新方式:*p即*(p+0) a0*(p+1) a1*(p+2) a2*(p+3) a3*(p+4) a4此方式被称为“指针法”,以前的方法被称为“下标法”。【说明】当某指向数组的指针变量p加1后,指向下一个元素(注意:不是其中的地址值+1(见课本p230-231注:指向数组的指针变量也可以带下标,如pi与*(p+i)等价,))。【等价替换】*p即*(p+0) a0 p0 *a*(p+1) a1 p1 *(a+1)*(p+2) a2 p2 *(a+2)*(
4、p+3) a3 p3 *(a+3)*(p+4) a4 p4 *(a+4)2、指针的运算(1)与整数的加减运算(2)同类型的指针可以进行:赋值、减法(3)同类型的指针不可以进行加法运算(4)同类型的指针可以进行比较运算3、例题例1.main()float a3=1.5, 6.9, 9.05; float *p=a; printf(%fn,*+p);(即输出a1,此处莫与输出字符串时给出首地址相混淆,此处就是输出某个变量)输出6.9例2.main()float a3=1.5, 6.9, 9.05; float *p=a; printf(%fn,* p +);输出1.5,p指着a1。例3.main(
5、)float a3=1.5, 6.9, 9.05; float *p=a; printf(%fn,(* p )+);输出1.5(之后,a0由1.5变成2.5)例4.main()float a3=1.5, 6.9, 9.05; float *p=a; printf(%fn,+ (* p );输出2.5(a0由1.5变成2.5后再输出)【注意】 +p(p+)是合法的,但是+a(a+)不合法,因为a是数组名,是数组的首地址,是常量。【记住】(1)当一个变量被一个指针变量指着时,该变量就多了一个“名字”*指针变量(2) int a5, *p; p=&a2; 则a0又可以表示成*(p-2)只有当指针指着
6、合法的连续空间时(数组),与整数进行加减法运算才有意义。 三、指向字符串的指针1、定义(形式同普通字符型变量的指针) char *指针变量;2、如何指向一个字符串(1)定义的同时 char *p=Hello;(为什么可如此定义?*p不是地址值吗?)析:只要写出字符串常量,系统获得的信息是该串的首地址。(2)定义之后 char *p;p=Hello;(为什么可如此定义?p不是地址值吗?)先让字符串常量”Hello”“住在”内存中,再将该内存空间的首地址赋值给p。3、一维字符数组处理字符串与字符指针处理字符串的对比:(1)char *p; char a10; strcpy(p,Hello);str
7、cpy(a, Hello); 前者错,因为p未指向任何合法空间,就用strcpy函数给p所指空间赋值是危险的。后者是正确的,但要注意,在定义时要使数组具有足够的存储空间。(2)char *p; char a10; p=Hello; a=Hello; 后者错,因为a是数组名,是数组首地址,是常量,不可以出现在赋值号左边。前者是正确的,先让字符串常量占据合法的连续空间,再将该空间的首地址赋值给指针变量。(3)char *p, a10; char a10;p=a; strcpy(p, Hello);strcpy(a, Hello); 二者都正确,完全等价,都是将字符串常量赋值给数组a对应的空间,前者
8、只是先让p指向数组a对应的空间。(4)char *p, a10; char a10;p=a; p=Hello; strcpy(a, Hello); 虽然二者都正确,但后者是将字符串常量赋值给数组a对应的空间,前者只是先让p指向数组a对应的空间,然后让字符串常量占据另外合法的连续空间,再将该合法空间的首地址赋值给p,此时p已不指向数组a了。(5) 一定看笔记指针最后一点,标记p111四、二维数组及指针1、指向二维数组的指针的定义设有如下定义和赋值:int a43=1,2,3,4,5,6,7,8,9,10,11,12;int *p, (*q)3(析:此处必须加圆括号,因为方括号(即下标运算符)优先
9、级高于圆括号,若不加圆括号,那么q3首先会结合形成一个数组,);p=&a00; /*p=a0*/q=a;则有下列存储关系: p p+1 q 地址 101 103 105123456789101112 q+3前面介绍过,C语言允许将一个二维数组分解为多个一维数组来处理。因此数组a可分解为四个一维数组,即a0、a1、a2、a3,每一个一维数组又含有三个元素,因此,a0、a1、a2、a3是一维数组的名字,是对应一维数组的首地址。而C语言规定,数组名就是数组的首地址,因此,a是二维数组的首地址。&a00即p显然也是二维数组的首地址,那么与a有什么区别呢?二者的值相等,根据上图的假设,地址值均为101,
10、但p+1指向下一个元素a01,值为103,而a+1指向下一行,值为107。由此,我们通常将p称为列指针(同指向变量的指针),a称为行指针。但是a是数组名,是常量,于是,可以按如下格式定义一个二维数组对应的行指针变量:类型说明符 (*指针变量名)所指二维数组的第二维长度值;例如,上例中的q就是一个可以指向a的行指针变量。而p就可以叫做列指针了。(行指针+1则指向下一行,而列指针+1则指向下一个元素)2、二维数组元素的引用(用指针)int a43=1,2,3,4,5,6,7,8,9,10,11,12;int *p, (*q)3;p=&a00; /*p=a0*/q=a;有以上定义和赋值后:a00 *
11、p*(p+0)*q *(*(q+0)+0)aij *(p+i*3+j) *(*(q+i)+j)两大种四小种(用行指针描述更合适):qij等价aij等价*(*(q+i)+j) 等价*(*(a+i)+j)(qij等价于aij)设有上例的定义和赋值,则二维数组元素的引用如下:下标法列指针表示行指针表示a00*p或p0*q或*(*(q+0)+0)或q00a01*(p+1)或p1*(*(q+0)+1) 或q01a02*(p+2)或p2*(*(q+0)+2) 或q02aij*(p+i*3+j)或pi*3+j*(*(q+i)+j) 或qija32*(p+11)或p11*(*(q+3)+2) 或q32【识别技
12、巧】由上图可以发现:行指针加上一个*或一个即为列指针,列指针加上一个*或一个即为二维数组的一个元素。反之,二维数组的元素去掉一个*或去掉一个或加上一个&即为列指针,列指针去掉一个*或去掉一个或加上一个&即为行指针。(理解见笔记)五、指针数组若一个数组的元素值为指针则是指针数组。指针数组的所有元素都必须是具有相同存储类型和指向相同数据类型的指针变量。指针数组的定义说明形式为:类型说明符 *数组名常量表达式;其中类型说明符为指针值所指向的变量的类型。指针数组常用来表示一组字符串,这时指针数组的每个元素被赋予一个字符串的首地址。例如:对5个已知串排序(降序)。#include#includemain
13、()char *p5=Hi,C,bye,God,save; int i,j; char *t; for(j=1;j=4;j+) for(i=0;i=4-j;i+) if(strcmp(pi,pi+1)0) t=pi;pi=pi+1;pi+1=t; for(i=0;i5;i+) puts(pi);【注意】指针数组与二维数组的行指针变量的区别。二维数组的行指针变量是单个的变量,其定义形式中“(*指针变量名)”两边的括号不可少。而指针数组表示的是多个指针,其定义形式中“*数组名”两边不能有括号,这样,由于的优先级高于*,“数组名常量表达式”首先被认定为数组。六、二级指针如果一个指针变量存放的又是另一
14、个指针变量的地址,则称这个指针变量为指向指针的指针变量,又称二级指针。定义格式如下: 类型说明符 *指针变量名;例如:int x,*p, *r; p=&x;/*p又叫一级指针*/ r=&p;二级指针变量的值必须是某个一级指针变量的地址,二级指针变量可以通过赋值方式指向某个一级指针变量,赋值格式如下:二级指针变量=&一级指针变量例如,有如下定义和赋值:int a,*p,*q;p=&a;q=&p;则有: *p等价于a;*q等价于p;*q即*(*q)等价于a。【总结】例1、指向普通变量的指针int a,*p=&a;float b,*q;q=&b;有*p等价于a,p等价于&a例2、一维(元素=普通变量)int a5,*p;p=a;pi-ai-*(p+i)-*(a+i)例3、二维(元素=普通变量)int x23,*p,(*q)3;p
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年医院医保科工作总结(二篇)
- 2025年大连市公安局面向社会公开招聘警务辅助人员348人备考题库及答案详解1套
- 2025年威海市检察机关公开招聘聘用制书记员31人备考题库及一套答案详解
- 2025年锡林郭勒盟应急管理局关于公开招聘驻矿安全生产监管专家的备考题库及完整答案详解一套
- 学校召开《安全隐患大排查大整治百日攻坚专项行动》部署会议
- 2025年浙江大学中国农村发展研究院招聘备考题库有答案详解
- 国家知识产权局专利局专利审查协作四川中心2026年度专利审查员公开招聘备考题库及答案详解一套
- 2024年揭阳市揭西县公安局招聘警务辅助人员考试真题
- 2025年复旦大学脑智研究院招聘办公室行政助理岗位备考题库及1套参考答案详解
- 2026年河北沧州市第四医院招聘卫生专业技术人员考试重点题库及答案解析
- 买院子合同协议书
- 高二化学(人教版)试题 选择性必修一 模块质量检测(二)
- 癫痫常见症状及护理培训课程
- (新教材)2025年部编人教版三年级上册语文第七单元复习课件
- 小学语文板书基本功培训
- 2025甘肃酒泉市公安局招聘留置看护岗位警务辅助人员30人(第三批)考试笔试参考题库附答案解析
- 测绘安全生产作业规范
- 安全生产先进评选方案
- 国开《广告调查与预测》形考作业1-4答案
- 别墅物业费代缴合同协议2025年规定
- 2025年中级会计财务管理真题及答案
评论
0/150
提交评论