【问题标题】:Finding the difference between the addresses of elements in an array查找数组中元素地址之间的差异
【发布时间】:2014-10-20 10:15:03
【问题描述】:

我有一个关于指针算术的考试修订问题,我们减去两个数组变量的地址的部分对我来说没有意义。

一个数组实际上等于另一个数组。我了解各个输出 对于每个数组变量,在这种情况下是两个地址之间的差异 是 16,给定这个操作系统上的 int = 4 个字节。

我不明白为什么减法会得到 4。 我的逻辑是它们在数组中相隔 4 个位置,但这对我来说没有意义。

int main(void)
{

int oddNums[5] = {1, 3, 5, 7, 9};
int *ip = oddNums;

printf("&oddNums[4] %d - ip %d= %d\n",&oddNums[4], ip,  &oddNums[4] - ip);
/*prints &oddNums[4] 2686740 - ip 2686724= 4*/

   return EXIT_SUCCESS;
}

【问题讨论】:

    标签: c arrays pointer-arithmetic addressof


    【解决方案1】:

    减法返回4,因为它以sizeof(<array-element>) 的形式返回结果。这样做是为了使减法成为加法的逆运算,加法也根据数组元素大小进行操作。

    回想一下,如果a是一个数组,i是一个整数,那么a+i&a[i]是一样的,所以加法必须考虑元素的大小。为了遵循数学规则,减法也必须除以元素的大小。

    这使得指针算术更容易,因为加法和减法运算负责处理数组元素的大小。如果没有此规则,则需要将加法或减法的结果除以或乘以元素的大小,以获得所需元素的地址或偏移量。这很容易出错,也很难阅读。最后,如果您将元素大小从一个字节更改为几个字节,并且编写算法的人忘记了乘以或除以 sizeof,这将造成维护噩梦。

    【讨论】:

      【解决方案2】:

      指针减法的定义是给出两个指针之间元素的差数。

      它类似于添加一个指向整数的指针:它意味着将指针前进那个元素的数量。

      确保您将“指针”视为告诉您在哪里可以找到某种类型的对象的东西。 (与将其视为表示内存地址的整数相反)。

      【讨论】: