0

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

此外,我们不能加、乘或除two pointers,但我们can subtract two pointers.

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

做指针运算有什么规则吗?

4

3 回答 3

3

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

正确,您不能这样做,根据 C11 6.5.6/2:

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

void 指针是指向不完整类型的指针,以上都不是。

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

的确。

做指针运算有什么规则吗?

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

于 2013-10-11T06:35:43.950 回答
0

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

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

在大多数(现在)常用架构中,对系统中的任何地址进行数学运算都可以正常工作,但标准并不能保证它。

于 2013-10-11T06:22:25.927 回答
-3

这里解释了指针算法::

指针算术

谢谢

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

指针和整数不可互换。(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.

希望这可以帮助。

于 2013-10-11T06:30:41.163 回答