如何从void指针访问结构中的属性?

时间:2016-01-27 07:48:42

标签: c++ pointers struct

我有一项任务,我无法详细了解函数的作用,但我只知道id通常是什么。

所以我有一个函数,我们称之为“get_button”,在文档中我知道“它返回一个指向按钮结构的指针”。我知道按钮结构,它类似于:

struct button{
    int size;
    char title;
    short keyID;
};

该功能类似于:

void * get_button(int ID, int group)

但我不知道它的作用。

现在我想知道这个标题,但是使用编译器我得到了我有一个无效指针作为回报。那么我应该如何使用这个无效指针? ASAIK我必须使用static_cast来提供它的引用,但在这种情况下是一个结构;此外,我无法真正理解什么是铸造方式以及如何使编译器知道我想要某个结构。

这是一个特殊情况,我需要知道如何从void指针获取结构中的参数。我不知道我是否应该使用static_cast或其他任何东西(所以我无法理解它的引用)。在这种情况下,我都不需要知道如何使用propery一个void指针!我只需要知道如何访问struct中的属性。 我已经在这里和那里看到了其他的答案,但我找不到有价值的东西。

3 个答案:

答案 0 :(得分:3)

  

我无法真正理解什么是铸造意味着

你在下一个问题中回答自己:

  

如何让编译器知道我想要某个结构。

就是这样。转换意味着您告诉编译器该对象具有特定类型。

  

这是一个特殊情况,我需要知道如何从void指针获取结构中的参数。

首先,将void指针强制转换为它指向的对象的指针类型:*button。然后,您可以使用正确类型指针上的operator->正常访问该属性。

  

我不知道我是否应该使用static_cast或其他

当将void指针转换为另一个指针类型时,您确实应该使用static_cast

void* void_pointer = get_button(ID, group); // get the pointer
button* button_pointer = static_cast<button*>(void_pointer); // cast to the type of the pointed object
int size = button_pointer->size; // access the attribute through the pointer

答案 1 :(得分:1)

以下是使用您的结构转换为void指针的纯C旧样式的示例:

#include <iostream>

using namespace std;

struct button{
    int size;
    char title;
    short keyID;
};

int main()
{
    button b;
    b.size  = 1;
    b.title = 'c';
    b.keyID = 2;
    void *p = &b;
    button *a = (button *)p;
    std::cout << a->size << std::endl;
    std::cout << a->title << std::endl;
    std::cout << a->keyID << std::endl;
    return 0;
}

答案 2 :(得分:1)

指针基本上是内存中某个地址的地址,在您的情况下是一个按钮结构。 当指针的类型更改为void *时,该地址不会更改,因此,如果提供get_button函数的库保证返回的指针实际上指向有效的按钮结构,则可以安全地将其转换回按钮*为了使用它(将其视为为编译器提供一些额外信息)。

你可以按照以下方式进行:

void *what_is_returned = get_button();
button *the_button = static_cast<button *>(what_is_returned);
char the_character_you_want = the_button->title;

- &gt;运算符意味着“取消引用和访问成员”,它是解除引用左侧变量所包含的内容(查找地址,如* the_button)然后访问成员(如(* the_button).title)的简写,有效添加按钮结构中的标题成员偏移到按钮的地址并从那里获取字符。