执行指针运算的规则

时间:2013-10-11 06:00:40

标签: c++ c pointers

根据Pointer arithmetic for void pointer in C,我们不能对void指针进行指针算法。

此外,我们无法添加,乘以或除two pointers,但我们can subtract two pointers

根据#6.5.6-2 - 我们可以添加指针和int类型。

是否有进行指针运算的规则?

3 个答案:

答案 0 :(得分:3)

  

根据C中的void指针的指针算法,我们不能对void指针进行指针算法

正确,你不能这样做,按照C11 6.5.6 / 2:

  

另外,两个操作数都应具有算术类型或一个   操作数应该是指向完整对象类型和另一个的指针   应该有整数类型。

void指针是指向不完整类型的指针,而不是上述指针。

  

根据#6.5.6-2 - 我们可以添加一个指针和一个int类型。

确实

  

是否有进行指针运算的规则?

是。这些可在标准的第6.5.6章中找到。

答案 1 :(得分:0)

我唯一知道的是,如果你要减去指针,它们必须是相同的类型并指向“相同的内存块”(指向同一分配的两个指针和/或指向同一数组的两个指针) )。它还允许指出“超出”分配的“一个元素”。同样,您不能添加超过内存块结尾的一个。

在内存块中使用指针是未定义的行为,因为某些体系结构具有不同的内存区域,这样一种指向一个区域的指针不会轻易地(或根本)从另一个区域中减去另一个指针(具有“良好”结果) - 例如,16位模式下的OS / 2将具有段寄存器,该寄存器保存高达64KB的存储区域的基址。另一个内存区域将有另一个基地址,并且用户模式代码根本无法获取基地址,因此无法减去/添加指针以获取该区域之外仍然“知道在哪里你是”。

在MOST(现在)常用的体系结构中,它可以很好地为系统中的任何地址进行数学运算,但它并不是标准所保证的。

答案 2 :(得分:-4)

这里解释指针算法::

Pointer Arithmetic

谢谢

::::::更多解释:::::::::

指针和整数不可互换。 (除了0)我们必须分别处理指针和整数之间的算术,以及两个指针之间的算术运算。

假设你有一个指向长的指针。

long *ptrlng;

指针和整数之间的二进制操作

1. ptrlng+n is valid, if n is an integer. The result is the following byte address
ptrlng + n*sizeof(long) and not ptrlng + n.
It advances the pointer by n number of longs.

2 ptrlng-n is similar.

考虑两个指针ptr1和ptr2,它们指向相同类型的数据。

<datatype> *ptr1, *ptr2;

两个指针之间的二进制操作

1.Surprise: Adding two pointers together is not allowed!
2.ptr1 - ptr 2 is allowed, as long as they are pointing to elements of the same array. 
The result is
(ptr1 - ptr2)/sizeof(datatype)

In other settings, this operation is undefined (may or may not give the correct answer).

为什么所有这些特殊情况?这些指针运算规则旨在正确处理数组内部的寻址。

如果我们可以从另一个指针中减去指针,则可以支持所有关系操作!

指针的逻辑操作

1. ptr1 > ptr2 is the same as ptr1 - ptr2 > 0,
2. ptr1 = ptr2 is the same as ptr1 - ptr2 = 0,
3. ptr1 < ptr2 is the same as ptr1 - ptr2 < 0,
4. and so on.

希望这有帮助。