keil中的指针分为两种,一种是普通指针,兼容标准C语言的指针;另一种是我翻译成内存特殊指针(memory-specific pointers,翻译的不好:>)

  

  一、普通指针

  普通指针的定义方式如下, char * ptr;   跟标准C的定义方式一样。这种指针占三个字节。第一个字节是标识存储类型,是指针指向的变量的数据类型。 第二个字节是指针存储地址的高位字节。第三个字节是指针存储地址的低位字节。

  普通指针默认存储在内部存储器data,即片上RAM。如果想指定指针的存储位置,可以在 * 后加上存储类型,如下面几种定义方式:

char * data  ptr;     //与char * ptr;等价,即默认的定义方式
char * xdata ptr;     //指针存储在片外RAM
char * idata ptr;     //指针存储在idata
char * pdata ptr;     //指针存储在pdata

  由定义普通指针写的程序最终的代码较长,运行速度相对较慢,因为keil在编译的时候不知道这个指针将要指向的变量的数据类型,只有当程序执行的时候才能知道,所以编译器不能对这段代码进行优化,不过,这样做的优点是,此指针可以指向存储在任何位置的变量。

  二、内存特殊指针

  内在特殊指针的定义方式为:

  char xdata * ptr;

  这个指针存储的时候占的字节数是不一定的,占一个字节的变量类型为:idata,data, pdata, bdata。占两个字节的变量类型为: code,xdata。下图是我在keil上测试的时候截的图:

  注意:

  char xdata * ptr;

  这里定义的ptr所指向的变量存储在xdata中,即外部变量,这样的话指针变量ptr占两个字节,我们再定义一个外部变量。

  char xdata variable1;
  ptr=&variable1;        //这样是正确的。

  这段程序中,变量variable1是存储在外部存储器中的,是最合适的。

    char data variable2;
     ptr = &variable2;

  变量variable2存储在片内存储器中。一个字节的指针即可以够用,不过这样写程序也不算错,我试过keil也能运行。像普通指针一样,定义内存特殊指针时也可以指定指针的存储位置。

  char xdata * data ptr;

  这个定义是说,定义了一个指向(存储在xdata)变量的一个(存储在data)的指针

  内在特殊指针产生的代码可以经过编译器优化,运行速度较快。因为指针指向变量的存储位置是知道的,所以编译器在编译的时候可以进行优化。这样程序通过最简洁的方式去寻址,但是代价是降低了程序的灵活性。

  三、指针类型转换

  编译器在适当的时候对指针的类型进行转换。如进行参数传递的时候。如下面这个外部函数声明printf中的形参ptr是一个变通指针,编译器为函数分配三个字节

extern void printf(char  * ptr);
char data  * ptr1 ;
char xdata * ptr2 ;

voia main(void)
{
    printf(ptr1);       //这样在参数传递的时候转换
    printf(ptr2);       //未转换
}

  在第一个printf()调用中,实参是指向data,占两个字节。但是函数原型中形参是变通指针,占三个字节。这样,参数传递的过程中将ptr1扩展了成三个字节再传递。

  注意:为了防止在传递参数的时候造成类似的指针类型错误。在调用函数前,最好进行必要的外部函数声明(extern ...)或引用相应的头文件(#include ...)或者在函数调用填写参数的时候加上数据类型转换。这样就有两种的转换方式。
  1、形参为普通类型,实参为内存特殊类型:补充第一个字节为相应的数据类型代码。高位地址没有的补充第二字节为0
  2、实参为内存特殊类型,形参为普通类型:截取相应的地址字节。

  

   四,由上面的说明我们可以看出,,只要我们写程序的时候在 * 两面都加上类型的标识符就可以了。但是在使用的时候 * 两边都有类型标识,很容易记混。

char xdata * data ptr;

  这是一个指向一个存储在xdata的数据类型为char的指针,但这个指针却存储在data中。我是这样记的,与char在一起的xdata标识都是描述指针指向的变量的。而跟指针在一起的标识是描述指针自己的。

关于KeilC51的指针(参见, page 106-113, keil uv2 user's guide 09,2001)的更多相关文章

  1. mysql添加,授权,删除用户以及连接数据库Can't connect to MySQL server on '192.168.31.106' (113)错误排查

    centos7下面操作mysql添加,授权,删除用户 添加用户 以root用户登录数据库,运行以下命令: create user test identified by '; 上面创建了用户test,密 ...

  2. 精心收集java基础106条

    Java基础 1.一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 一个Java源文件中可以定义多个类,但最多只能定义一个public的类,并且public ...

  3. KeilC51使用详解 (二)

    深入理解并应用C51对标准ANSIC的扩展是学习C51的关键之一.因为大多数扩展功能都是直接针对8051系列CPU硬件的.大致有以下8类: 8051存储类型及存储区域 存储模式 存储器类型声明 变量类 ...

  4. Swift3.0语言教程使用指针创建和初始化字符串

    Swift3.0语言教程使用指针创建和初始化字符串 Swift3.0语言教程使用指针创建和初始化字符串苹果的Swift团队花了不少功夫来支持C的一些基础特性.C语言中为我们提供了指针,Swift也不例 ...

  5. C安全问题与指针误用

    欢迎关注我的个人博客:www.wuyudong.com, 更多精彩文章与您分享 指针的声明与初始化 1.不恰当的指针声明 考虑如下的声明: int* ptr1, ptr2; // ptr1为指针,pt ...

  6. Operating System Memory Management、Page Fault Exception、Cache Replacement Strategy Learning、LRU Algorithm

    目录 . 引言 . 页表 . 结构化内存管理 . 物理内存的管理 . SLAB分配器 . 处理器高速缓存和TLB控制 . 内存管理的概念 . 内存覆盖与内存交换 . 内存连续分配管理方式 . 内存非连 ...

  7. 【c实现,vc6调试通过】给出一字符串指针,计算出字符串指针中单词数

    #include <stdio.h> /* 给出一字符串指针,计算出字符串指针中单词数, 单词不包括'.',',',';','?','_','"',由0-9数字或26个字母组成 ...

  8. C51指针的使用

    指针就是指变量或数据所在的存储区地址.如一个字符型的变量 STR 存放在内存单元DATA 区的 51H 这个地址中,那么 DATA 区的 51H 地址就是变量 STR 的指针.在 C 语言中指针是一个 ...

  9. Keil C51中函数指针的使用

    函数指针在C语言中应用较为灵活.在单片机系统中,嵌入式操作系统.文件系统和网络协议栈等一些较为复杂的应用都大量地使用了函数指针.Keil公司推出的C51编译器是事实上80C51 C编程的工业标准,它针 ...

随机推荐

  1. PhoneGap应用开发的那些坑爹事儿

    子曾经曰过:如果你恨一个人,让他去开发PhoneGap应用:如果你爱一个人,让他去开发PhoneGap应用. 去年这个时候我很烦恼,因为我觉得我OUT了. 起因是我买了一台Android系统的手机.当 ...

  2. 从 Kubernetes 谈容器网络

    基本概念 在 Kubernetes 中.资源从管理粒度上分为三级:容器.Pod.Service. 容器 即 Docker 或者 Rocket 容器(1.0 中仅支持这两种容器). 容器是最低粒度的资源 ...

  3. @property的特性

    @property还有一些关键字,它们都是有特殊作用的,比如上述代码中的nonatomic,strong: 1 2 @property(nonatomic,strong) NSString *carN ...

  4. MyBatis报错

    1.错误描写叙述 2014-11-2 15:03:11 org.apache.catalina.core.StandardEngine start 信息: Starting Servlet Engin ...

  5. jboss7 Java API for RESTful Web Services (JAX-RS) 官方文档

    原文:https://docs.jboss.org/author/display/AS7/Java+API+for+RESTful+Web+Services+(JAX-RS) Content Tuto ...

  6. TCP/IP协议原理与应用笔记08:对等层和对等实体

    1. 我们直接通过下面这个图,就可以直观了解: Outlook :收发邮件的软件组件. IE:浏览器. CutFTP:文件传输工具. 小结:因为为了完成不同的功能,所以会出现不同实体,这些不同的实体为 ...

  7. Tips--怎么使用谷歌搜索

    修改hosts即可: hosts在哪? windows下:C:\Windows\System32\drivers\etc 管理员身份打开,并将下载好的hosts文件内容,添加到原有的hosts文件末尾 ...

  8. Poj 3368 Frequent values

    /* 线段树区间合并 维护几个信息 到时候乱搞一下就好了 开始T了 有一种情况可以不用递归 直接算出来 */ #include<iostream> #include<cstdio&g ...

  9. FineUI开发实践-目录

    点我订阅 目前所有博客的截图,方便离线观看,点图片 FineUI初学手册 下载,实例项目搭建 FineUI初学手册-部分JS整理 部分JS整理 ASP.NET-FineUI开发实践-1 实际开发环境是 ...

  10. mysql sql语句大全(2)

    1.说明:创建数据库 CREATE DATABASE database-name 2.说明:删除数据库 drop database dbname 3.说明:备份sql server --- 创建 备份 ...