不使用“.”访问结构成员或“->”运算符
Access structure members without using '.' or '->' operator
如何在不使用“.”的情况下从戴尔笔记本电脑定义中访问 keyValue 和 alternateKeyValue或“->”运算符直接引用 qwerty 结构或其成员。
我尝试寻找解决方案,但没有找到。你能帮我想办法访问它吗?
typedef enum
{
MOUSE_NONE,
MOUSE_UP,
MOUSE_DOWN,
MOUSE_LEFT,
MOUSE_RIGHT,
} mouse_direction_E;
typedef struct
{
bool leftButton;
bool rightButton;
bool middleButton;
bool mouseOn;
mouse_direction_E direction;
} mouse_S;
typedef struct
{
char keyValue;
char alternateKeyValue;
} keyboard_S;
typedef struct
{
mouse_S simpleMouse;
keyboard_S qwerty;
} laptop_S;
laptop_S dell =
{
.simpleMouse =
{
.leftButton = false,
.rightButton = false,
.middleButton = false,
.mouseOn = false,
.direction = MOUSE_NONE,
},
.qwerty =
{
.keyValue = '5',
.alternateKeyValue = '%'
},
};
这听起来像是一道作业题....
这个怎么样:
int index = 0;
bool leftMouseButton = *( (bool *) &( ( (char*) &dell )[0]) );
/* \ 1 /
* \ 2 /
* /
* \___________ 4 _________/
* \_ 5 _/
* \_________________ 6 _________________/
*/
bool rightMouseButton = *( (bool *) &( ( (char*) &dell )[ sizeof(bool) - 1 ]) );
/* etc. Enjoy the math! */
换言之:
对于位于 x
字节深处的任何结构元素 dell
- 获取
dell
的地址
- 将指针地址转换为字节(字符)数组——或者如果所有结构内容的大小与
int
相同,则将地址转换为 int*
(请记住相应地调整后续数学!)
- 确定所需元素距结构开头的偏移量
dell
。
- 获取所需元素的地址。
- 将该地址转换为与我们当前使用的元素类型相同的指针。
- 在我们当前使用的元素的地址处获取数据。也就是说:获取元素的值。
告诉我作业的完成情况!
如何在不使用“.”的情况下从戴尔笔记本电脑定义中访问 keyValue 和 alternateKeyValue或“->”运算符直接引用 qwerty 结构或其成员。
我尝试寻找解决方案,但没有找到。你能帮我想办法访问它吗?
typedef enum
{
MOUSE_NONE,
MOUSE_UP,
MOUSE_DOWN,
MOUSE_LEFT,
MOUSE_RIGHT,
} mouse_direction_E;
typedef struct
{
bool leftButton;
bool rightButton;
bool middleButton;
bool mouseOn;
mouse_direction_E direction;
} mouse_S;
typedef struct
{
char keyValue;
char alternateKeyValue;
} keyboard_S;
typedef struct
{
mouse_S simpleMouse;
keyboard_S qwerty;
} laptop_S;
laptop_S dell =
{
.simpleMouse =
{
.leftButton = false,
.rightButton = false,
.middleButton = false,
.mouseOn = false,
.direction = MOUSE_NONE,
},
.qwerty =
{
.keyValue = '5',
.alternateKeyValue = '%'
},
};
这听起来像是一道作业题....
这个怎么样:
int index = 0;
bool leftMouseButton = *( (bool *) &( ( (char*) &dell )[0]) );
/* \ 1 /
* \ 2 /
* /
* \___________ 4 _________/
* \_ 5 _/
* \_________________ 6 _________________/
*/
bool rightMouseButton = *( (bool *) &( ( (char*) &dell )[ sizeof(bool) - 1 ]) );
/* etc. Enjoy the math! */
换言之:
对于位于 x
字节深处的任何结构元素 dell
- 获取
dell
的地址
- 将指针地址转换为字节(字符)数组——或者如果所有结构内容的大小与
int
相同,则将地址转换为int*
(请记住相应地调整后续数学!) - 确定所需元素距结构开头的偏移量
dell
。 - 获取所需元素的地址。
- 将该地址转换为与我们当前使用的元素类型相同的指针。
- 在我们当前使用的元素的地址处获取数据。也就是说:获取元素的值。
告诉我作业的完成情况!