C 内存地址增加了四个

C 内存地址增加了四个,c,arrays,pointers,allocation,memory-address,C,Arrays,Pointers,Allocation,Memory Address,我在做一个指针练习,在试验代码时遇到了一个疑问。为什么阵列中的这些内存地址会增加4 例如,我的输出是 代码如下: #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 int

我在做一个指针练习,在试验代码时遇到了一个疑问。为什么阵列中的这些内存地址会增加4

例如,我的输出是

代码如下:

#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;
}
#包括
#包括
主要()
{
int-var[3]={10100200};
int*ptr[3],i;
对于(i=0;i<3;i++)
{
ptr[i]=&var[i];//分配整数的地址。
}
对于(i=0;i<3;i++)
{
printf(“\n\n变量[%d]=”的值,i);
printf(“%d”,ptr[i]);//var[0]=10 var[1]=100 var[2]=200
}
getch();
返回0;
}

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

接下来,您将使用
ptr[i]
保存
var
数组元素的地址。因此,对于每个元素,
ptr[i]
值增加了
4

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

此外,还应更改打印语句

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


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

内存的每个字节与地址关联。在您的例子中,数组的每个元素在内存中占用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
内存地址

|0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |如果你实际上?我想这让每个人都感到困惑。int并不总是占用4个字节,它可能取决于实现/架构。。。确保的唯一方法是使用
sizeof(int)
。在过去,
sizeof(int)
通常是2(16位),规范只定义了一个最小范围,这就是为什么C99添加了
int16_t
int32_t
types@EliasVanOotegem在32位系统中,它是4个字节,因为询问者说它增加了4,所以情况就是这样!是的,我知道在OP an的情况下,INT是4字节宽的,但鉴于这样做的目的是作为未来用户的参考,需要注意的是,该标准没有强制执行4字节INT。考虑到C代码总是意味着尽可能的可移植,我想指出更一致(因此更可靠、更可移植)的类型
int16_t
int32_t
,我在回答中提到,这是32位系统的情况。此外,我还提到了底部的
int16\t
情况,不能保证4字节的int!不在32位系统上,也不在64位系统上。规范保证至少2个字节,16位为整数,不多不少。迂腐的旁注:“int的大小是4字节”应该是:int的大小几乎总是4字节,但根据标准保证至少是2字节。但99/99%的时间是4字节。也许考虑在我的答案中添加注释<代码>
printf("\n\nAddress of var[%d] = ",i);
         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