char * ptr to struct

时间:2012-05-03 18:02:08

标签: c

我遇到过一些我不太了解的C代码。以下编译并运行得很好。 1)为什么我可以将char *转换为struct *和2)使用这个成语而不是void *是否有任何优势?

struct foo
{
    int a;
    int b;
    char *nextPtr;
};

. . .

// This seems wrong
char *charPtr = NULL;

// Why not
//void *structPtr = NULL;

struct foo *fooPtr;
fooPtr = (struct foo*)charPtr;

//编辑删除字符串部分,因为这不是问题的重点。

3 个答案:

答案 0 :(得分:1)

  1. 您可以在指针类型之间进行转换,因为这是语言为您提供的灵活性。但是,你应该谨慎,知道你在做什么或可能出现问题。

  2. 没有。使用属性指针类型是有利的,因此不需要转换。如果这是不可能的,那么使用void *并不重要,尽管开发人员阅读代码可能会稍微清楚一点。

答案 1 :(得分:1)

1)如上所述,您可以转换为C中的任何指针类型。(C ++可能有更复杂的规则,我不知道其中的详细信息)......

2)char* vs void*的好处是您可以对char*执行指针运算,但不能对void*执行指针运算。

基于您发布的代码,执行指针运算的智慧可能是有问题的,但对于具有可变长度“数据”的结构,它通常很方便。

答案 2 :(得分:0)

我认为你只是遇到了C的经典“双刃剑”之一。

实际上,指针是一个指针 - 只是一个包含地址的变量。理论上,你可以试图强制指针指向任何东西;一个struct,一个int,一个(填空)。当你试图将指向一个东西的指针转换为其他东西的指针时,C不会抱怨;它表明你知道你在做什么。如果你不这样做天堂帮助你:)

实际上,是的,一个void *可能是一种更恰当的方式来声明一个可以指向任何东西的指针,但我不确定它在操作上有多大的区别。不会发誓到这一点,因为可能存在编译器优化,如果指针是强类型的话可能会发生...