为什么 int *b[5] 形成 8 位而不是 4 位的差异?

why does int *b[5] forms a difference of 8 bits instead of 4?

我编写了一个程序来理解 指针 的概念,其中我声明了一个 5 个整数指针的数组 然后我尝试打印数组的各种索引的地址。但是我不明白的是,为什么输出中8位索引的连续地址与4位索引的连续地址之间存在差异?

我的代码是:

#include<stdio.h>
void main()
{
    int i;
    int *b[5];

    for(i = 0; i < 5; i++){
        b[i] = (int *) malloc(10 * (sizeof(int)));}
    printf(" b = %u \n\n",b);
    printf(" (b+1) = %u \n\n", (b+1));
    printf(" (b+2) = %u \n\n", (b+2));
    printf(" *(b+2) = %u \n\n", *(b+2));
    printf(" *(b+2)+3) = %u \n\n", *(b+2) + 3);
    *(*(b+2) + 3) = 5;
    printf(" b[2][3] = %u \n\n", b[2][3]);
}

输出结果如下

b = 79107440 

 (b+1) = 79107448 

 (b+2) = 79107456 

 *(b+2) = 3293532864 

 *(b+2)+3) = 3293532876 

 b[2][3] = 3293533008 

很明显,(b+1) 和 b 之间的差异是 8 位。为什么?

首先,地址以字节为单位,而不是位。其次为什么相差8个字节,是因为你在一个使用64位(8字节)地址的系统上。

int *b[5] 是 int 上的指针数组所以 bb + 1 之间的差异等于 sizeof(int*) 在你身上是 8 个字节电脑

首先,您可以使用 %p 来显示指针的地址,而不是 %u。事实上,%d 是一个有符号整数,而 %u 是一个无符号整数,而 %p 是一个指针。

关于答案,在您的机器上,int 显然是 4 个字节,但指针是 8 个字节(典型的 64 位机器)。