指针减法混淆

fud*_*din 48 c

当我们从另一个指针中减去一个指针时,差异不等于它们相隔多少个字节但等于有多少个整数(如果指向整数)它们是分开的.为什么这样?

cor*_*iKa 71

这个想法是你指向内存块

+----+----+----+----+----+----+
| 06 | 07 | 08 | 09 | 10 | 11 | mem
+----+----+----+----+----+----+
| 18 | 24 | 17 | 53 | -7 | 14 | data
+----+----+----+----+----+----+
Run Code Online (Sandbox Code Playgroud)

如果你有,int* p = &(array[5])那么*p将是14.去p=p-3*p是17.

所以,如果你有int* p = &(array[5])int *q = &(array[3]),然后p-q应该是2,因为指针指向的内存是2个街区之遥.

处理原始内存(数组,列表,地图等)时会抽出很多方块!真的很有帮助!

  • 顺便说一句,如果我可以强调一件事,那么"指针很难".是的,经验丰富的C++老手可以轻松地将它们塑造成形状,但是确切地了解何时以及如何有效地使用它们不仅仅是一项简单的任务. (13认同)
  • @glowcoder:经验丰富的C编码器也是如此 - 这可能在标记为C的问题中更为适用. (12认同)
  • @glowcoder:你不需要大括号,例如`int*p =&array [5];`完全没问题,``int*p = array + 5;`. (3认同)

eru*_*orm 35

因为指针 - 土地上的所有东西都是抵消的.当你说:

int array[10];
array[7] = 42;
Run Code Online (Sandbox Code Playgroud)

你在第二行中实际说的是:

*( &array[0] + 7 ) = 42;
Run Code Online (Sandbox Code Playgroud)

字面翻译为:

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

如果我们可以添加7来使偏移点到正确的位置,我们需要能够有相反的位置,否则我们的数学中没有对称性.如果:

&array[0] + 7 == &array[7]
Run Code Online (Sandbox Code Playgroud)

然后,为了理智和对称:

&array[7] - &array[0] == 7
Run Code Online (Sandbox Code Playgroud)


pto*_*ato 10

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

  • 那么我该如何记住这个令人讨厌的事实:(把我逼死了:( (2认同)
  • @fahad:如果你想要两个地址之间的字节数,你可以将两个地址转换成`char*`然后取差.你在哪里知道替代方案更好?你在C之前用汇编程序编程了吗?C机制是合理的 - 数组索引取决于它(因为下标操作将N添加到基址,但这是N个单元中大小的单位). (2认同)

Jef*_*ley 7

假设你有一个10个整数的数组:

int intArray[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
Run Code Online (Sandbox Code Playgroud)

然后你拿一个指向intArray的指针:

int *p = intArray;
Run Code Online (Sandbox Code Playgroud)

然后你增加p:

p++;
Run Code Online (Sandbox Code Playgroud)

你所期望的,因为p在开始intArray[0],是的增加值pintArray[1].这就是指针算术就是这样的原因.请参阅此处的代码.


Pra*_*n S 5

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

在这里查看更多信息。

  • @fahad:因为指针不一定指向字节,它们指向定义它们时使用的类型的对象。指针算术也是根据这些对象的数量来完成的。 (2认同)