减去以下两个包含整数的地址返回 1 而不是预期的 4 [重复]

Posted

技术标签:

【中文标题】减去以下两个包含整数的地址返回 1 而不是预期的 4 [重复]【英文标题】:Subtracting two following addresses that containing ints returns 1 and not 4 as expected [duplicate] 【发布时间】:2022-01-23 01:29:15 【问题描述】:
#include <stdio.h>

int main()

    int a[5] = 1,2,3,4,5;
    int *p = a;
    int *q = p++;
    int b = p-q;
    printf("%d", b);
    return 0;

p 指向2q 指向1。 我知道Integer在内存中占用4字节,所以如果我错了请纠正我,但例如如果a[0]的地址是1000,那么a[1]的地址将是1004

如果是这样,为什么减去这些地址会得到1 而不是4

【问题讨论】:

因为指针算法就是这样定义的。它很有用,因此指针算术可以等效于数组索引。您应该尝试使用搜索引擎查找此主题。 另外,int 类型,在 C 中,占用 任何特定的内存量。这取决于平台。 假设一个整数在内存中占用 4 个字节是错误的。在许多平台上都是如此,但不是全部。 请注意*(p+1)p[1] 相同。他们有什么共同点?两者都知道数据类型的大小。 【参考方案1】:

好吧,您显然误解了指针运算的工作原理。

考虑一下:

int a[5] = 1,2,3,4,5;
int *p = a;
p = p + 1;

现在您希望p 指向哪里?在2,即at a[1]?还是您希望它指向1 的中间,即a[0] 的中间?

答案是p指向a[1]

现在考虑

int a[5] = 1,2,3,4,5;
int *p = a;
int *q = a;
p = p + 1;
int b = p-q;

并做一些简单的替换:

int b = p-q;

因为

p is a + 1
q = a

我们得到

int b = (a + 1) - a;

这是

int b = 1;

显然结果是 1。

【讨论】:

【参考方案2】:

来自 C11 Standard#6.5.6p9 [强调添加]

两个指针相减时,都指向同一个数组对象的元素,或者是数组对象最后一个元素的后一个; 结果是两个数组元素的下标之差。结果的大小是实现定义的,它的类型(有符号整数类型)是在 头文件中定义的 ptrdiff_t。 ....

来自this:

指定数组的单个元素的下标只是方括号中的整数表达式。

    int a[5] = 1,2,3,4,5;
    int *p = a;
    int *q = p++;

指针pq 都指向同一数组对象的元素,即数组a。指针p 指向数组a 的第二个元素,即a[1](下标为1),指针q 指向数组a 的第一个元素,即a[0](下标是0)。

p - q 的结果是1 - 0,等于1。因此,您将获得输出 1

理想情况下,b 的类型应为ptrdiff_t,并为printf() 提供%td 格式说明符以表示b

    ptrdiff_t b = p - q;
    printf("%td", b);

【讨论】:

以上是关于减去以下两个包含整数的地址返回 1 而不是预期的 4 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

[二分答案]p1m2

如何用环绕或溢出减去两个无符号整数

C中的电源功能未按预期工作

require_once 返回 true 而不是预期的对象

函数返回 Int 而不是 char

Excel 2016中的条件格式减去空白单元格