我写了以下代码。
#include<stdio.h>
int main()
{
int x = 1 ;
int *j = &x ;
int y = 2 ;
int *t = &y ;
printf("%p\n" , (void *)j);
printf("%p" , (void *)t);
}
输出为0028FF14 0028FF10
。
我想说的是,地址之间的区别是“4&#39;。
而在这种情况下
#include<stdio.h>
int main()
{
char x = 't' ;
char *j = &x ;
char y = 'f' ;
char *t = &y ;
printf("%p\n" , (void *)j);
printf("%p" , (void *)t);
}
输出为0028FF17 0028FF16
区别在于1
。
第一种情况的差异是4
。而在第二种情况下,它是1
。为什么会这样?
如果我单独在所有内存地址打印值,我会得到什么?
也许这是非常普遍和已知的,但我刚开始使用C,所以该程序的输出让我感到困惑。
更新
现在使用%p
格式并将指针值转换为void*
以按照Keith Thompson的建议打印指针值。
答案 0 :(得分:3)
对于在内存中布置声明对象的顺序没有要求。显然,您正在使用的编译器恰好将x
和y
放在一起。 可以在它们之间放置j
,但它没有。{/ p>
此外,打印指针值的正确方法是使用%p
格式并将指针值转换为void*
:
printf("%p\n", (void*)j);
printf("%p\n", (void*)t);
这产生了一个实现定义的指针值的人类可读表示,通常但不总是十六进制。
如果你关心关于在内存中分配声明变量的顺序,你可能做错了,或者至少没用。让编译器担心放东西的位置。它知道它在做什么。
答案 1 :(得分:2)
对于初学者而言,差异并不总是四个,恰好是幸运巧合恰好是四个。允许编译器将变量粘贴到内存中。在这种情况下,它将两个变量放在内存中,并且差异可以解释为系统中的整数大小(4个字节)以及系统中的字符大小(1个字节)。在其他系统上,它们可能大小不同,并放置在不同的位置。
答案 2 :(得分:1)
每个整数占用四个字节,因此,每个整数存储器地址偏移4.一个字符只占用一个字节,因此它的存储器地址偏移一个。