我遇到过一些我不太了解的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;
//编辑删除字符串部分,因为这不是问题的重点。
答案 0 :(得分:1)
您可以在指针类型之间进行转换,因为这是语言为您提供的灵活性。但是,你应该谨慎,知道你在做什么或可能出现问题。
没有。使用属性指针类型是有利的,因此不需要转换。如果这是不可能的,那么使用void *并不重要,尽管开发人员阅读代码可能会稍微清楚一点。
答案 1 :(得分:1)
1)如上所述,您可以转换为C中的任何指针类型。(C ++可能有更复杂的规则,我不知道其中的详细信息)......
2)char*
vs void*
的好处是您可以对char*
执行指针运算,但不能对void*
执行指针运算。
基于您发布的代码,执行指针运算的智慧可能是有问题的,但对于具有可变长度“数据”的结构,它通常很方便。
答案 2 :(得分:0)
我认为你只是遇到了C的经典“双刃剑”之一。
实际上,指针是一个指针 - 只是一个包含地址的变量。理论上,你可以试图强制指针指向任何东西;一个struct,一个int,一个(填空)。当你试图将指向一个东西的指针转换为其他东西的指针时,C不会抱怨;它表明你知道你在做什么。如果你不这样做天堂帮助你:)
实际上,是的,一个void *可能是一种更恰当的方式来声明一个可以指向任何东西的指针,但我不确定它在操作上有多大的区别。不会发誓到这一点,因为可能存在编译器优化,如果指针是强类型的话可能会发生...