精华内容
下载资源
问答
  • C语言中struct typedef 以及结构体指针用法

    万次阅读 多人点赞 2019-03-04 18:42:29
    struct 、typedef以及结构体指针用法 typedef用法结构体指针用法结构体初始化   typedef是类型定义的意思。typedef struct 是为了使用这个结构体方便。具体区别在于: 若struct node{ }这样来定义结构体的话。...

    struct 、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 <stdio.h>
    typedef struct Student1
    {
    	int age;
    	 Student1 *next; 
    }Student1,*StudentPtr;
    int main()
    {
    	StudentPtr  s1;
    	StudentPtr  s2;
    	s1->age= 9;
    	printf("%d",s1->age);
    	return 0;
    }
    

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

    在这里插入图片描述
    在这里插入图片描述
      正确用法应该是

    1. 结构体指针需要初始化
    2. 结构体指针的成员指针同样需要初始化
    3. 若直接使用结构体,结构体中有成员指针,成员指针也要先初始化

    在这里插入图片描述

    结构体初始化

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

    展开全文
  • 结构体定义typedef struct 用法详解

    千次阅读 2021-05-26 01:22:06
    typedef是类型定义的意思,typedef struct是为了使用这个结构体方便。在了解typedef之前我们先来了解一下什么是结构体类型:C++提供了许多种基本的数据类型(如int、float、double、char等)供用户使用。但是由于程序...

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

    在了解typedef之前我们先来了解一下什么是结构体类型:

    C++提供了许多种基本的数据类型(如int、float、double、char等)供用户使用。但是由于程序需要处理的问题往往比较复杂,而且呈多样化,已有的数据类型显得不能满足使用要求。因此C++允许用户根据需要自己声明一些类型,用户可以自己声明的类型还有结构体类型(structure)、共用体类型(union)、枚举类型(enumeration)、类类型(class )等,这些统称为用户自定义类型(user-defined type,UDT)。

    在一个组合项中包含若干个类型不同(当然也可以相同)的数据项。C和C++允许用户自己指定这样一种数据类型,它称为结构体。它相当于其他高级语言中的记录(record)。例如,可以通过下面的声明来建立数据类型。

    struct Student//声明一个结构体类型Student

    {

    int num;//包括一个整型变量num

    char name[20];//包括一个字符数组name,可以容纳20个字符

    char sex;//包括一个字符变量sex

    int age;//包括一个整型变量age

    float score;//包括一个单精度型变量

    char addr[30];//包括一个字符数组addr,可以容纳30个字符

    };//最后有一个分号

    有点类似于java中的类,结构体是用户自定义的类型,比如在java中我们可以用

    class student{

    private string name;

    private string num;

    ...

    }

    还有一些函数,在c语言中结构体中只能是数据,但是对于C++和java这种面向对象的语言来说里面还可以有函数。

    值得一提的是,前面只是指定了一种结构体类型,它相当于一个**模型**,但其中并无具体数据,系统也不为之分配实际的内存单元为了能在程序中使用结构体类型的数据,应当定义结构体类型的变量,并在其中存放具体的数据。

    如上面我们已经定义了一个结构体类型Student,那么我们就可以用它来定义结构体变量,如:

    struct Student stu1,stu2;

    这说明现在stu1,stu2都是结构体类型了,里面所包含的内容就必须喝上面定义的Student结构体相照应。

    当然也可以直接在声明的时候就定义两个结构体变量

    ```cpp

    struct Student//声明结构体类型Student

    {

    int num;

    char name[20];

    char sex;

    int age;

    float score;

    char addr[30];

    }student1,student2;//定义两个结构体类型Student的变量student1,student2

    关于结构体类型,有几点要说明:

    (1) 不要误认为凡是结构体类型都有相同的结构。实际上,每一种结构体类型都有自己的结构,可以定义出许多种具体的结构体类型。

    (2) 类型与变量是不同的概念,不要混淆。只能对结构体变量中的成员赋值,而不能对结构体类型赋值。在编译时,是不会为类型分配空间的,只为变量分配空间。

    (3) 对结构体中的成员(即“域”),可以单独使用,它的作用与地位相当于普通变量。

    (4) 成员也可以是一个结构体变量。

    (5) 结构体中的成员名可以与程序中的变量名相同,但二者没有关系

    关于结构体里面的 变量

    在定义了结构体变量以后,当然也可以引用这个变量

    (1) 可以将一个结构体变量的值赋给另一个具有相同结构的结构体变量。

    (2) 可以引用一个结构体变量中的一个成员的值。

    如stu1.num=10010;

    (3) 如果成员本身也是一个结构体类型,则要用若干个成员运算符,一级一级地找到最低一级的成员。

    例如,对上面定义的结构体变量student1, 可以这样访问各成员:

    student1.num (引用结构体变量student1中的num成员)

    如果想引用student1变量中的birthday成员中的month成员,不能写成student1.month,

    必须逐级引用,即

    student1.birthday.month=12;

    (引用结构体变量student1中的birthday成员中的month成员)

    (4) 不能将一个结构体变量作为一个整体进行输入和输出。

    例如,已定义student1和student2为结构体变量,并且它们已有值。不能企图这样输出结构体变量中的各成员的值:

    cin>>student1;

    只能对结构体变量中的各个成员分别进行输入和输出。

    (5) 对结构体变量的成员可以像普通变量一样进行各种运算(根据其类型决定可以进行的运算种类)。

    结构体数组

    一个结构体变量中可以存放一组数据(如一个学生的学号、姓名、成绩等数据)。如果有10个学生的数据需要参加运算,显然应该用数组,这就是结构体数组。结构体数组与以前介绍过的数值型数组的不同之处在于:

    每个数组元素都是一个结构体类型的数据,它们都分别包括各个成员项

    定义

    定义结构体数组和定义结构体变量的方法相仿,定义结构体数组时只需声明其为数组即可。如

    struct Student{

    int num;

    char name[20];

    char sex;

    int age;

    float score;

    char addr[30];

    };

    Student stu[3];//定义Student类型的数组stu

    突然感觉自己的c语言白学了,这些也都是在百度找的东西,通俗的理解了一下,记录一下。

    展开全文
  • C语言结构体typedef struct详解

    千次阅读 2019-08-20 15:06:16
    C 语言提供了 typedef 关键字,您可以使用它来为类型取一个新的名字。下面的实例为单字节数字定义了一个术语 BYTE: typedef unsigned char BYTE; 在这个类型定义之后,标识符 BYTE 可作为类型 unsigned char 的...

     

    1、typedef关键字

    C 语言提供了 typedef 关键字,您可以使用它来为类型取一个新的名字。下面的实例为单字节数字定义了一个术语 BYTE

    typedef unsigned char BYTE;

    在这个类型定义之后,标识符 BYTE 可作为类型 unsigned char 的缩写,例如:

    BYTE  b1, b2;

    typedef相当于给unsigned char起了一个别名。

    typedef vs #define

    #define 是 C 指令,用于为各种数据类型定义别名,与 typedef 类似,但是它们有以下几点不同:

    • typedef 仅限于为类型定义符号名称,#define 不仅可以为类型定义别名,也能为数值定义别名,比如您可以定义 1 为 ONE。

    • typedef 是由编译器执行解释的,#define 语句是由预编译器进行处理的。

    2、typedef struct

    typedef struct的使用方法有很多种,这里只介绍最标准的一种使用方法:

    声明:

        typedef struct Student
        {
            int a;
        }Stu;

    使用:

            Stu xiaoming;

    区别:

    若struct node {}这样来定义结构体的话。在申请node 的变量时,需要这样写,struct node n; 若用typedef,可以这样写,typedef struct node{}NODE; 。在申请变量时就可以这样写,NODE n; 区别就在于使用时,是否可以省去struct这个关键字。

    但是在C++中又会造成区别:

    在c++中如果用typedef的话:

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

    stu1是一个变量,使用时可以直接访问stu1.a stu2是一个结构体类型,使用时则必须先 stu2 s2

    3、结构体指针

    定义:

        typedef struct Student
        {
            int a;
        }Stu,*pStu;

    使用:

    pStu exam1;
    Stu exam2;
    exam1 = exam2;
    exam2.a = 1;
    printf("%d",exam1->a);//输出为1

    或者:

    Stu exam[4];
    pStu p;
    p = exam;
    p +=2;//等价于p = exam[1]

    等价于:

        typedef struct Student
        {
            int a;
        }Stu;
        
    Stu *exam1;
    Stu exam2;
    exam1 = exam2;
    exam2.a = 1;
    printf("%d",exam1->a);//输出为1
    展开全文
  • structtypedef struct 结构体定义区别

    千次阅读 2019-05-03 10:59:34
    1.结构体的定义: 允许用户自己建立由不同类型数据组成的组合型的数据结构...2.下面以一个结构体实例来说明一下struct用法structos_tcb { OS_STK*OSTCBStkPtr; OS_STK*OSTCBStkBottom; INT32UOSTCBStkSi...

    1.结构体的定义:

       允许用户自己建立由不同类型数据组成的组合型的数据结构,它称为结构体(实际上应称为 结构体类型)。

     

    2.下面以一个结构体实例来说明一下struct的用法:

    struct os_tcb

    {

      OS_STK    *OSTCBStkPtr;

      OS_STK    *OSTCBStkBottom;     

      INT32U      OSTCBStkSize;     

      INT16U      OSTCBOpt;         

      INT16U      OSTCBId;            

    };

    Sturct       是声明结构体类型时所必须使用的关键字,不能省略。

    os_tcb      是结构体名

    花括号内   是该结构体所包括的子项,称为结构体成员。

     

    前面只是建立了一个结构体类型,它相当于一个模型,并没有定义变量,其中并无具体数据,系统对之也不分配存储单元。为了能在程序中使用结构体类型的数据,应当定义结构体类型的变量,并在其中存放具体的数据。

    可以采取以下3中方式定义结构体类型变量。

    (1)先声明结构体类型,再定义该类型的变量

    定义上面的结构体类型后

    struct os_tcb    OS_TCB;    // 在定义了结构体变量后,系统会为之

             |                       |            // 分配内存单元

    结构体类型名      结构体变量名  

         

    (2)在声明类型的同时定义变量

    struct os_tcb

    {

      OS_STK    *OSTCBStkPtr;

      OS_STK    *OSTCBStkBottom;     

      INT32U      OSTCBStkSize;     

      INT16U      OSTCBOpt;         

      INT16U      OSTCBId;            

    } OS_TCB;     // OS_TCB 是一个结构体变量

     

    (3)不指定类型名而直接定义结构体类型变量

    struct 

    {

      OS_STK    *OSTCBStkPtr;

      OS_STK    *OSTCBStkBottom;     

      INT32U      OSTCBStkSize;     

      INT16U      OSTCBOpt;         

      INT16U      OSTCBId;            

    } OS_TCB;     // OS_TCB 是一个结构体变量

     

    指定了一个无结构体名的结构体类型,显然不能再以此结构体类型去定义其他变量。

     

    注:结构体类型与结构体变量是不同的概念,不要混同。只能对变量赋值、存取或运算,而不能对一个类型赋值、存取后运算。在编译时,对类型不分配空间,只对变量分配空间。

     

     

    3.下面再以此结构体实例来说明一下typedef struct的用法:

    (主要参考技术博客:http://dzdesigned80.blog.163.com/blog/static/203259238201245105525341/)

    阅读程序发现两种用 typedef struct 定义结构体的方法

    第一种:

    typedef struct os_tcb

    {

      OS_STK    *OSTCBStkPtr;

      OS_STK    *OSTCBStkBottom;     

      INT32U      OSTCBStkSize;     

      INT16U      OSTCBOpt;         

      INT16U      OSTCBId;            

    }OS_TCB;

    第二种:

    typedef struct 

    {

      OS_STK    *OSTCBStkPtr;

      OS_STK    *OSTCBStkBottom;     

      INT32U      OSTCBStkSize;     

      INT16U      OSTCBOpt;         

      INT16U      OSTCBId;            

    }OS_TCB;

     

    可以看出,上面的区别在于 typedef struct 后面一个跟了标识符,另外一个没有跟标识符,这两个有什么区别呢?这里的os_tcb代表什么?OS_TCB的意义又是什么?

     

    要搞清楚上面的问题,要从两方面入手。

    第一 typedef的用法是什么?

    typedef是在基本类型的基础上定义类型的同义字。注意typedef并不产生新的类型。例如 typedef int exam_score;这里的exam_score 就是一种基本类型,它的意义等同于 int,那么机可以用它来定义变量,exam_score LIMING。

    第二 结构体的定义各个标志符的意义。

    在结构体定义中,通常是这样的

    struct exam_score

    {

    chinese;

    english;

    math;

    physical;

    chemistry;

    }LIMING;

    这里的struct是结构体关键字,exam_score则是结构体类型名,LIMING则是结构体变量。

    弄明白以上两个问题,回过头来看开始的那两个结构体。

    typedef struct os_tcb

    {

      OS_STK    *OSTCBStkPtr;

      OS_STK    *OSTCBStkBottom;     

      INT32U      OSTCBStkSize;     

      INT16U      OSTCBOpt;         

      INT16U      OSTCBId;            

    }OS_TCB; // OS_TCB是一个结构体类型 = struct os_tcb

    这里声明一种结构体类型os_tcb,所以os_tcb就是结构体类型名;OS_TCB是struct os_tcb 的同义字,所以可以直接用OS_TCB来定义变量,同时也可以这样 struct os_tcb xxx,OS_TCB xxx;都是合法的,因为OS_TCB就等同于      

    struct os_tcb。

     

    来看第二种

    typedef struct 

    {

      OS_STK    *OSTCBStkPtr;

      OS_STK    *OSTCBStkBottom;     

      INT32U      OSTCBStkSize;     

      INT16U      OSTCBOpt;         

      INT16U      OSTCBId;            

    }OS_TCB;    // OS_TCB是一个结构体类型 = struct 

    在结构体的定义中允许这样形式的定义:

    struct

    {

    xxx

    xxx

    xxx

    }var;

    这里没有声明结构体变量名,直接定义了结构体变量var,var在这里是结构体变量。这样定义的结果是在程序不能再定义新的结构体变量。

    这种形式加上typedef 之后情况就变了,这里的OS_TCB不是结构体变量,而是struct的同义字(结构体类型),这个同义仅限于上面定义的那种情况,可以用OS_TCB来定义结构体变量。

     

    总结:

    有了以上叙述与理解,我们便可以很容易搞清楚一个易混淆的点:struct{}后面的到底是结构体变量名,还是结构体类型名。

     

    当只是定义结构体类型:

    struct 结构体名

    {

            结构体成员名

     

    }结构体变量名;

    引用结构体成员方式应是:

    结构体变量名. 结构体成员名  //结构体变量直接引用结构体成员

     

    当使用typedef定义时:

    typedef struct 结构体名

    {

            结构体成员名

     

    }结构体类型名;

    引用结构体成员方式应是:

    结构体类型名 xxx;// 定义一个结构体变量

    xxx.结构体成员名  // 引用结构体成员
    --------------------- 
    作者:SudekiMing 
    来源:CSDN 
    原文:https://blog.csdn.net/WalterBrien/article/details/79624405 
    版权声明:本文为博主原创文章,转载请附上博文链接!

    展开全文
  • 结构体定义 typedef struct 用法详解和用法小结

    万次阅读 多人点赞 2018-04-03 14:08:04
    typedef可以声明新的类型名来代替已有的类型名,... 在编程中使用typedef目的一般有两个,一个是给变量提供一个易记且意义明确的新名字(类型有新别名,方便变量的定义),另一个是简化一些比较复杂的类型声明。typ...
  • (1)结构体定义和使用 基本概念:结构体属于用户自定义的数据类型,允许用户存储不同的数据类型。 参考视频:https://www.bilibili.com/video/BV1et411b73Z?from=search&seid=4205594350351753444 已投币三...
  • TYPEDEF 的声明方式 首先常规结构体的定义,你肯定已经十分清楚: struct Person{ int age; string name; }; 这里Person是你声明的这个结构体的名字,即一种类型,如同int之类的。 如果你想声明几个Person的...
  • 一.struct 结构体框架 : struct 类型名{ };例:struct Student{char name[20];int age;};结构体自定义数据类型,定义完成后等同于内置类型。1.结构体不能定义一个自身的普通成员,但可以定义一个指向自身的指针...
  • 彻底弄懂typedef structstruct定义结构体的区别

    万次阅读 多人点赞 2019-03-18 14:49:03
    typedef struct 结构名 { 类型 变量名; 类型 变量名; } 结构别名1, 结构别名2; 结构名 和 结构别名 都不能直接用,因为它们是结构体这种数据类型的名称,这种方式定义的结构体使用时,需要先声明 结构变量。 另一...
  • 结构体typedef struct用法 和结构体的定义   结构体的定义: 1.  struct Person {  char name[20];  char sex;  float height;  int age; }; 只有结构体的定义 2.   struct Person {  char...
  • 结构体初试化的一般方法结构体数组: 结构体数组初始化与赋值 结构体构造函数 第一种构造函数形式 第二种构造函数形式 结构体 结构体一般形式: struct 结构名{ //成员列表 };//分号必不可少 定义一...
  • 结构体定义 typedef struct 用法详解和用法小结 文章目录结构体定义 typedef struct 用法详解和用法小结0. 前言1. 首先:在C中定义一个结构体类型要用typedef:2....typedef struct 是为了使用这个结构体
  • typedefstruct,以及结构体指针

    千次阅读 2019-03-10 11:30:09
    struct 用于定义结构体类型,是结构体类型的标志。 1:先定义结构体的数据类型,在定义数据类型变量: struct number { };//声明了一个叫做number的...//此时num是结构体struct number实例的一个对象 num stu1; ...
  • 转自:structtypedef struct 分三块来讲述:  1 首先://注意在C和C++里不同  在C中定义一个结构体类型要用typedef:  typedef struct Student {  int a;  }Stu;  于是在声明变量的时候就可:Stu stu1;...
  • C语言结构体定义 typedef struct

    千次阅读 2019-09-24 16:34:25
    c语言规范,定义结构体typedef struct ANSWER_HEADER { u8 u8Type; u8 u8Code; u32 u32TimeStamp; struct ANSWER_HEADER *pNext; }ANSWER_HEADER_T, *PANSWER_HEADER_T; ANSWER_HEADER为结构名,这个...
  • typedef structstruct 定义结构体的区别 1. 定义结构体的方式 struct 结构体名 { 类型 变量名; 类型 变量名; }; typedef struct 结构体名 { 类型 变量名; 类型 变量名; }结构体别名1,结构体别名2; typedef...
  • 我在很多C语言代码中看到很多定义结构体使用typedef struct,而不适用struct,就了解了这样做的原因: typedef是类型定义的意思。typedef struct 是为了使用这个结构体方便。 具体区别在于: (1)若struct node ...
  • 1. 在C++中 (1)定义区别 struct Student ...typedef struct Student2 { int num; char name[12]; }stu2;//stu2是一个结构体类型,即stu2是Student2的别名 (2) 使用区别 可以直接访问stu1.n...
  • typedef struct 是为了使用这个结构体方便。 具体区别在于: 若struct node { } 这样来定义结构体的话。在申请node 的变量时,需要这样写,struct node n; 若用typedef,可以这样写:typedef struct node{ }NODE; ,...
  • 而且我没搞懂花括号前面和后面是不是都是命名,也没搞懂structtypedef struct的区别。看了几篇文章,终于搞懂了,总结一下。 warning C4091: “typedef ”: 没有声明变量时忽略“node”的左侧 定义 struct 名称...
  • 使用方法struct Student exam; 注意:这种方法编译器可能会警告,但是能够运行且正常读取数据不发生段错误。 type D:不使用typedef的情况 typedef可以自定义化名称,不使用它相当于直接操作原生的结构体。 1....
  • c/c++结构体的定义及使用:struct 和typedef struct详细总结(含代码实例) Forever_Blue_sky2019-04-15 21:32:123954收藏44 分类专栏:c/c++结构体struct和... struct结构体变量 一般形式 成员的获...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 163,261
精华内容 65,304
关键字:

struct的用法结构体typedef