内存地址增加4

时间:2014-01-07 09:54:35

标签: c arrays pointers allocation memory-address

我正在进行指针练习,在尝试代码时遇到了疑问。为什么数组中的这些内存地址增加4?

例如我的输出是

Value of var[0] = 2686720

Value of var[1] = 2686724

Value of var[2] = 2686728

以下是代码:

#include <stdio.h>
#include <conio.h>
main ()
{
  int var[3]= {10,100,200};
  int *ptr[3],i;

  for (i = 0; i < 3; i++)
  {
    ptr[i] = &var[i]; // assign the address of integer.
  }
  for (i = 0; i < 3; i++)
  {
    printf("\n\nValue of var[%d] = ",i);
    printf("%d",ptr[i]);               //var[0]=10  var[1]=100   var[2]=200
  }
  getch();
  return 0;
}

2 个答案:

答案 0 :(得分:3)

首先var[i]int类型的数组。因此,该数组的每个元素将占用每个int的大小。 int的大小为4个字节。

下一步,您正在使用ptr[i]来保存var数组元素的地址。因此,每个元素的value ptr [i]增加4

在这里,为了更好地理解,在处理指针时,您应该使用"%p""0x%x"格式说明符和printf()

此外,您应该更改打印声明

printf("\n\nValue of var[%d] = ",i);

printf("\n\nAddress of var[%d] = ",i);

因为前者传达了错误的信息。实际上,输出值是var[i]地址。如果您想使用var[i]打印ptr[i]的值,可以考虑使用*ptr[i]

答案 1 :(得分:-1)

内存的每个字节都与一个地址相关联。在你的情况下,数组的每个元素在内存中占用4个字节,该元素的地址是它的第一个字节的地址。

所以在你的情况下,内存看起来像这样:

         Memory                Address

    |0|0|0|0|0|0|0|0|    <-    2686720   ( &var[0] )
    |0|0|0|0|0|0|0|0|    <-    2686721
    |0|0|0|0|0|0|0|0|    <-    2686722
    |0|0|0|0|1|0|1|0|    <-    2686723

    |0|0|0|0|0|0|0|0|    <-    2686724   ( &var[1] )
    |0|0|0|0|0|0|0|0|    <-    2686725
    |0|0|0|0|0|0|0|0|    <-    2686726
    |0|1|1|0|0|1|0|0|    <-    2686727

    |0|0|0|0|0|0|0|0|    <-    2686728   ( &var[2] )
    |0|0|0|0|0|0|0|0|    <-    2686729
    |0|0|0|0|0|0|1|1|    <-    2686730
    |1|1|1|0|1|0|0|0|    <-    2686731

这意味着,通过从元素传递到下一个元素,将地址增加sizeof(type),在这种情况下sizeof(*ptr[i]) == sizeof(int)