结构是编译器用来确定从结构开始的内存区域的开头到结构的各个成员的偏移量的描述或模板。
如果您使用结构创建单个非数组变量,编译器将为该变量分配内存。内存的大小将取决于结构的大小,而结构的大小又取决于结构成员的类型。
使用结构定义的数组是单个结构成员的数组。当您访问数组元素时,编译器会根据所使用的数组索引和结构的大小来计算内存偏移量。
结构的行为类似于 int 等内置类型。您可以声明一个 int 或一个结构,一个 int 或一个结构的数组,或者一个指向一个 int 或一个结构的指针。
int 和 struct 之间的主要区别在于 int 是内置类型,其中 struct 由程序员创建并描述为新类型。
然而,我发现将所有数据类型(内置或由程序员指定)视为内存区域的模板是最有帮助的,编译器使用它来跟上内存区域的地址,类型内存区域,内存区域的大小,内存区域允许哪些动作。
重要的一点是,当您在 C 中进行赋值时,将其视为一个内存区域到另一个内存区域的副本,除了使用memcpy()
函数执行相同的内存复制之外没有任何智能。因此,当一个包含指针的结构变量分配给另一个结构变量时,两个结构变量将具有相同的指针,指向相同的内存区域。
然而,struc 和内置类型之间的赋值、指针计算和其他行为的基础非常相似。
typedef struct {
int iValue;
int jValue;
} MyStruct;
{
int iLoneInt, jLoneInt;
int *piLoneInt;
MyStruct aStruct, bStruct;
MyStruct *paStruct;
// simple assignment
iLoneInt = 1;
aStruct.iValue = 1; // specify the struct member
// assignment of one variable to another
bStruct = aStruct; // copies the value in memory region aStruct to bStruct
jLoneInt = iLoneInt; // copies the value in memory region iLoneInt to jLoneInt
memcpy (&bStruct, &aStruct, sizeof(MyStruct)); // same as assignment
memcpy (&jLoneInt, &iLoneInt, sizeof(int)); // same as assignment
piLoneInt = &iLoneInt; // gets address of memory region iLoneInt
paStruct = &aStruct; // gets address of memory region aStruct
jLoneInt = *piLoneInt; // copies value in memory region pointed to by piLineInt to jLoneInt
bStruct = *paStruct; // copies value in memory region pointed to by paStruct to bStruct
memcpy (&bStruct, paStruct, sizeof(MyStruct)); // same as assignment