与阵列相比,我对结构的内存组织有点困惑.数组元素可以通过数组中第一个元素的内存地址访问,并偏移到所需的索引.现在编译器如何评估结构成员的地址?
struct name
{
int a;
float b;
};
int main()
{
struct name *ptr,pt,p;
p.a=4;
p.b=4.5;
ptr=&pt;
ptr->a=5;
ptr->b=10.5;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译器如何知道,在a结构变量中存储成员值的位置p以及编译器如何评估成员的偏移量和地址b
在第二种情况下,ptr包含对结构变量的引用pt.编译器如何知道成员的内存地址.
在编译时,编译器知道a的大小struct和其成员的偏移量.对于您struct name,编译器会找出以下信息.
struct namea为零,偏移量为b非零.struct name可能的布局看起来像:
<--- Size of struct ----------------> +-----------------+-----------------+ | | | +-----------------+-----------------+ ^ | Address of ptr ^ ^ | | offset of a (0) offset of b (non-zero)
给定指针指向a的地址struct name,编译器确切地知道要获得成员的a偏移量以及要获得成员的偏移量b.