根据C 中 void 指针的指针运算,我们不能对指针进行指针运算void
。
此外,我们不能加、乘或除two pointers
,但我们can subtract two pointers
.
根据#6.5.6-2
- 我们可以添加一个指针和一个int
类型。
做指针运算有什么规则吗?
根据C 中 void 指针的指针运算,我们不能对指针进行指针运算void
。
此外,我们不能加、乘或除two pointers
,但我们can subtract two pointers
.
根据#6.5.6-2
- 我们可以添加一个指针和一个int
类型。
做指针运算有什么规则吗?
根据 C 中 void 指针的指针运算,我们不能对 void 指针进行指针运算
正确,您不能这样做,根据 C11 6.5.6/2:
另外,两个操作数都应具有算术类型,或者一个操作数应是指向完整对象类型的指针,而另一个应具有整数类型。
void 指针是指向不完整类型的指针,以上都不是。
根据 #6.5.6-2 - 我们可以添加一个指针和一个 int 类型。
的确。
做指针运算有什么规则吗?
是的。这些在标准的第 6.5.6 章中找到。
我唯一知道的是,如果要减去指针,它们必须是相同的类型并指向“相同的内存块”(两个指向相同分配的指针和/或两个指向相同数组的指针)。还允许指向“超出”分配的“一个元素”。同样,您不能在内存块末尾添加超过一个。
由于某些架构具有不同的内存区域,因此跨内存块使用指针是未定义的行为,这样指向一个区域的指针不会轻易(或根本)从另一个区域的另一个指针中减去(带有“好”的结果)——例如,在 16 位模式下的 OS/2 将有一个段寄存器,它保存高达 64KB 的内存区域的基地址。另一个内存区域将有另一个基地址,并且用户模式代码根本无法获得基地址,因此无法减去/添加指针以到达该区域之外并且仍然“知道在哪里你是”。
在大多数(现在)常用架构中,对系统中的任何地址进行数学运算都可以正常工作,但标准并不能保证它。
这里解释了指针算法::
谢谢
:::::: 更多解释 ::::::::::
指针和整数不可互换。(0 除外。)我们将不得不分别处理指针和整数之间的算术,以及两个指针之间的算术。
假设您有一个指向 long 的指针。
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.
希望这可以帮助。