typedef 和 结构自引用问题

(1)不用typedef,这个时候,我们定义结构并使用的时候,都是前面有struct的,

这个时候struct sName 是一个整体,不可分割,所以,我们在自引用的时候是这样的:

struct Tnode{
         struct Tnode *left; // 关键字 struct 是必须要有的
         struct Tnode *right;
        int value;
};

在用这个结构定义变量的时候也一样,必须要有struct 这个关键字才行。所以,我们必须这样(在C语言中):

struct Tnode{
         struct Tnode *left;
         struct Tnode *right;
        int value;
};

int main()
{
    struct Tnode *root; 
    return  0;   
}

但是在c++中,却不是这样的,并没有把 struct sName 看成一个整体,所以这样是可以的:

struct Tnode{
        Tnode *left;
        Tnode *right;
       int value;
};
int main()
{
    Tnode* root;  
    return  0;  
}

你定义了Tnode之后,就可以直接把Tnode 拿来用,而不需要加上 struct 这个关键字。

我想这也是c++的一个相对C来改进的地方。

(2)会到C语言,也许正式因为有这个不方便,才引入了typedef 的,所以很显然:typedef 必须是有两个名字的,type A B;

一般说来,A是比B更早存在的,所以:

typedef struct Tnode{
        Tnode* left;
        Tnode* right;
       int value;
}Node;

int main()

    Node *root;

    return  0;  
}

得出: struct Tnode = Node,所以用Node的时候就不用写成 struct TNode 了,方便很多。

所以,你非要用Tnode 的话,只能是struct Tnode * root了。

当然以上说的都是在C 语言中,而不是c++。

今天算是搞明白了很多,一直困惑着。

刚才提到,在C++ 中可不用这么麻烦,所以在c++中,是不用typedef的(其实我不确定),至少从结构体定义使用上来说是不需要的,因为已经很方便,但是,很显然的是,当我们真的想用一个自己喜欢的名字代替别的名字的时候,就会用到了,比如你想用简单的代替,例如:

typedef struct Tnode{
        Tnode* left;
        Tnode* right;
       int value;
} A;

int main()
{
    A *root; //这些写成 Tnode *root 也是可以的,这就是和C的区别,必须要加上struct。
}

所以,其实在C中,struct 之后的这个 叫结构标记,是可选的,一般说来 并不用,比如:

typedef struct {

int x;

int y;

} Point; 这就可以了,以后就可以直接用 Point。

之所有需要有个标记,其实是为了 自引用(我觉得这至少是一个原因),因为要是没这个标记,按照现在定义的顺序,怎么标记自己?

因为自己的名字Point 在最后才出现,之前是不能用的,所以前面多一个标记,就能让你自引用了。

所以,当你不需要自引用的时候,你就可以不用写 struct之后的结构标记,直接在后面写结构名,然后就可以直接用了。

看来c++ 做的确实把C中这一方面复杂的逻辑改进很多,呵呵。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值