版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第八章C语言程序设计何宾2023.08指针C251编译器支持使用*字符声明变量指针C251编译器可用于执行标准C中可用的所有操作指针
--指针声明中的存储器类型可以在指针声明中使用存储器类型来定义指针的大小没有显式存储器类型的指针称为通用指针具有显式存储器类型的指针称为存储器特定指针特定于存储器的指针为每个变量访问生成更高效的代码指针
--指针声明中的存储器类型声明指针的规则变量声明指针大小(位)指针声明charc;16/32char*ptr;(指针大小取决于使用的存储器模型)intnearnc;16intnear*np;floatdatadf;8floatdata*dp;或floatnear*dp;charidataindex;16charidata*ip;或charnear*ip;longxdatax;16longxdata*xp;指针
--指针声明中的存储器类型变量声明指针大小(位)指针声明constcharcodec=’A’;16charcode*cp;/*可以忽略const*/constcharnearn=5;16charnear*np;/*可以忽略const*/unsignedlongfarl;32longfar*lp;charhugehc;32charhuge*hp_ptr;voidnearfunc1(void);16void(near*fp1)(void);intfarfunc2(void);32int(far*fp2)(void);指针
--指针声明中的存储器类型指向data或idata对象的指针可以使用near存储器类型声明因为near指针也可以访问data或idata存储器在TINY和XTINY存储器模型中,默认指针大小为16位,指针的默认存储器类型为near*要访问0x010000以上的存储器区域,必须在指针声明中指定存储器类型为far*或huge*
使用far或者huge指针,可以寻址near、data或idata对象。不同之处在于far或huge指针访问使用@DPk指令,然而near指针使用更高效的@WRj指令far或huge对象不能用near指针寻址指针
--指针声明中的存储器类型下面给出一些使用例子:charnear*px;声明一个指针,该指针引用near存储器类型中char类型的对象。指针本身保存在默认存储器类型中(取决于使用的存储器模型)。大小为两个字节charnear*datapdx;该声明与先前的声明相对应,只是指针本身被明确地放置到数据存储器(data)中,而与使用中地存储器模型无关int(*xdatafp)(void);该声明定义了函数指针,该函数指针被显式放置到xdata存储器类型中,而与使用地存储器模型无关。所寻址的函数的类型为voidfunc(void)指针
--指针声明中的存储器类型structtime{charhour;charmin;charsec;structtimenear*pxtime;};除了其他元素之外,该结构还包含指向另一个结构的指针pxtime,该结构必须位于near存储器类型中。指针pxtime的大小为两个字节指针
--指针声明中的存储器类型
structtimefar*ptime;该声明定义了一个指针,该指针保存在默认的存储器类型中,并引用位于far存储器类型中的structtime。指针ptime需要四个字节ptime->pxtime->hour=12;使用前面的两个声明。指针pxtime是从结构间接加载的。它指向structtime,位于near存储器类型。将值12分配给该结构的成员hour指针
--指针转换C251编译器可以转换指针的存储器类型指针转换可以由使用类型强制转换的显式程序代码强制执行,也可以由编译器强制执行通用指针与TINY或XTINY存储器模型的near*指针定义相同。对于所有其他存储器模型,通用指针与far*指针定义相同指针
--指针转换当存储器特定指针作为参数传递给需要通用指针的函数时,C251编译器将存储器特定指针转换为通用指针C251运行时库函数(如printf、sprintf和gets)的情况就是如此,这些函数使用通用指针作为参数例如:指针
--指针转换externintprintf(void*format,...);externintmyfunc(voidnear*p,intdata*dq);intdata*dp;constcharnear*fmt="value=%d|%04XH\n";voiddebug_print(void){printf(fmt,*dp);//转换fmtmyfunc(fmt,nx);//没有转换}指针
--指针转换在对printf的调用中,表示2字节near指针的参数fmt被自动转换成强制为通用指针这样做是因为printf的原型需要一个通用指针作为第一个参数。根据存储器模型,通用指针的大小为2个字节或4个字节注:在TINY或XTINY存储器模型中,无法使用标准C251运行时库函数访问0x010000以上的存储器位置。因此,printf的格式字符串必须声明为constcharnear。如果将格式字符串声明为charcode(如C51程序中所做的那样),则printf仅适用于SMALL、XSMALL或LARGE存储器模型由于将地址空间看作是线性实体,因此指针转换主要通过扩展或截断指针的高位部分完成指针
--指针转换转换指针所涉及的过程转换类型功能描述far*到code*far*的低位字(2个字节)用作偏移量,丢弃高阶字far*到data*far*到idata*far*的低位字用作偏移量far*到near*far*的低位字(2个字节)用作偏移量far*到xdata*far*的低位字(2个字节)用作偏移量far*到pdata*far*的低位字用作偏移量code*到far*far*的高位字设置code的基地址(默认0xFF)。使用code*的2字节偏移量指针
--指针转换转换类型功能描述idata*到far*data*到far*对于idata/data,far*的高位字设置为0x00。Idata*/data的1字节偏移量被转换为无符号整数,并用作低位字near*到far*对于near,far*的高位字设置为0x00。near*的2字节偏移用作低位字xdata*到far*far*的高位字设置为xdata的基地址(默认1)。xdata*的2字节偏移用作低位字pdata*到far*far*的高位字设置为xdata的基地址(默认1)。偏移的高位字节设置pdata的页。pdata*的1字节偏移用作偏移的低位字节near*到data*near*到idata*只有near*指针的低位字节用作偏移data*到near*idata*到near*idata*/data*的1字节偏移转换为unsignedint,以及用作near*指针的偏移注:在表中没有列出来的所有指针转换都是非法的,在编译时会产生警告信息设计实例(一)声明和使用指针的C语言描述#include"stdio.h"//包含头文件stdio.h#include"reg251s.h"//包含头文件reg251s.hvoidmain()//定义main主函数{volatileinta,b;//声明整型变量a和bvolatileintedata*p2;//声明指针变量*p2,带有存储器类型volatileint*p3;//声明指针变量*p3SCON=0x52;//初始化串口寄存器SCONTMOD=0x20;//初始化串口寄存器TMODTCON=0x69;//初始化串口寄存器TCON
TH1=0xF3;//初始化串口寄存器TH1设计实例(一)scanf("%d,%d",&a,&b);//调用scanf函数,输入变量a和b的值p2=&a; //通过取地址符号‘&’,使得指针p2指向变量aprintf("(*p2)=%d\n",*p2);//调用printf函数,显示*p2的内容printf("&p2=%p\n",&p2);//调用printf函数,显示指针对象*p2的地址printf("&a=%p\n",&a);//调用printf函数,显示变量a的地址p3=&b;//通过取地址符号’&’,使得指针p3指向变量bprintf("(*p3)=%d\n",*p3);//调用printf函数,显示*p3的内容printf("&p3=%p\n",&p3);//调用printf函数,显示指针对象*p3的地址printf("&b=%p\n",&b);//调用printf函数,显示变量b的地址while(1);//无限循环,用于设置断点的位置}设计实例(一)设计实例(二)【例8-11】不同指针类型转换的C语言描述(一)#include"stdio.h"//包含头文件stdio.h#include"reg251s.h"//包含头文件reg251s.hvoidmain()//定义main主函数{ volatileintxdataa;//声明整型变量a,位于xdata空间 volatilecharxdatab;//声明字符型变量b,位于xdata空间volatileintfar*p2;//声明整型指针变量*p2,类型为far volatilecharfar*p3;//声明字符型指针变量*p3,类型为far
SCON=0x52;//初始化串口寄存器SCONTMOD=0x20;//初始化串口寄存器TMODTCON=0x69;//初始化串口寄存器TCON
TH1=0xF3;//初始化串口寄存器TH1设计实例(二)scanf("%d",&a);//调用函数scanf输入整型变量a的值 b=getchar();//调用函数getchar输入字符型变量b的值p2=&a; //指针*p2指向变量a printf("(*p2)=%d\n",*p2);//调用函数printf打印指针变量*p2的值 printf("&p2=%p\n",&p2);//调用函数printf打印指针变量*p2的地址 printf("&a=%p\n",&a);//调用函数printf打印整型变量a的地址 p3=&b;//指针*p3指向变量b printf("(*p3)=%d\n",*p3);//调用函数printf打印指针变量*p3的值 printf("&p3=%p\n",&p3);//调用函数printf打印指针变量*p3的地址 printf("&b=%p\n",&b);//调用函数printf打印字符型变量b的地址 while(1);//循环,用于设置断点}设计实例(三)【例8-12】不同指针类型转换的C语言描述(二)#include"stdio.h"//包含头文件stdio.h#include"reg251s.h"//包含头文件reg251s.hvoidmain()//定义main主函数{volatileintedataa[4]={1,2,3,4};//定义整型数组变量a,在edata空间/*定义字符数组变量b,位于xdata空间*/volatilecharxdatab[]="helloworld\n";volatileintnear*pnum;//定义指针变量*pnum,位于near空间volatilecharfar*pstr;//定义指针变量*pstr,位于far空间volatileinti=0;//定义并初始化整型变量iSCON=0x52;//初始化串口寄存器SCON
设计实例(三)TMOD=0x20;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 生物活性肽益生菌羊奶粉:制备工艺、稳定性及功能性探究
- 2026年河南省新乡市事业单位公开联考招聘702人备考题库附答案详解(综合题)
- 生物柴油基微乳液:多环芳烃污染土壤淋洗修复的创新策略与实践
- 生物制药领域hFⅧ灌流培养工艺的深度开发与创新应用研究
- 2026四川巴中市巴州区选用社区工作者(专职网格员)27人备考题库含答案详解(培优)
- 2026遵义医科大学附属医院高层次人才引进127人备考题库附答案详解(精练)
- 2026安徽铜陵铜官区西湖医院招聘编外工作人员5人备考题库附答案详解(能力提升)
- 2026北京对外经济贸易大学非事业编人员招聘2人备考题库附答案详解(培优b卷)
- 2026贵州毕节大方富民村镇银行招聘备考题库含答案详解
- 2026年度春季安徽国风新材料股份有限公司招聘129人备考题库附答案详解(基础题)
- 2025年辽宁省中考数学真题及答案
- 2026年德州中考信息技术考试试题及答案
- 厦门大学附属第一医院促进科技成果转化管理办法(试行)
- 兰州热力集团有限公司招聘笔试题库2026
- 操作工人岗位责任制度
- 2025年团干素质大赛笔试及答案
- 社区信访培训
- GB/T 19466.1-2025塑料差示扫描量热(DSC)法第1部分:通则
- 上海拆迁合同范本
- 高速铁路轨道施工与维护课件 2.无缝线路养护维修
- 钢筋加强施工方案
评论
0/150
提交评论