【问题标题】:Difference in pointer arithmetic (&x[5]-x)指针算术的差异 (&x[5]-x)
【发布时间】:2019-01-19 21:19:30
【问题描述】:

我有以下sn-p:

int main(){
    int x[5]={1,2,3,4,5};
    printf("\n%d\n", &x[2]-x);
}

我知道在指针算术中,&x[5]-&x[2] 例如给出 3,因为减法返回两个指针之间指针类型的差异。但是我无法理解机器如何处理&x[2]-x,因为它输出2。

【问题讨论】:

  • 请用您使用的语言标记问题。

标签: c pointers


【解决方案1】:

简单地说,xint [5] 类型数组的左值,这意味着当在这样的表达式中使用时,它可以隐式衰减到指向第一个元素的指针,因此从某种意义上说,代码正在执行相同的函数正如&x[2] - &x[0] 那样。

您可以阅读有关数组到指针衰减here 的更多信息。请注意,这也是下标运算符的工作方式,例如,下标运算符的 a[b] 定义与 *(a + b) 相同,在这种情况下,a 将衰减为指向第一个元素的指针,并通过 b 结束的指针运算up 指向要取消引用的所需元素。

【讨论】:

  • 另一种表达方式,使用a[b]*(a + b) 的等价性,是OP 的表达式&x[2]-x 变为&*(x + 2) - x。地址和解引用运算符 (&*) 相互抵消,变为 x + 2 - x2
猜你喜欢
  • 2021-11-09
  • 1970-01-01
  • 2021-12-18
  • 1970-01-01
  • 1970-01-01
  • 2021-10-07
  • 1970-01-01
  • 2017-03-23
  • 2016-04-08
相关资源
最近更新 更多