【发布时间】:2016-02-23 21:56:34
【问题描述】:
我有一个关于 C 中的结构的问题。因此,当您创建一个结构时,您实际上是在定义一块内存的框架。因此,当您创建结构的实例时,您正在创建一个内存块,以便它能够容纳一定数量的元素。
但是,我对点运算符的作用有些困惑。如果我有一个struct Car 并且有一个名为GasMileage 的成员(这是一个int 成员),我可以通过执行类似的操作来获得GasMileage 的值,
int x = CarInstance.GasMileage;
但是,我对这个点运算符的实际情况感到困惑。点运算符是否只是作为基地址的偏移量?它又是如何推断出它是一个 int 的呢?
我想我很好奇幕后发生了什么。是否可以通过做其他事情来引用GasMileage?比如
int *GasMileagePointer = (&carInstance + offsetInBytes(GasMileage));
int x = *GasMileage
这只是我迅速编造出来的。我一直在努力寻找一个好的解释,但似乎没有什么比将点运算符视为魔术更能解释它了。
【问题讨论】:
-
How can I get/set a struct member by offset。至少解决您问题的第二部分。
-
也许一本关于编译器构造的书会是一本不错的读物。
-
@Olaf:您无需了解编译器构造即可了解
.运算符的语义。 -
编译器推断
CarInstance.GasMileage是int,因为GasMileage成员被定义为int。 -
@KeithThompson:OP 要求提供实施细节。这是 CC 的一部分。此外,我预计这不会是他在这个领域可能遇到的唯一问题。所以打好基础是个好主意。