网站公告:
诚信为本:市场永远在变,诚信永远不变。
全国服务热线:0898-88889999

TELEPHONE

联系我们 CONTACT US
手机:
16583316434
电话:
0898-88889999
邮箱:
admin@jmphp.com
地址:
澳门特别行政区澳门市澳门区来预大楼5599号
kaiyun下载app下载安装手机版Vehicles Show
‘Kaiyun·yunkai(中国)官方网站·IOS/手机版APP下载/APP’C语言中可移植且可靠的指针运算
发布时间:2024-10-19 10:07:01 点击量:726
本文摘要:在C语言中,指针变量是强劲且简单的功能。

在C语言中,指针变量是强劲且简单的功能。指针变量使程序员不仅可以间接提到数据和函数,还可以融合数组上标来自由选择、加载和载入数组项。

但首先必须理解什么是指针和地址以及编译器如何用于它们。不解读指针和地址不会迅速造成代码故障。利用指针,我们可以续写许多语法准确的C语言代码,来编译器和构建某种功能,但这种功能在有所不同的C编译器构建中以及有所不同的目标器件上有可能有所不同。

甚至有可能与我们的希望有所不同。  指针不是整数  指针变量包括C语言数据的地址。例如,查阅以下几行代码。

  inta,*p;  /*为指针彰显某个目标的地址*/  p=a;  /*中止提到指针以间接采访目标*/  *p=0;  上面的代码将变量a的值设置为0。应用于到a的运算符回到一个回应该变量方位的值(地址)。如果将该值读取一个指针变量,然后对指针中止提到(用于*运算符),则该表达式回应完整变量a。这很更容易让人指出该地址在数值上相等变量a所在的计算机存储器地址,但在C语言中并没此类拒绝。

  以下示例可确切地解释最后一点:考虑到具备多个独立国家存储区的PIC器件。对坐落于数据存储器中器件地址100h的变量用于地址运算符时应回到什么值?而对坐落于程序存储器中器件地址100h的另一个变量用于地址运算符时又不应回到什么值?  如果在两种情况下都问100h,那么在运营时如何获知100h是数据存储器中的地址还是程序存储器中的地址呢?似乎,在这种情况下,如果几天后要中止提到地址,则必须其他方式来确认不应采访哪个存储器。  其他方式可以是对地址运算符回到的值展开类似编码(与MPLABXC8编译器因应用于的技术),也可以用于表达完全相同信息的类似指针类型限定符(MPLABXC16和XC32编译器用于该方法)。

  为维持代码的可移植性,不不应假设将整数赋给指针就不会使指针能采访任何对象,即使该整数的值与某个对象的器件地址完全相同。因此对于上面的示例,为指针赋值立刻数100h(或者保有此值的整数变量)并不意味著该指针指向变量a。  /*我们找到a被分配到地址100h  */inta,*p;  /*录:这牵涉到整数到指针的隐式切换*/  p=0x100;  /*没有人告诉不会再次发生什么!*/  *p=0;  请求忘记,一种地址空间中的取指和存储有可能不像另一种地址空间中的取指和存储一样非常简单编译器有可能必须用于有所不同的寄存器和指令才能继续执行采访。

  基于某种程度的原因,在定义指针时,必需用于必要的指针类型限定符。由于MPLABXC8对地址展开编码,因此它不用于类似地址空间限定符,而MPLABXC16和XC32则用于。但是,两种情况下都必需主动用于一般来说的const和volatile限定符。

限定符在数据定义中登录,如果想可信地采访该数据,则必须用于与提到该数据的指针相匹配的限定符。例如,用于MPLABXC16时:  __psv__charbuffer[8]__attribute__((space(psv)))  在存储器程序存储器中摆放一个字符数组buffer,可通过psv(程序空间可视性)窗口展开采访。必要采访buffer将使编译器分解可保证psv窗口(坐落于处理器地址空间中的特定方位)同构到存储器(包括buffer)中必要方位的代码。

buffer的地址是所须要窗口设置与buffer在整个窗口中的可用区域内的偏移量的人组。  通过指针提到buffer中的项时,必需用于如下指针:  __psv__char*bp;  才能使编译器分解准确的代码。

不带上__psv__限定符的普通指针不起作用。  因此指针某种程度是一个长到可以留存地址的整数,它还具备关联的目标类型;C语言数据地址某种程度是一个计算机存储器地址,它可由编译器改动或优化。

C编译器还不会考虑到其他一些事项。  出有问题的方位  如果我们指出指针只是一个值为(计算机存储器)地址的整数,并且指出我们已理解地址的含义以及该存储器中排序数据的方式,我们可能会想在所撰写的C语言代码中显式继续执行各种各样的地址运算,进而在程序中映射底层运营时环境的特定于构建的详细信息。这样一来,即使现在程序可以运营,但如果针对其他处理器展开编译器,有可能就无法长时间工作,或者有可能在看上去无关紧要的变更后莫名暂停工作。

我们该如何防止这类问题呢?  1.用于准确的指针类型。根据提到的数据自由选择限于的指针类型。尽管在你加到一系列切换后程序不会展开编译器,但不要据此指出程序不会实际按照你的希望工作。它不会按照你告诉他它的方式工作,这有可能与你的希望有相当大有所不同。

  2.根据你将用来采访数据的结构来分配数据  3.不要猜测数据类型的布局  例如,可以分配一个字符缓冲区,然后将该缓冲区的地址切换为指向更大类型数据数组或结构数组的指针。随后你可能会通过有所不同类型的指针,有时采访字符型数据,有时采访其他类型的数据。为此,必需告诉更大类型的数据在字符数据上以及彼此之间的排序方式。

这十分危险性而且更容易错误。如果必须通过多类型视图采访数据,请求将数据分配成牵头数组,然后通过牵头采访数据。

编译器将确切你的意图并协助你准确构建。  示例  下面的C程序创建了一个初始化结构数组,表明该数组,改动数组的一个元素,最后表明改版的结果。代码中针对自由选择和改版要变更的元素获取了几种最合适方法。


本文关键词:kaiyun下载app下载安装手机版,Kaiyun·yunkai(中国)官方网站·IOS/手机版APP下载/APP

本文来源:kaiyun下载app下载安装手机版-www.jmphp.com