【问题标题】:What's the difference between these two operations?这两个操作有什么区别?
【发布时间】:2019-05-18 21:30:54
【问题描述】:

我正在学习 C,我看到了这段代码,但我无法区分。有人可以解释一下吗?谢谢。

#include <stdio.h>
int main(int argc, char const *argv[])
{
    int addressAsInt = 0x61FF08;
    printf("address = %p\n", addressAsInt);
    int address2AsInt = 0x61FF14;
    printf("address2 = %p\n", address2AsInt);
    printf("rest = %d\n", address2AsInt - addressAsInt);

    int* address = (int*) 0x61FF08;
    printf("address = %p\n", address);
    int* address2 = (int*)  0x61FF14;
    printf("address2 = %p\n", address2);
    printf("rest = %d\n", address2 - address);

    return 0;
}

第一个差分输出 0000000C,第二个差分输出 00000003。 第一个懂,第二个不懂。

【问题讨论】:

  • 指针算法是没有意义的,除非它们都是指向同一个对象的指针(或者对于一个数组,只是过去)。
  • 第二种情况,相差3ints。
  • addressAsInt 是一个整数。使用%p 打印会调用未定义的行为[
  • 指针算法的工作方式类似于数组索引。当您访问int array[] 中的第二个元素时,您使用的是array[1] 而不是array[4]

标签: c


【解决方案1】:

第一个操作是两个十六进制之间的简单差异(12 = C in hexadecimal)。

第二个操作是两个指针之间的差异:它给出了可以容纳在两个指针的各自目标之间的相同类型元素的数量。

【讨论】:

  • 这是否意味着这 2 个指针之间有 3 个整数的位置?
  • 不在两个指针之间,而是指针指向的位置。但是你的指针并不指向一个对象。这是代码的一部分吗?
  • Yes :) 第一个指针指向数组的第一个元素,第二个指向最后一个元素。
  • 谢谢!我用 short 和 double 测试了它,你是对的。
  • @Minara,您说第一个指针指向数组的第一个元素,第二个指向数组的最后一个元素,请注意这一点,因为指针差异不会告诉您元素的数量数组,但比那个少一个。为此,您必须使 second 指向数组最后一个元素之后的下一个元素。
猜你喜欢
  • 2014-03-17
  • 1970-01-01
  • 2012-06-12
  • 2016-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多