【问题标题】:Casting a void pointer to a struct将 void 指针转换为结构
【发布时间】:2023-03-26 14:38:04
【问题描述】:

我开始对 C 感到满意,然后我遇到了类型转换。如果我在 *.h 文件中定义了以下内容

struct data {
    int value;
    char *label;
};

这在另一个 *.h 文件中

# define TYPE      void*

如何将 void 指针转换为结构,以便可以使用传递给函数的变量“TYPE val”?例如,如果我想利用 TYPE val 指向的值,我如何转换它以便可以将该值传递给其他函数?

【问题讨论】:

  • #define TYPE void* 是个坏主意。它至少应该是typedef。考虑以下声明中会发生什么:TYPE x, y;const TYPE x;
  • 另外,如果您正在处理void* 指针和C,则不需要进行任何显式转换。 C 允许 void* 指针被隐式强制转换:void* p = ...; struct data* val = p;.
  • @jamesdlin 我同意这是一个坏主意,但这不是我的主意,所以我必须接受。因此,当 TYPE val 作为 void 指针传递给函数时,我可以简单地声明 struct data* temp = val; 然后将 temp 传递给函数,然后我应该能够使用 temp->value?
  • 是的,然后你可以使用temp->value
  • 谢谢,您的回答简单实用。如果它发布在答案部分,我会给它一个赞成票。

标签: c casting void


【解决方案1】:
(struct data*)pointer

将指向 void 的指针转换为指向 struct data 的指针。

【讨论】:

  • 也许我把它打死了,但在上面的例子中,这意味着为了将 TYPE val 转换为结构指针,以便我可以得到它指向的值,我会这样做这个:(结构数据*)val?这究竟是做什么的?如果我继续声明一个变量'int num =(struct * data)val',那会得到val指向的数字还是val指向的内存地址?如果是后者,我如何将其转换为 'val' 感谢您的耐心等待。
  • @user1852050 您混淆了结构变量和指向结构变量的指针。当您需要获取指向结构的指针时,您可以使用 & 运算符。
  • 所以我可以为一个临时结构声明和分配内存,然后给它 &val 的值?与 temp = &val 一样。然后使用 temp->value? 获取值
  • 你好像不懂指针。指向事物的指针就像街道上房屋的地址,但它们不是房屋本身。要在 C 中获取 house 的地址,请执行 &house。要通过 C 中的地址/指针获取house,您可以使用*pointer。如果pointer 先前已作为pointer = &house; 获得并且如果pointer 指向house 的类型,则*pointer 等价于*(&house) 并最终等价于house
  • 指向一些非 void 类型 T 的指针,与指向 void 的指针不同,可以取消引用(这就是我们对 *pointer 所做的)并在此过程中返回一个类型为 @987654338 的对象@。因此,如果您将指向house 类型的指针(指向一个house)转换为指向castle 类型的指针,那么解除对转换后的指针的引用不会为您提供@987654342 类型的对象@,因为实际上指针仍然指向house
【解决方案2】:

类型转换 void 指向结构的指针可以在下面完成

void *vptr;
typedef struct data
{
   /* members */
} tdata;

为此,我们可以将类型转换为 struct 假设你想将此 vptr 作为结构变量发送给某个函数

然后

void function (tdata *);
main ()
{
    /* here is your function which needs structure pointer 
       type casting void pointer to struct */
    
    function((tdata *) vptr);
}

注意:我们可以将 void 指针类型转换为任何类型,这就是 void 指针的主要用途。

【讨论】:

  • 为什么这被否决了?它提出了一些有效的观点(例如we can typecast void pointer to any type),并且确实回答了问题(尽管不是很清楚)
猜你喜欢
  • 1970-01-01
  • 2016-11-10
  • 2023-02-26
  • 2014-01-13
  • 1970-01-01
  • 2016-01-12
  • 2021-08-05
  • 1970-01-01
  • 2012-05-05
相关资源
最近更新 更多