C结构点运算符究竟做了什么(低层透视)?

Izz*_*zzo 9 c struct

我对C中的结构有疑问.所以当你创建一个结构时,你实际上是在定义一块内存的框架.因此,当您创建结构的实例时,您正在创建一个内存块,以便它能够容纳一定数量的元素.

但是,我对点运算符的作用感到有些困惑.如果我有一个struct Car并且有一个成员GasMileage(这是一个int成员),我可以GasMileage通过做类似的事情来获得价值,

int x = CarInstance.GasMileage;
Run Code Online (Sandbox Code Playgroud)

但是,我对这个点运算符实际发生的事情感到困惑.点运算符是否只是作为基址的偏移量?它究竟是如何推断出它是一个整数?

我想我对幕后发生的事情很好奇.GasMileage通过做其他事情可以参考吗?如

int *GasMileagePointer = (&carInstance + offsetInBytes(GasMileage));
int x = *GasMileage
Run Code Online (Sandbox Code Playgroud)

这只是我快速弥补的事情.我一直在努力寻找一个好的解释,但似乎没有什么比将点运算符视为魔术更能解释它了.

dbu*_*ush 6

当您使用.运算符时,编译器会struct根据其前面的字段(和填充)的大小将其转换为内部的偏移量.

例如:

struct Car {
    char model[52];
    int doors;
    int GasMilage;
};
Run Code Online (Sandbox Code Playgroud)

假设a int是4个字节且没有填充,则偏移量model0,偏移量为doorsis 52,偏移量GasMilage为56.

因此,如果您知道成员的偏移量,您可以像这样获得指向它的指针:

int *GasMileagePointer = (int*)((char *)&carInstance + offsetInBytes(GasMile));
Run Code Online (Sandbox Code Playgroud)

必须使用强制转换char *,以便指针算法一次变为1个字节而不是每次1个字节sizeof(carInstance).然后,在这种情况下,结果需要转换为正确的指针类型int *