我读了一点指针算术,我发现了两件事,我既不明白也不知道它的用处
address_expression - address_expression而且还
address_expression > address_expression有没有人能给我解释一下,它们是怎么工作的,什么时候使用。
编辑:
我想说的是,如果我只取两个地址并减去它们,它们会产生什么结果
如果我取两个地址进行比较,结果是什么?
编辑:我现在理解了减去地址的结果,但是比较地址我仍然不明白。
我理解1<2,但是一个地址怎么会比另一个地址大,它们又有什么可比性呢
发布于 2012-07-30 08:12:47
指针减法得到相同类型的两个指针之间的数组元素数。
例如,
int buf[10] = /* initializer here */;
&buf[10] - &buf[0]; // yields 10, the difference is 10 elements指针比较。例如,对于>关系运算符:如果左侧的指向数组元素或结构成员在右侧指向的数组元素或结构成员之后,则>操作将生成1,否则将生成0。记住,数组和结构是有序序列。
&buf[10] > &buf[0]; // 1, &buf[10] element is after &buf[0] element发布于 2012-07-30 09:02:09
这里的几个答案表明指针就是数字。这不是C标准所指定的指针的准确描述。
在很大程度上,您可以将指针视为数字,并将其视为内存中的地址,前提是(a)您了解指针减法将字节之间的差异转换为元素(被减法指针的类型),以及(b)您了解此模型所突破的限制。
下面使用1999 C标准(ISO/IEC 9899,第二版,1999-12-01)。我希望下面的内容比提问者要求的更详细,但是,考虑到这里的一些错误陈述,我认为应该提供准确和准确的信息。
根据6.5.6第9段,您可以减去两个指针,这两个指针指向同一数组的元素或指向数组最后一个元素之后的一个元素。因此,如果有int a[8], b[4];,可以从指向a5的指针中减去指向a2的指针,因为a5和a2是同一数组中的元素。也可以从指向a8的指针中减去指向a5的指针,因为a8比数组的最后一个元素大一。(a8不在数组中;a7是最后一个元素。)不能从指向a5的指针中减去指向b2的指针,因为a5与b2不在同一数组中。或者,更准确地说,如果你做这样的减法,行为是未定义的。请注意,这不仅仅是未指定的结果;您不能期望得到一些可能毫无意义的结果:行为是未定义的。根据C标准,这意味着C标准不会说明结果会发生什么。你的程序可以给你一个合理的答案,或者它可以中止,或者它可以删除文件,所有这些后果都将符合C标准。
如果执行允许的减法,则结果是从第二个指向的元素到第一个指向的元素的元素数。因此,无论a是什么类型,a[5]-a[2]都是3,a[2]-a[5]是−3。C实现需要将字节(或它使用的任何单位)的距离转换为适当类型的元素。如果a是一个8字节的双精度数组,那么对于3个元素,a[5]-a[2]是3。如果a是一个字符数组,每个字符只有一个字节,那么对于3个元素,a[5]-a[2]是3。
为什么指针不只是数字呢?在某些计算机上,特别是较老的计算机,寻址内存更为复杂。早期的计算机地址空间很小。当制造商想要获得更大的地址空间时,他们也想保持与旧软件的一些兼容性。由于硬件限制,他们还必须实现各种寻址内存的方案,这些方案可能涉及在内存和磁盘之间移动数据,或者更改处理器中控制地址如何转换为物理内存位置的特殊寄存器。对于在这样的机器上工作的指针,它们必须包含更多的信息,而不仅仅是一个简单的地址。正因为如此,C标准并不只是将指针定义为地址,并让您对地址进行算术运算。只定义了合理数量的指针算术,C实现需要提供必要的操作才能使该算术工作,但仅此而已。
即使在现代机器上,也可能存在复杂性。在Digital的Alpha处理器上,指向函数的指针不包含函数的地址。它是函数描述符的地址。该描述符包含函数的地址,并包含正确调用函数所需的一些附加信息。
关于关系运算符,如>,C标准在6.5.8第5段中指出,如上所述,您可以比较可以减去的相同指针,还可以比较指向聚合对象(结构或联合)成员的指针。指向数组成员(或其结束地址)的指针以预期的方式进行比较:指向索引较高的元素的指针大于索引较低的元素的指针。指向同一联合的两个成员的指针比较相等。对于指向结构的两个成员的指针,指向稍后声明的成员的指针大于指向先前声明的成员的指针。
只要你遵守上面的约束,你就可以把指针看作是数字,也就是内存地址。
通常,C实现很容易提供C标准所需的行为。即使计算机具有复合指针方案,例如基地址和偏移量,通常数组的所有元素将彼此使用相同的基地址,并且结构的所有元素将彼此使用相同的基地址。因此,编译器可以简单地减去或比较指针的偏移量部分,以获得所需的差异或比较。
但是,如果在这样的计算机上减去指向不同数组的指针,就会得到奇怪的结果。由基址和偏移量形成的位模式可能看起来比另一个指针更大(当解释为单个整数时),即使它指向内存中的较低地址。这是您必须遵守C标准所设置的规则的原因之一。
发布于 2012-07-30 08:04:19
减去两个指针地址将返回该类型元素的数量。
因此,如果你有一个整数数组和两个指向它的指针,减去这些指针将返回两个整数之间的值,而不是字节数。与char类型相同。因此,您需要注意这一点,特别是当您使用字节缓冲区或宽字符时,您的表达式计算的值是正确的。如果您需要基于字节的缓冲区偏移量用于不使用单个字节的存储(int、short等),则需要首先将指针转换为char*。
https://stackoverflow.com/questions/11713929
复制相似问题