c-指针减法混淆

当我们从另一个指针中减去一个指针时,其差值不等于它们相距多少字节,而是等于它们相距多少整数(如果指向整数)。 为什么这样?

fuddin asked 2020-02-13T20:23:08Z
8个解决方案
71 votes

这个想法是您指向内存块

+----+----+----+----+----+----+
| 06 | 07 | 08 | 09 | 10 | 11 | mem
+----+----+----+----+----+----+
| 18 | 24 | 17 | 53 | -7 | 14 | data
+----+----+----+----+----+----+

如果您有int* p = &(array[5]),则int *q = &(array[3])将为14。转到p-q将使*p为17。

因此,如果您有int* p = &(array[5])int *q = &(array[3]),则p-q应该为2,因为指针指向的内存相隔2个块。

在处理原始内存(数组,列表,地图等)时,请绘制许多盒子! 真的有帮助!

corsiKa answered 2020-02-13T20:23:34Z
35 votes

因为指针区域中的所有内容都与偏移量有关。 当你说:

int array[10];
array[7] = 42;

您实际上在第二行中所说的是:

*( &array[0] + 7 ) = 42;

直译为:

* = "what's at"
(
  & = "the address of"
  array[0] = "the first slot in array"
  plus 7
)
set that thing to 42

而且,如果我们可以加7以使偏移点指向正确的位置,则我们需要能够将相反的位置放置在适当的位置,否则我们的数学中就没有对称性。 如果:

&array[0] + 7 == &array[7]

然后,出于理智和对称:

&array[7] - &array[0] == 7
eruciform answered 2020-02-13T20:24:12Z
10 votes

因此,即使在整数长度不同的平台上,答案也是相同的。

ptomato answered 2020-02-13T20:24:32Z
7 votes

假设您有10个整数的数组:

int intArray[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

然后,您获得一个指向intArray的指针:

int *p = intArray;

然后增加p

p++;

您会期望的是,因为pintArray[0]开始,所以将p的增量值设为intArray[1]。这就是指针算法如此工作的原因。 在这里查看代码。

Jeff Kelley answered 2020-02-13T20:25:06Z
3 votes

“当减去两个指针时,只要它们指向同一数组,结果就是将它们分开的元素数”

在这里检查更多。

Praveen S answered 2020-02-13T20:25:30Z
2 votes

指针减法的这种行为与指针加法的行为一致。 这意味着n = (p2 - p1) / sizeof(*p1)(其中n = p2 - p1p2是指向同一数组的指针)。

指针加法(将整数添加到指针)的行为类似:n = (p2 - p1) / sizeof(*p1)为您提供数组中下一个项目的地址,而不是数组中下一个字节的地址-这将是一件毫无用处且不安全的事情。

可以设计该语言,使指针的增加和减少与整数相同,但这将意味着编写指针算法的方式有所不同,并且必须考虑所指向类型的大小:

  • n = (p2 - p1) / sizeof(*p1)代替n = p2 - p1
  • n = (p2 - p1) / sizeof(*p1) instead of n = p2 - p1

因此,结果将是更长,更难阅读且更容易出错的代码。

mwfearnley answered 2020-02-13T20:27:10Z
1 votes

在对特定类型的指针进行算术运算时,始终希望结果指针指向相对于原始起点的“有效”(表示正确的步长)存储地址。 这是一种独立于底层体系结构访问内存中数据的非常舒适的方法。

如果要使用其他“步长”,则始终可以将指针强制转换为所需的类型:

int a = 5;
int* pointer_int = &a;
double* pointer_double = (double*)pointer_int; /* totally useless in that case, but it works */
das_weezul answered 2020-02-13T20:27:35Z
0 votes

@fahad指针算术取决于它所指向的数据类型的大小,因此当ur指针为int类型时,您应该期望指针算术为int(4字节)大小。对于char指针而言,对指针的所有操作都将在其中 1个字节的条件。

The Stig answered 2020-02-13T20:27:56Z
translate from https://stackoverflow.com:/questions/3238482/pointer-subtraction-confusion