您的位置 首页 方案

struct和typedef struct

分三块来讲述:1首先:注意在C和C++里不同在C中定义一个结构体类型要用typedef:typedefstructStudent

分三块来叙述:

  1 首要://留意在C和C++里不同
    在C中界说一个结构体类型要用typedef:
    typedef struct Student
    {
    int a;
    }Stu;
    所以在声明变量的时分就可:Stu stu1;(假如没有typedef就有必要用struct Student stu1;来声明)
    这儿的Stu实际上便是struct Student的别号。Stu==struct Student
    别的这儿也能够不写Student(所以也不能struct Student stu1;了,有必要是Stu stu1;)
    typedef struct
    {
    int a;
    }Stu;
    但在c++里很简略,直接
    struct Student
    {
    int a;
    };    
    所以就界说了结构体类型Student,声明变量时直接Student stu2;
======================================================================================

  2.其次:
    在c++中假如用typedef的话,又会形成差异:
    structStudent
    {
    inta;
    }stu1;//stu1是一个变量


    typedefstructStudent2
    {
    inta;
    }stu2;//stu2是一个结构体类型=struct Student


    运用时能够直接拜访stu1.a
    可是stu2则有必要先stu2 s2;
    然后s2.a=10;
======================================================================================

  3 把握上面两条就能够了,不过最终咱们探讨个没多大联系的问题
    假如在c程序中咱们写:
    typedef struct
    {
    int num;
    int age;
    }aaa,bbb,ccc;
    这算什么呢?
    我个人调查编译器(VC6)的了解,这相当于
    typedef struct
    {
    int num;
    int age;
    }aaa;
    typedef aaa bbb;
    typedef aaa ccc;
    也便是说aaa,bbb,ccc三者都是结构体类型。声明变量时用任何一个都能够,在c++中也是如此。可是你要留意的是这个在c++中假如写掉了typedef关键字,那么aaa,bbb,ccc将是天壤之别的三个目标。

    //此处不是很了解。

  

    typedef struct和struct的差异:

    typedef struct tagMyStruct
    {
     int iNum;
     long lLength;
    } MyStruct;

    上面的tagMyStruct是标识符,MyStruct是变量类型(相当于(int,char等))。

    这句子实际上完结两个操作:

      1) 界说一个新的结构类型

    struct tagMyStruct
    {  
     int iNum;
     long lLength;
    };

  剖析:tagMyStruct称为“tag”,即“标签”,实际上是一个暂时姓名,不管是否有typedefstruct 关键字和tagMyStruct一同,构成了这个结构类型,这个结构都存在。

  咱们能够用struct tagMyStruct varName来界说变量,但要留意,运用tagMyStruct varName来界说变量是不对的,由于struct 和tagMyStruct合在一同才干表明一个结构类型。

  2) typedef为这个新的结构起了一个姓名,叫MyStruct。

    typedef struct tagMyStruct MyStruct;

  因而,MyStruct实际上相当于struct tagMyStruct,咱们能够运用MyStruct varName来界说变量。

  2.

    typedef struct tagMyStruct
    {
     int iNum;
     long lLength;
    } MyStruct;

    在C中,这个申明后请求结构变量的办法有两种:

    (1)struct tagMyStruct 变量名

    (2)MyStruct 变量名

    在c++中能够有

    (1)struct tagMyStruct 变量名

    (2)MyStruct 变量名

    (3)tagMyStruct 变量名

typedef struct与struct的差异

1. 底子解说

typedef为C言语的关键字,作用是为一种数据类型界说一个新姓名。这儿的数据类型包括内部数据类型(int,char等)和自界说的数据类型(struct等)。

在编程中运用typedef意图一般有两个,一个是给变量一个易记且含义清晰的新姓名,另一个是简化一些比较复杂的类型声明。

至于typedef有什么奇妙之处,请你接着看下面临几个问题的详细论述。

2. typedef & 结构的问题

当用下面的代码界说一个结构时,编译器报了一个过错,为什么呢?难道C言语不答应在结构中包括指向它自己的指针吗?请你先猜测一下,然后看下文阐明:

typedef struct tagNode
{
 char *pItem;
 pNode pNext;
} *pNode;

答案与剖析:

1、typedef的最简略运用

typedef long byte_4;

给已知数据类型long起个新姓名,叫byte_4。

2、 typedef与结构结合运用

typedef struct tagMyStruct
{
 int iNum;
 long lLength;
} MyStruct;

这句子实际上完结两个操作:

1) 界说一个新的结构类型

struct tagMyStruct
{
 int iNum;
 long lLength;
};

剖析:tagMyStruct称为“tag”,即“标签”,实际上是一个暂时姓名,struct 关键字和tagMyStruct一同,构成了这个结构类型,不管是否有typedef,这个结构都存在。

咱们能够用struct tagMyStruct varName来界说变量,但要留意,运用tagMyStruct varName来界说变量是不对的,由于struct 和tagMyStruct合在一同才干表明一个结构类型。

2) typedef为这个新的结构起了一个姓名,叫MyStruct。

typedef struct tagMyStruct MyStruct;

因而,MyStruct实际上相当于struct tagMyStruct,咱们能够运用MyStruct varName来界说变量。

答案与剖析

C言语当然答应在结构中包括指向它自己的指针,咱们能够在树立链表等数据结构的完结上看到很多这样的比如,上述代码的底子问题在于typedef的使用。

依据咱们上面的论述能够知道:新结构树立的过程中遇到了pNext域的声明,类型是pNode,要知道pNode表明的是类型的新姓名,那么在类型自身还没有树立完结的时分,这个类型的新姓名也还不存在,也便是说这个时分编译器底子不认识pNode。

处理这个问题的办法有多种:

1)、

typedef struct tagNode
{
 char *pItem;
 struct tagNode *pNext;
} *pNode;

2)、

typedef struct tagNode *pNode;
struct tagNode
{
 char *pItem;
 pNode pNext;
};

留意:在这个比如中,你用typedef给一个还未彻底声明的类型起新姓名。C言语编译器支撑这种做法。

3)、标准做法:

typedef uint32 (* ADM_READDATA_PFUNC)( uint16*, uint32 );

这个曾经没有看到过,个人认为是宇界说一个uint32的指针函数,uint16*, uint32 为函数里的两个参数; 应该相当于#define uint32 (* ADM_READDATA_PFUNC)( uint16*, uint32 );

struct在代码中常见两种方式:
struct A
{
//…
};

struct
{
//…
} A;
这其实是两个彻底不同的用法:
前者叫做“结构体类型界说”,意思是:界说{}中的结构为一个名称是“A”的结构体。
这种用法在typedef中一般是:
typedef struct tagA //成心给一个不同的姓名,作为结构体的实名
{
//…
} A; //结构体的别号。

后者是结构体变量界说,意思是:以{}中的结构,界说一个名称为”A”的变量。这儿的结构体称为匿名结构体,是无法被直接引证的。
也能够经过typedef为匿名结构体创立一个别号,然后使得它能够被引证:
typedef struct
{
//…
} A; //界说匿名结构体的别号为A

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/fangan/256763.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部