我开始觉得熟悉 C 语言,但遇到了类型转换问题。如果我在一个 *.h 文件中定义了以下内容:
struct data {
int value;
char *label;
};
并且这个在另一个*.h文件中
# define TYPE void*
我该如何将空指针转换为结构体,以便在函数中使用传递给它的变量“TYPE val”?例如,如果我想利用TYPE val所指向的值,我应该如何进行类型转换,以便将该值传递给另一个函数?
(struct data*)pointer
将指向 void
的指针转换为指向 struct data
的指针。
house
的地址,可以使用&house
。在C语言中通过地址/指针获取house
,可以使用*pointer
。如果之前已经获得了pointer = &house;
,并且pointer
指向house
类型,则*pointer
等同于*(&house)
,最终等同于house
。 - Alexey FrunzeT
的指针,与指向 void
的指针不同,可以被解引用(这就是我们使用 *pointer
所做的),并在此过程中返回一个类型为 T
的对象。因此,如果您将指向一个 house
类型(指向一个 house
)的指针转换为指向 castle
类型的指针,那么解引用转换后的指针将不会给您一个 castle
类型的对象,因为实际上指针仍然指向一个 house
。 - Alexey Frunze->
解引用它以获取这些部件,例如通过执行类似于 pointer->kitchen
的操作,这相当于 (*pointer).kitchen
,即首先获取整个结构体,然后从中提取 kitchen
。 - Alexey Frunzevoid *vptr;
typedef struct data
{
/* members */
} tdata;
对于这个问题,我们可以将其强制转换为结构体类型。假设您想要将该vptr作为结构体变量发送到某个函数,则如下:
然后:
void function (tdata *);
main ()
{
/* here is your function which needs structure pointer
type casting void pointer to struct */
function((tdata *) vptr);
}
#define TYPE void*
是一个不好的想法。它至少应该是一个typedef
。考虑以下声明会发生什么:TYPE x, y;
或者const TYPE x;
。 - jamesdlinvoid*
指针时,并不需要进行任何显式的类型转换。C 允许对void*
指针进行 隐式 转换:void* p = ...; struct data* val = p;
。 - jamesdlinTYPE val
作为void指针传递到函数中时,我可以简单地声明struct data* temp = val;
,然后将temp传递给函数,然后我应该能够使用temp->value? - user1852050temp->value
。 - jamesdlin