C typedef指向结构的指针

时间:2009-10-09 13:22:28

标签: c pointers struct typedef

我遇到过以下代码:

typedef struct {
        double x;
        double y;
        double z;
} *vector;

这是一个有效的类型定义吗?代码编译并运行正常。如果这是常见做法,我只是好奇。

6 个答案:

答案 0 :(得分:54)

绝对有效。 通常,您可以通过一起定义两种类型来充分利用这种方式:

typedef struct
{
 int a;
 int b;
} S1, *S1PTR;

其中S1是结构,S1PTR是指向此结构的指针。

答案 1 :(得分:25)

是的。但它的风格很糟糕。不是结构的直接声明,而是直接声明指针类型。它是混淆,当你想要读取代码时,给定变量或参数是指针(以及数组的较小程度)的信息是极其重要的。

在查看代码时,通常很难看到哪些功能可能会产生副作用。如果使用的类型隐藏了这些信息,则会给读者增加记忆负担。

int do_fancy(vector a, vector b); 

int do_fancy(vector *a, vector *b);

在第一种情况下,我很容易错过该功能可能会改变a或b的内容。在第二个我警告。

当实际编写代码时,我也直接知道编写a->x而没有让编译器告诉我error: request for member x',而不是结构或联合`。

我知道,它看起来像个人品味的东西,但是使用了很多外部代码,我可以向你保证,当你不认识到间接级别的变量时,它会非常烦人。这也是我不喜欢C ++引用的原因之一  (在Java中,并不是因为所有对象都是通过引用传递的,它是一致的)和Microsoft的LPCSTR类型。

答案 2 :(得分:3)

是的,它是有效的。如果您需要更多“安全性”,您也可以

typedef struct vector_{
        double x;
        double y;
        double z;
} *vector;

然后你可以同时使用

struct vector_ *var;
vector var;

但不要忘记结束分号。

仅使用typedef意味着您可以这样命名。否则它或多或少都是匿名的。

答案 3 :(得分:2)

它是有效的,它的作用是定义一种新类型。正如@Alex所说,定义类型和指针类型会很有用。

您可以使用

创建更多指针
S1PTR ptr1, ptr2, ptr3, ...;  

而不是

S1 *ptr1, *ptr2, *ptr3, ...;

答案 4 :(得分:1)

是的,它有效,如上面的答案所述。一个小小的建议,如果您提供标签名称也会更好,如下所示。这将有助于某些IDE更好地解析您的代码。

typedef struct vactor_tag {
        double x;
        double y;
        double z;
} *vector;

答案 5 :(得分:-2)

是的......每次声明向量结构或指向它的指针时,都可以省去不断输入'struct'这个词的麻烦。