




已阅读5页,还剩42页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第五章 指针 教学目标教学目标 理解指针和地址的概念理解指针和地址的概念 掌握指针定义与指针运算掌握指针定义与指针运算 了解空指针和了解空指针和voidvoid指针指针 了解常量指针和指针常量了解常量指针和指针常量 理解指针与数组的关系理解指针与数组的关系 掌握指针与字符串掌握指针与字符串 掌握指向指针的指针掌握指向指针的指针 教学内容教学内容 l内存与内存地址 l内存中变量的存储 l指针变量的定义与引用 l空指针和void指针 l指针运算 l常量指针和指针常量 l指针与数组 l指针与字符串 l指向指针的指针 内存(1) 内存: 内存是计算机中存储程序以及数据的地 方。 位(bit)是计算机表示信息的最小单位。 内存是由一系列连续的存储单元组成, 其中的每一个存储单元我们称为“字节”。 字节(byte)是最基本的存储单元单元。 内存(2) 内存地址: (1)存储单元的“编号”就是该存储单元在 内存中的地址,它是从0开始的。 (2)每个存储单元的编号都是唯一的。 (3)存储单元的编号采用一个十六进制数 。 例如64kB内存的地址为0000HFFFFH 内存中变量的存储 变量的直接访问 通过变量名访问内存单元的方式称为“直接访 问”。 例如: int i=3,j=4,k=4; k=k*j的执行过程是: (1)取得变量k,j的地址2004H,2002H。 (2)将地址2004H,2002H的值取出,然后相 乘。 (3)将相乘后的结果放到地址2004H开始的 内存单元中。 变量的间接访问 引入指针变量,用来保存变量的地址。 定义指针变量: 类型 *指针变量名; 获得变量地址: (单目运算符 int *p = 使用指针变量,间接访问内存变量: k=*p; 指针变量示例1 Tc中 指针变量示例2 一个指针变量在内存中占两个字节(small模式编译)tc 一个指针变量在内存中占四个字节(32位机器上) vc Float i=3.1 p=4.2 k=5.3 Float *fp= (2)定义指针变量,将变量地址赋值给指针 变量 int i=3; int *p; p = 指针变量的定义与操作(2) (3)将整数值赋值存放到指针变量指向的内存地址 int i=3; int *p = *p=5;/相当于* (4)将整型变量的值存放到指针变量指向的内存地址 int i=3,j=7; int *p = *p=j;/相当于* *运算符与 px=x; /在VC中会出现警告提示。 2、指向同一种数据类型的指针变量之间可以相互赋值 而指向不同数据类型的指针变量之间不可以相互赋值。 int a,*p1,*p2; int a,*p1; float *p2; p1= p1= p2=p1; p2=p1 ; /在VC中会出现“类型不一致”的警告提示。 3、指针变量与普通变量一样, 也可在定义的同时赋初值 。 int x,y; int *px= 将已定义变量x的 地址赋给指针变量px; 空指针 (1)什么是空指针? 不指向任何实际的对象或者函数的指针为空指 针。 (2)将指针初始化为空指针,这不是说指针的存储 单元为空,而是给指针赋予一个 ASCII码值为0的字符 NULL。 例如:char *p=NULL; (3)将指针变量(p1,p2,p3,p4)进行如下操作,皆可以 使得指针成为空指针: p1 = 0;p2 = 0L;p3 = 0; p4=(void*)0; void指针 (1)指向void的指针为void指针。 (2)因为没有对象的类型是void,所以void指针又称为 万能指针。 (3) void指针示例: (指针类型的强制转换) int i=3; int *p1= float *fp,f1=3.1f; int *p4=(void*)0; void *pvoid; pvoid=p1; printf(“int: pvoid=%dn“,*(int*)pvoid); fp= pvoid=fp; printf(“float:pvoid=%fn“,*(float*)pvoid); 输出结果3;3.10000 代码阅读与分析 示例1 例1:阅读分析程序 #include int main() int a=10,b; int *ipa; *ipa=a; /编译警告,运行出错!指针未初始化 /ipa= b=*ipa; printf(“%dn“,b); a=100; b=*ipa; printf(“%dn“,b); return 0; 代码阅读与分析 示例2 例1:阅读分析程序 main() int *px,x,y; x=10; *px=x; y=*px; x=20; y=*px; printf(“x=%d,y=%d”,x,y); 该程序执行后输出:x=20, y=10 点评: (1)由于指针px没有 赋初值,并不指向变量 x,所以x改变后,y的 值并没有改变。 (2)如果把*px=x;改 为*px=,则最后的y 值为20 取地址运算( 则 printf(“取得整型变量的地址: printf(“取得指针变量的值: px = %xHn“,px); /%x以16进制形式输出无符号整数 printf(“先取得指针变量px指向的整型变量,然后取得 该整型变量的地址: printf(“先取得整型变量x的地址,然后取得该地址在 内存中的存储内容: *( return 0; 指针与整数的加减运算 指针变量加上或减去一个整数n,是指针由当前所指向的 位置向前或向后移动n个数据的位置。 如果p是一个指针,n是一个正整数,p+n操作后的实 际地址是: p+n*sizeof(数据类型) (sizeof为系统函数) 例:假设指针的当前地址值为:p=2000,q=2400 main() int *p; float *q; printf(“%x,%xn”,p,q); printf(“%x,%xn”,p+=1, q+=1); 注意:VC中short为2字节,int为4字节。 指针自增(自减)运算 指针自增(自减)运算是地址运算。指针自增 (自减)后指向下一个(上一个)数据。 要注意指针自增(自减)运算的优先级。 注意下面两个表达式的意义: x=(*p)+; 将目标变量*p的值赋给变量x ,然后变量*p自增1。 x=+(*p); 将目标变量*p的值自增1后赋给 变量x。 另外,注意*p+,*(p+)与*(+p)的用法区别 指针自增(自减)运算-示例 #include int main() int a = 1,2,3,4,5,6,7; int *p=a; printf(“*(p+) = %dn“,*(p+) ); printf(“*p = %dn“,*p ); printf(“*(+p) = %dn“,*(+p) ); printf(“*p = %dn“,*p ); printf(“(*p)+ = %dn“,(*p)+ ); printf(“*p = %dn“,*p ); printf(“+(*p) = %dn“,+(*p) ); printf(“*p = %dn“,*p ); printf(“p-a = %dn“,p-a ); printf(“*(p+3) = %dn“,*(p+3) ); printf(“*(p-2) = %dn“,*(p-2) ); return 0; 运行结果: 1 2 3 3 3 4 5 5 2 6 1 指针相减运算 (1)两个指向同种数据类型的指针可以相减。 (2)指向同一数组的两个指针相减,其差为这 两个指针所指向的数组元素之间所相差的 元素个数。 (3)指针相减不是两个指针值的单纯相减,而 与数据类型的存储长度有关。 运算结果为: 两指针地址值之差 / 一个数据项存储字节数 指针的关系运算 两个指向同种数据类型的指针可以作关系运算,表示它们 所指向的地址之间的关系。 指针间允许4种关系运算: 比较两指针所指向地址的大、小关系 =、 != 判断两指针是否指向同一地址 若p指针指向的地址小于q指针指向的地址:p int main() int a10=9,8,7,6,5,4,3,2,1,0,*p; int i; /数组名a是一个指针常量,指向a0的地址,不允许a+;a+=1; /ai是一个变量名,代表数组a的第i个存储单元 p=a; printf(“*(a+5)= %dn“,*(a+5); printf(“a5= %dn“,a5); printf(“*(p+5)= %dn“,*(p+5); printf(“p5= %dn“,p5); return 0; 指针和一维数组示例1 #include int main() int a10=9,8,7,6,5,4,3,2,1,0,*p; /数组名a是一个指针常量 int i;p=a; for(i=0; i int main() int i=0,j=0; char s130,s230,*p1,*p2; scanf(“%sn%s“,s1,s2); while(s1i!=0) i+; while(s2j!=0) s1i+=s2j+;/*将s2合并到s1的后面 */ s1i=0;/*对合并后的字符串s1设置结 束标志*/ printf(“%sn“,s1); return 0; 用数组名 #include int main() int i=0,j=0; char s130,s230,*p1,*p2; scanf(“%sn%s“,s1,s2); p1=s1; p2=s2; printf(“ s1 = %sn“,p1); printf(“ s2= %sn“,p2); while(*p1!=0) p1+;/*把指针移到s1字符串的未尾 */ while(*p2!=0) *p1+=*p2+;/*将s2合并到s1的后面*/ *p1=0; /*对合并后的字符串s1设置结 束标志*/ printf(“ s1+s2 = %sn“,s1); return 0; 用指针 指针数组示例 # include main( ) char *str =“turbo c“, “ turbo pascal“, “basic“, “dbase“, “lisp“, “fortran“; int i,j; char *temp; for(i=0;i0) temp=stri; stri=strj; strj=temp; /*选择法排序*/ for(i=0;i*(p+j) temp=*(p+k); *(p+k)= *(p+j); *(p+j)=temp; /int i; for(i=0;i10;i+)printf(“%7.2f”,*(p+i); printf(“n”); for(k=0;k10;k+) if(k%5=0)printf(“n”); printf(“%7.2f”,*p+); 例输入两个字符串,从第一个字符串中删去所有第二个 字符串中相同的字符。 main( ) char *p1,*p2,s130,s230; int j,i; scanf(“%sn%s”,s1,s2); p1=s1;p2=s2; for(i=0;*(p2+i)!=0;i+) for(j=0;*(p1+j)!=0;j+) if
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 宁都钢质防火窗施工方案
- 架空建筑垃圾分类方案设计
- 中式建筑排版配色方案设计
- 在全县干部大会的主持词
- 地下室顶板渗漏处理方案
- 双层宴席厅建筑方案设计
- 2025年经济师初级考试 经济基础知识核心考点模拟试卷
- 贵州省茶产业发展现状研究
- 其他收入分享协议的注意事项
- 2025年北京市纪委市监委所属事业单位招聘8人笔试备考题库参考答案详解
- 《上海市幼儿园办园质量评价指南(试行)》
- 9.《复活(节选)》课件 统编版高二语文选择性必修上册
- 2025-2030中国成品润滑剂行业市场发展趋势与前景展望战略研究报告
- 《城乡规划管理与法规系列讲座课件-土地利用与建设规范》
- 保密警示教育典型泄密案例教育学习
- GB/T 45451.1-2025包装塑料桶第1部分:公称容量为113.6 L至220 L的可拆盖(开口)桶
- 道路货物运输经营申请表
- 大件运输安全生产管理制度文本
- 项目人员考核管理制度
- 生病学生上学协议书
- 社区用房使用协议书
评论
0/150
提交评论