首页 > 解决方案 > 为什么这段代码的输出是 2 而不是 8?

问题描述

int main()
{
    int array[5];
    int *p,*q;
    p =&array[1];
    q=&array[3];
    printf("%d\n",q);
    printf("%d\n",p);
    printf("%d",q-p);
    
    return 0;
}

有问题的代码

p和的内存q也打印出来了,但是为什么差是2而不是8呢?

标签: arrayscmemoryprinting

解决方案


您正在调用指针算法。当您有两个指向同一数组中元素的指针时,减去这些指针会得到地址之间的字节差除以取消引用的指针类型的字节大小。因此,减去两个指针的结果是它们地址之间的元素数,而不是您所期望的字节数。

因此,在您的情况下,您正在减去int*指针,并且sizeof(int)在编译器中显然是 4 个字节,因此 and 的地址之间有 8 个字节,即&array[1]and之间的&array[3]2 个int元素。array[1]array[3]

---------------------
| 0 | 1 | 2 | 3 | 4 |
---------------------
    ^       ^
    p       q

p = 0xBE460A94
q = 0xBE460A9C

试试这个,你会看到 8:

int main()
{
    int array[5];
    char *p, *q;
    p = (char*) &array[1];
    q = (char*) &array[3];
    printf("%p\n", q);
    printf("%p\n", p);
    printf("%d", q - p);
    
    return 0;
}

相同的地址,但不同的指针类型,所以不同的结果。


推荐阅读