这个*(取消引用运算符)在枚举声明中做了什么?

时间:2012-11-06 12:44:23

标签: c pointers enums

在代码中逐步浏览其他代码,我发现* 这是什么?

这是该代码的原型,并没有给出任何错误。 gcc 4.5.2只发出警告但是在Windows上它没有发出警告并正确编译。由于公司的IP,我无法提供实际代码,但我想知道这是如何以及为什么这是正确的?

#include<stdio.h>

typedef enum e
{
        a,
        b,
        c
}x,*y;

int main()
{
        x t=4;
        printf("x : %d\n",t);
        y m=5;
        printf("*y : %d\n",m);
        return 0;
}

3 个答案:

答案 0 :(得分:6)

相当于:

typedef enum e *y;

因此yenum e *的别名,即y mm声明为enum e的指针。以下代码确实按预期工作:

#include <stdio.h>

x t = 4;
printf("x : %d\n", t);
y m = &t;
printf("*y : %d\n", *m);

答案 1 :(得分:5)

这只是一般模式typedef TYPE * NAME的一个特例,它只是意味着“从这一点开始,NAME是”指向TYPE的指针“的别名。 ,TYPE可以是任何有效的类型声明。

一般来说,我反对typedef:像这样删掉星号,因为它会使使用该类型的代码非常混乱。 C中的指针非常重要,通常很高兴知道你是否有一个值或只是一个指向值的指针,这种做法会使这个事实隐藏起来。

答案 2 :(得分:2)

它不是deference运算符(在此用法中),它是指向enum e的指针。

你收到警告的原因可能是这一行:

y m=5;

您正在为指针指定一个整数。您需要为其分配一个地址:

y m=&t;