我正在进行指针练习,在尝试代码时遇到了疑问。为什么数组中的这些内存地址增加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;
}
答案 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)