在下面这个与指针及其输出相关的 C 代码中,为什么值 a[1](即 20)没有存储在连续的地址 de9 中?

In this below C code related to pointers and its output, then why doesn't the value a[1] i.e 20 get stored at consecutive address de9?

在下面的代码中,每个位置可以容纳 32 位有符号数据。那么,为什么值 a1 即 20 没有存储在连续的地址 de9 中?数组应该将数据存储在连续的内存位置吗?我知道这个在线 gdb 编译器中的 sizeof(int) 是 4 个字节,但它与 4 个位置的 20 的存储有什么关系呢?我是否遗漏了一些基本概念?

  int main()
    {
     int a[2]= {214748368,20};
       
       void *ptr1 = &a;
       void *ptr2= &a;
       
       ptr1++;
       ptr2 = ptr2;
       
       printf("%d \n", *(int*)ptr2);
       printf("\n Pointer table");
       printf("\n Data : %d at address : %p", *(int*)ptr2, ptr2);
       ptr2=ptr2+1;
       printf("\n Data : %d at address : %p", *(int*)ptr2, ptr2);
       ptr2=ptr2+1;
       printf("\n Data : %d at address : %p", *(int*)ptr2, ptr2);
       ptr2=ptr2+1;
       printf("\n Data : %d at address : %p", *(int*)ptr2, ptr2);
       ptr2=ptr2+1;
       printf("\n Data : %d at address : %p", *(int*)ptr2, ptr2);
       return 0;
    }

Code Output

当你增加一个指针时,在 C 中使用指针算法。因此,如果您的指针 aint * 类型,它将增加 sizeof(int)。但是你的指针是 void * 类型的。这不是故意的,显然它增加了一个字节(参见here)。

由于系统上 int 的大小为 32 位或 4 字节,因此您必须将指针增加四次一个字节才能到达数组中的下一个元素。

您可以通过将指针定义为 int *:

来避免此问题
int *ptr1 = &a;
int *ptr2 = &a;

在这种情况下,将指针递增一次 (ptr2++) 将为您提供下一个元素。