精华内容
下载资源
问答
  • 在学习数据结构的时候,我经常遇到typedef struct,刚开始感觉很别扭,查阅资料之后才真真理解了。 先从结构体说起。 1、结构体用法 struct Student{ int age; char s; } 如果要定义一个该结构体变量,就需要:...

    在学习数据结构的时候,我经常遇到typedef struct,刚开始感觉很别扭,查阅资料之后才真真理解了。

    先从结构体说起。

    1、结构体用法

    struct Student{
    int age;
    char s;
    }
    

    如果要定义一个该结构体变量,就需要:struct Student st1;

    有没有觉得很麻烦,我们隐隐约约察觉到,多写一个struct很费劲,因此才有了下面的typedef

    2、如果我们使用:

    typedef struct Student{
    int age;
    char s;
    }Stu
    

    那么我们定义该结构体变量的时候,就可以使用

    Stu st1;
    

    有没有觉得很省事,的确是这样。但是,还可以更省事,请看下面:

    3、
    我们也可以直接省略掉Student

    typedef struct{
    int age;
    char s;
    }Stu;
    

    就可以直接使用 Stu st1;

    展开全文
  • 结构体定义 typedef struct 用法详解和用法小结 文章目录结构体定义 typedef struct 用法详解和用法小结0. 前言1. 首先:在C中定义一个结构体类型要用typedef:2....typedef struct 是为了使用这个结构体方

    结构体定义 typedef struct 用法详解和用法小结

    0. 前言

    • typedef是类型定义的意思。
    • typedef struct 是为了使用这个结构体方便。

    具体区别在于:

    • struct node {}这样来定义结构体的话。在申请node的变量时,需要这样写,struct node n;
    • 若用typedef,可以这样写,typedef struct node{}NODE; 。在申请变量时就可以这样写,NODE n;

    区别就在于使用时,是否可以省去struct这个关键字。

    分三块来讲述:

    1. 首先:在C中定义一个结构体类型要用typedef:

    typedef struct Student
    {
        int a;
    }Stu;
    

    于是在声明变量的时候就可:

    Stu stu1;
    

    如果没有typedef就必须用struct Student stu1;来声明

    这里的Stu实际上就是struct Student的别名。

    另外这里也可以不写Student(于是也不能struct Student stu1;了)

    typedef struct
    {
        int a;
    }Stu;
    

    但在c++里很简单,直接

    struct Student
    {
        int a;
    };
    

    于是就定义了结构体类型Student,声明变量时直接Student stu2

    即标准形式:

    • 先定义后声明
    //定义结构体
    struct teacher{
        char name[20];
        int age;
        char email[50];
    };
    //声明结构体变量
    struct teacher teacher1;
    
    • 定义的同时进行声明
    //定义时声明变量
    struct teacher{
        char name[20];
        int age;
        char email[50];
    }teacher1, teacher2;
    
    • 使用typedef定义结构体
    //定义结构体
    typedef struct Student
    {
        char name[50];
        int age;
    }Stu;
    //声明结构体变量
    Stu stu1;
    
    • 直接(不使用Student)
    //定义结构体
    typedef struct
    {
        int a;
    }Stu;
    //声明结构体变量
    Stu stu1;
    

    2. 其次:在c++中如果用typedef的话,又会造成区别:

    struct Student
    {
        int a;
    }stu1;//stu1是一个变量
    typedef struct Student2
    {
        int a;
    }stu2;//stu2是一个结构体类型
    

    使用时可以直接访问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关键字,那么aaabbbccc将是截然不同的三个对象。

    4. C/C++中typedef struct和struct的用法

    struct _x1 {
        ...
    } x1;
    

    定义了结构体类型_x1_x1的对象实例x1

    typedef struct _x2{
        ...
    } x2;
    

    定义了结构体类型_x2_x2的类别名x2

    所以它们在使用过程中是有区别的。


    [知识点]

    结构也是一种数据类型, 可以使用结构变量, 因此, 象其它 类型的变量一样, 在使用结构变量时要先对其定义。

    定义结构变量的一般格式为:

    struct 结构名
    {
        类型 变量名;
        类型 变量名;
        ...
    } 结构变量;
    

    结构名是结构的标识符不是变量名。

    另一种常用格式为:

    typedef struct 结构名
    {
        类型 变量名;
        类型 变量名;
        ...
    
    } 结构别名;
    

    另外注意: 在C中,struct不能包含函数。在C++中,对struct进行了扩展,可以包含函数。


    实例1: struct.cpp

    #include <iostream>
    using namespace std;
    
    typedef struct _point{
        int x;
        int y;
    }point; //定义类,给类一个别名
    
    struct _hello{
        int x,y;
    } hello; //同时定义类和对象
    
    int main()
    {
        point pt1;
        pt1.x = 2;
        pt1.y = 5;
    
        cout<< "ptpt1.x=" << pt1.x << "pt.y=" <<pt1.y <<endl;
    
    //  hello pt2;
    //  pt2.x = 8;
    //  pt2.y =10;
    //  cout<<"pt2pt2.x="<< pt2.x <<"pt2.y="<<pt2.y <<endl;
    //  上面的hello pt2;这一行编译将不能通过. 为什么?
    //  因为hello是被定义了的对象实例了.
    
    //正确做法如下: 用hello.x和hello.y
    
        hello.x = 8;
        hello.y = 10;
    
        cout<< "hellohello.x=" << hello.x << "hello.y=" <<hello.y <<endl;
        
        return 0;
    }
    

    5. 问答

    Q: 用structtypedef struct定义一个结构体有什么区别?为什么会有两种方式呢?

    //定义结构体Student时,声明了结构体变量stu
    struct Student
    {
        int a;
    } stu;
    
    //结构体类型Student2的别名为stu2
    typedef struct Student2
    {
        int a;
    }stu2;
    

    A:事实上,这个东西是从C语言中遗留过来的,typedef可以定义新的复合类型或给现有类型起一个别名,在C语言中,如果你使用

    struct xxx
    {
        ...
    };
    

    的方法,使用时就必须用 struct xxx var; 来声明变量,而使用

    typedef struct
    {
    }xxx;
    

    的方法 就可以写为 xxx var;

    不过在C++中已经没有这回事了,无论你用哪一种写法都可以使用第二种方式声明变量,这个应该算是C语言的糟粕。

    6. 用法小结

    • 用途一:

    定义一种类型的别名,而不只是简单的宏替换。可以用作同时声明指针型的多个对象。比如:

    char* pa, pb; // 这多数不符合我们的意图,它只声明了一个指向字符变量的指针,和一个字符变量;
    

    以下则可行:

    typedef char* PCHAR; // 一般用大写
    PCHAR pa, pb; // 可行,同时声明了两个指向字符变量的指针
    

    虽然:

    char *pa, *pb;
    

    也可行,但相对来说没有用typedef的形式直观,尤其在需要大量指针的地方,typedef的方式更省事。

    • 用途二:

    用在旧的C的代码中(具体多旧没有查),帮助struct。以前的代码中,声明struct新对象时,必须要带上struct,即形式为: struct 结构名 对象名,如:

    struct tagPOINT1
    {
        int x;
        int y;
    };
    struct tagPOINT1 p1;
    

    而在C++中,则可以直接写:结构名 对象名,即:

    tagPOINT1 p1;
    

    估计某人觉得经常多写一个struct太麻烦了,于是就发明了:

    typedef struct tagPOINT
    {
        int x;
        int y;
    }POINT;
    
    POINT p1; // 这样就比原来的方式少写了一个struct,比较省事,尤其在大量使用的时候
    

    或许,在C++中,typedef的这种用途二不是很大,但是理解了它,对掌握以前的旧代码还是有帮助的,毕竟我们在项目中有可能会遇到较早些年代遗留下来的代码。

    展开全文
  • C语言typedef用法

    2021-11-03 16:32:53
    C语言允许用户使用 typedef 关键字来定义自己习惯的数据类型名称。 示例: typedef int BOOL;//定义一个布尔类型 #define TRUE 1 #define FALSE 0 //定义好之后,就可以像使用基本类型数据一样使用它了,如下面的...

    参考链接

    一、概念

    C语言允许用户使用 typedef 关键字来定义自己习惯的数据类型名称。
    示例:

    typedef int BOOL;//定义一个布尔类型
    #define TRUE 1
    #define FALSE 0
    
    //定义好之后,就可以像使用基本类型数据一样使用它了,如下面的代码所示:
    BOOL bflag=TRUE;
    

    二、typedef的4种用法

    1. 为基本数据类型定义新的类型名
      比如跨平台时,有的机子不支持long double,但有需要高精度的一个类型参与计算,那就可以进行如下定义:
    typedef long double ACCURACY;//当跨平台时,只需修改long double的类型就可以了,如下
    typedef double ACCURACY;
    
    1. 为自定义数据类型(结构体、共用体和枚举类型)定义简洁的类型名称
    以结构体为例,下面我们定义一个名为 Point 的结构体:
    struct Point
    {
        double x;
        double y;
        double z;
    };
    
    在调用这个结构体时,我们必须像下面的代码这样来调用这个结构体:
    struct Point oPoint1={1001000};
    struct Point oPoint2;
    

    上面是传统定义方法,下面是利用typedef的升级版:

    typedef struct tagPoint
    {
        double x;
        double y;
        double z;
    } Point;
    
    在上面的代码中,实际上完成了两个操作:
    1、定义了一个新的结构类型,代码如下所示:
    struct tagPoint
    {
        double x;
        double y;
        double z;
    } ;
    其中,struct 关键字和 tagPoint 一起构成了这个结构类型,无论是否存在 typedef 关键字,这个结构都存在。
    
    2、使用 typedef 为这个新的结构起了一个别名,叫 Point,即:
    typedef struct tagPoint Point
    
    综上:现在就可以像 intdouble 那样直接使用 Point 定义变量,如下面的代码所示:
    Point oPoint1={1001000};
    Point oPoint2;
    
    
    

    如果上面结构体的声明没看懂可以先看下这个:

    #include <stdio.h>
      
    typedef int A,*B;//定义两个类型,一个整型的别名A,一个整型指针B,这两个变量没有联系,谁也代表不了谁,都是独立的。
    
    int main()
    {
        A aa=10;
        B bb;
        *bb=12;
        printf("&aa=%p\n",&aa);
        printf("bb=%p\n",bb);
        printf("aa=%d\n",aa);
        printf("*bb=%d\n",*bb);
        return 0;
    }
    
    #include <stdio.h>
    #include <string.h>
    
    #define MAXSIZE 100       // 顺序表的最大长度
    
    typedef int ElemType;     // 自定义顺序表的数据元素为整数。
    
    typedef struct
    {
      ElemType data[MAXSIZE];   // 用数组存储顺序表中的元素
      unsigned int length;      // 顺序表中元素的个数
    }SeqList,*PSeqList;//这个就是定义两个类型,一个是结构体别名SeqList和一个结构体指针PSeqList。
    
    1. 为数组定义简洁的类型名称
    与为基本数据类型定义新的别名方法一样,示例代码如下所示:
    
    typedef int INT_ARRAY_100[100];
    INT_ARRAY_100 arr;
    
    1. 为指针定义简洁的名称
    对于指针,我们同样可以使用下面的方式来定义一个新的别名:
    typedef char* PCHAR;
    PCHAR pa;
    
    例如有下面这种类型,上面这个方法就有大用处了:
    int *(*a[5])(int,char*);
    
    // PFun是我们创建的一个类型别名
    typedef int *(*PFun)(int,char*);
    // 使用定义的新类型来声明对象,等价于int*(*a[5])(int,char*);
    PFun a[5];
    
    展开全文
  • structtypedef以及结构体指针用法typedef用法结构体指针用法结构体初始化typedef是类型定义的意思。typedef struct 是为了使用这个结构体方便。具体区别在于:若struct node{ }这样来定义结构体的话。在定义 node ...

    struct 、typedef以及结构体指针用法

    typedef用法

    结构体指针用法

    结构体初始化

    typedef是类型定义的意思。typedef struct 是为了使用这个结构体方便。具体区别在于:

    若struct node{ }这样来定义结构体的话。在定义 node 的结构体变量时,需要这样写:struct node n;

    若用typedef,可以这样写:typedef struct node{}NODE; 。在申请变量时就可以这样写:NODE n;其实就相当于 NODE 是node 的别名。区别就在于使用时,是否可以省去struct这个关键字。 有些时候,typedef struct NODE{ }NODE;还是可以直接NODE n;定义一个NODE类型的结构体。

    typedef用法

    用法举例1:在C中定义一个结构体类型时如果要用typedef:

    typedef struct Student

    {

    int no;

    char name[12];

    }Stu,student;

    于是在声明变量的时候就可:Stu stu1;或者:student stu2;(Stu 和student 同时为Student的别名)

    用法举例2:如果没有typedef,传统定义一个结构体:

    struct Student

    {

    int no;

    char name[12];

    }Stu;

    此时说明已经定义了一个结构体Stu变量,如果要重新新建,就必须用struct Student stu1;

    用法举例3:如果使用了typedef,另外这里也可以不写Student(于是也不能struct Student stu1;了)

    typedef struct

    {

    int no;

    char name[12];

    }Stu;

    用法举例4:typedef 还可以掩饰复合类型,如指针和数组。定义一个 typedef,每当要用到相同类型和大小的数组时,可以这样:

    typedef char Line[81];

    此时Line类型即代表了具有81个元素的字符数组,使用方法,例如Line text, secondline;

    结构体指针用法

    结构体指针用法1:

    结构体要自引用时,Student1是错误用法。试想引用成员next是另一个完整的结构,其内部还将包含它自己的成员next,这第二个成员又包含一个完整的结构,它还将包括它自己的成员next,这样重复下去永无休止,内存都用光了。所以不合法。

    struct Student1

    {

    int age;

    struct Student1 next;

    };

    正确的用法是:结构体自引用 ,只能自引用指针。编译器在结构的长度确定之前就已经知道指针的长度,所以这种自引用是合法的。结构体的自引用在实现链表,树等高级的操作时用处很大。

    struct Student1

    {

    int age;

    struct Student *next;

    };

    结构体指针用法注意:这样是不行的,虽然Student1代表了结构体,但是Student1类型名的声明是在末尾定义,当要声明struct{ }时,内部无法识别Student1类型。

    typedef struct

    {

    int age;

    Student1 *next;

    }Student1,*StudentPtr;

    结构体指针用法2:

    注意此时,Student1是struct Student{}的别名,StudentPtr是Student的指针

    typedef struct Student1

    {

    int age;

    Student1 *next;

    }Student1,*StudentPtr;

    我使用StudentPtr时出现了个有意思现象,结构体指针若不手动分分配内存,讲道理是不能用的。当定义了两个结构体指针s1,s2,两个结构体指针都不分配内存,给其中一个赋值,然后使用没有问题,输出良好。

    #include

    typedef struct Student1

    {

    int age;

    Student1 *next;

    }Student1,*StudentPtr;

    int main()

    {

    StudentPtr s1;

    StudentPtr s2;

    s1->age= 9;

    printf("%d",s1->age);

    return 0;

    }

    当尝试给另一个结构体指针赋值时,编译没有问题,程序运行奔溃。

    cdd4f0cd4db244d2372fd7a4baf2896b.png

    5e48d478152bc3ed3b16951f8d4e7f06.png

    正确用法应该是

    结构体指针需要初始化

    结构体指针的成员指针同样需要初始化

    若直接使用结构体,结构体中有成员指针,成员指针也要先初始化

    a9a44f6dcf7b37986f4a6c0b68050f69.png

    结构体初始化

    结构的初始化方式和数组初始化很相似。一个位于一对花括号内部,由逗号分隔的初始值列表可用于结构的初始化。这些值根据结构成员列表的顺序写出。

    6a6d5502aba2beaa79cd3b7273cc54c2.png

    展开全文
  • 我记得typedef struct是大学时候数据结构课本上用来声明链表结点的方法,这个方法让人容易操作链表。后来书本扔了,再买了盗版书不知道是版本问题还是什么问题,包括网上大多数博客都是直接struct声明。struct直接...
  •  typedefC语言的关键字,作用是为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。 在编程中使用typedef目的一般有两个,一个是给变量提供一个易记...
  • 结构体定义typedef struct 用法详解

    千次阅读 2021-05-26 01:22:06
    typedef是类型定义的意思,typedef struct是为了使用这个结构体方便。在了解typedef之前我们先来了解一下什么是结构体类型:C++提供了许多种基本的数据类型(如int、float、double、char等)供用户使用。但是由于程序...
  • typedef 修饰 struct ,因为在C和C++中struct中意义不完全一样,所以我们分两块姜,在C中typedef修饰struct和C++中typedef修饰struct。 一:C中typedef修饰struct 在C中定义一个结构体类型要用typedef:  typedef ...
  • typedef的作用是为已有的数据类型定义一个新名字,其主要目的是为了我们在使用时能用这个更加清晰简单的新名字,还有一个目的就是为了简化变量的声明。 下面的几段代码具有相同的功能,都是用于链表结构体节点的定义...
  • c语言规范,定义结构体:typedef struct ANSWER_HEADER{u8 u8Type;u8 u8Code;u32 u32TimeStamp;struct ANSWER_HEADER *pNext;}ANSWER_HEADER_T, *PANSWER_HEADER_T;ANSWER_HEADER为结构名,这个名字主要是为了在...
  • C++ typedef 以及typedef struct 用法1 概述2 typedef作用及用法3 区别 #define4 typedef struct在c/c++中的区别4.1区别一4.2区别二5 参考资料 1 概述 typedefC语言的关键字,作用是为一种数据类型定义一个新名字...
  • typedefC语言的关键字,作用是为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。 在编程中使用typedef目的一般有两个,一个是给变量一个易记且意义...
  • 一个是声明一个结构体的原始用法, 一个是把结构体取了个别名。 例如 struct list{ int a; char c; stuct list *next; };(注意这个分号不能少) 这个结构体的类型名是struct list ;struct只是声明结构体需要的关键字...
  • C语言允许为一个数据类型起一个新的别名,就像给人起“绰号”一样。起别名的目的不是为了提高程序运行效率,而是为了编码方便。例如有一个结构体的名字是 stu,要想定义一个结构体变量就得这样写:struct stu stu1;...
  • C语言typedef使用

    2021-05-18 10:44:03
    C语言typedef使用typedef 关键字能帮助你简化复杂的定义并让你的代码简洁可靠,当然,可靠这一点我还是持保留态度,因人而异吧。具体是如何使用呢?以下仅供参考!具体方法如下:C 语言提供 typedef 关键字,允许...
  • C语言typedef用法详解

    2021-01-19 09:37:14
    typedef用法 C语言允许为一个数据类型起一个新的别名,就像给人起“绰号”一样。 起别名的目的不是为了提高程序运行效率,而是为了编码方便。例如有一个结构体的名字是 stu,要想定义一个结构体变量就得这样写: ...
  • C语言允许为一个数据类型起一个新的别名,就像给人起“绰号”一样。 起别名的目的不是为了提高程序运行效率,而是为了编码方便。例如有一个结构体的名字是 stu,要想定义一个...使用关键字 typedef 可以为类型起一个新
  • #includevoid main(){typedef struct A{int a ;char b;float c ;}a1={1,'2',111.1},*a2 = &a1;printf("%d\n",a2->a);}错误信息如下:struct.c: In function ‘main’:struct.c:8:5: error...
  • 关于链表初始化typedef struct LNode{}LNode,*linklist的理解

    千次阅读 多人点赞 2021-01-23 21:59:55
    typedef用法不在此细说,可以简单理解为给数据类型取别名。 对于这个代码,目的是定义线性表的单链表储存结构。 结构体部分比较好理解,一个是数据元素data,一个是指向本结构体的结构体指针next。 关键在于LNode...
  • C语言允许为一个数据类型起一个新的别名,就像给人起“绰号”一样。起别名的目的不是为了提高程序运行效率,而是为了编码方便。例如有一个结构体的名字是 stu,要想定义一个结构体变量就得这样写:struct stu stu1;...
  • C语言typedef关键字

    2021-02-28 18:04:13
    C语言typedef关键字关于马甲的笑话。有这样一个笑话:一个猎人在河边抓捕一条蛇,蛇逃进了水里。过一会,一个乌龟爬到岸边。猎人一把抓住这个乌龟,大声的说道:小样,别你为你穿了个马甲我就不认识你了!typedef ...
  • C语言的前置声明的如下:-----如下列子: typedefBOOL(*func)(constDefStruct*struct);typedef structDefStruct_t {inti;funcf;} DefStruct;如上定义了一个回调函数声明,然后在后面的struct使用这个回调...
  • C语言中,经常有如下的用法typedef struct tag{ ...} MyType, *MyPtr;一旦通过如上定以后,就可以用MyType来定义struct tag结构了。以前我使用typedef的时候,是按照其字面意思理解的,所以进入了一个误区。比如...
  • typedefC语言中给结构体取别名的用法很常见,这种用法很很容易理解,但当用typedef来给函数、数组取别名时,或许这种写法理解起来比较晦涩。以下用一些例子来展现typedef的部分用法。 栗子 1、结构体取别名 //...
  • C语言中的typedef struct

    2021-11-15 22:10:47
    C语言中的typedef struct 文章目录C语言中的typedef struct1. 使用typedef struct的原因:2. 结构体变量的传统定义方法:3. 结构体变量的精简定义方法: 1. 使用typedef struct的原因: 使用typedef struct可以有效...
  • 关于typedefstruct使用过程中的一些思考 以下内容所记录的内容是自己在编写ADT工具类时遇到的问题,做出一些记录,好记性不如烂笔头 以下内容如有错误的地方还望不吝赐教 1、C与C++中关于typedefstruct使用...
  • C语言typedef关键字

    2021-03-29 03:34:25
    目录 1.typedef关键字干嘛的 2.在单片机开发当中,寄存器8位,16位,32位 3. 和结构体结合命名: 3.1普通重命名。 ... 3.2重命名的另一种,把结构体本身给的名字Student的去掉。... typedefC语言的关键字 ...
  • 基本解释typedefC语言的关键字,作用是为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。在编程中使用typedef目的一般有两个,一个是给变量一个易记且...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 49,473
精华内容 19,789
关键字:

c语言typedefstruct的用法

c语言 订阅