根据Pointer arithmetic for void pointer in C,我们不能对void
指针进行指针算法。
此外,我们无法添加,乘以或除two pointers
,但我们can subtract two pointers
。
根据#6.5.6-2
- 我们可以添加指针和int
类型。
是否有进行指针运算的规则?
答案 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)
这里解释指针算法::
谢谢
::::::更多解释:::::::::
指针和整数不可互换。 (除了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.
希望这有帮助。