我有一个关于 C 中结构的问题。因此,当您创建结构时,您实际上是在定义内存块的框架。因此,当您创建结构体的实例时,您正在创建一个内存块,以便它能够保存一定数量的元素。
但是,我对点运算符的作用有些困惑。如果我有一个struct Car
并有一个名为GasMileage
(这是一个int
成员),我能够得到的值GasMileage
通过做类似的事情,
int x = CarInstance.GasMileage;
但是,我对这个点运算符实际发生的情况感到困惑。点运算符只是充当基地址的偏移量吗?它到底是如何推断出它是一个 int 的呢?
我想我很好奇幕后发生的事情。是否可以参考一下GasMileage
通过做其他事情?例如
int *GasMileagePointer = (&carInstance + offsetInBytes(GasMileage));
int x = *GasMileage
这只是我很快编造出来的。我努力寻找一个好的解释,但似乎没有什么比将点运算符视为魔法更能解释它了。
当您使用.
运算符,编译器将其转换为内部的偏移量struct
,基于其前面的字段(和填充)的大小。
例如:
struct Car {
char model[52];
int doors;
int GasMilage;
};
假设一个int
是 4 个字节并且没有填充,偏移量model
is 0
,偏移量doors
is 52
,以及偏移量GasMilage
is 56.
因此,如果您知道该成员的偏移量,则可以像这样获得指向它的指针:
int *GasMileagePointer = (int*)((char *)&carInstance + offsetInBytes(GasMile));
演员阵容char *
是必要的,以便指针算术一次进行 1 个字节而不是 1 个字节sizeof(carInstance)
一次。然后需要将结果转换为正确的指针类型,在本例中int *
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)