我有关于指针算术的考试修订问题,而我们减去两个数组变量的地址的一部分对我来说没有意义。
一个阵列实际上等于另一个阵列。我理解个人的输出 对于每个数组变量,在这种情况下,两个地址之间的差异 在这个操作系统上给定一个int = 4个字节是16。
我不明白为什么减法给出了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;
}
答案 0 :(得分:3)
指针减法的定义是给出元素的数量'两个指针之间的区别。
它类似于添加指向整数的指针:它意味着将指针推进该数量的元素。
确保您正在考虑"指针"作为告诉你在哪里找到某种类型的对象的东西。 (与将其视为表示内存地址的整数相反)。
答案 1 :(得分:3)
减法返回4
,因为它以sizeof(<array-element>)
的形式返回其结果。这样做是为了使减法成为加法的逆,其也根据数组元素大小进行操作。
回想一下,如果a
是一个数组且i
是一个整数,那么a+i
与&a[i]
相同,因此添加必须考虑元素的大小。为了遵循数学规则,减法必须除以元素的大小。
这使得指针算术更容易,因为加法和减法的操作负责处理数组元素的大小。如果没有这个规则,就需要将加法或减法的结果除以或乘以元素的大小,以获得所需元素的地址或获得偏移量。这很容易出错,也难以阅读。最后,当您将元素大小从一个字节更改为几个字节时,这会产生维护噩梦,并且编码该算法的人忘记乘以或除以sizeof
。