2

我遇到了一些我不太理解的 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;

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

4

3 回答 3

1

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

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

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

于 2012-05-03T19:40:38.297 回答
1
  1. 您可以在指针类型之间进行转换,因为这是语言为您提供的灵活性。但是,您应该谨慎并知道您在做什么或可能出现问题。

  2. 不,使用属性指针类型有一个优势,因此不需要转换。如果这不可能,那么是否使用 void* 并不重要,尽管对于阅读您的代码的开发人员来说可能会更清楚一些。

于 2012-05-03T18:04:15.540 回答
0

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

实际上,指针就是一个指针——只是一个保存地址的变量。从理论上讲,您可以尝试强制该指针指向任何东西;一个结构,一个整数,一个(填空)。当您尝试将指向某事物的指针转换为指向其他事物的指针时,C 不会抱怨;它表明你知道你在做什么。如果你不这样做,天堂会帮助你:)

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

于 2012-05-03T18:07:31.080 回答