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