精华内容
下载资源
问答
  • 结构体typedef struct的用法 和结构体的定义   结构体的定义: 1.  struct Person {  char name[20];  char sex;  float height;  int age; }; 只有结构体的定义 2.   struct Person {  char...
    

    结构体typedef struct的用法 和结构体的定义

     

    结构体的定义:

    1.

       struct Person {

        char name[20];

        char sex;

        float  height;

        int age;

    };   只有结构体的定义

    2.  

      struct Person {

        char name[20];

        char sex;

        float  height;

        int age;

    } xiaohong;  附加该结构体类型的“结构体变量”的初始化定义结构体

     

    这种定义就相当于

      struct Person {

        char name[20];

        char sex;

        float  height;

        int age;

    };

      struct Person  xiaohong; 

     

    定义另一个结构体

      struct Person xiaoming ; 定义一个变量名为xiaoming的结构体

     

    这种每次都要加一个struct关键字的写法有点麻烦

     

    3.

      typedef struct Person {

        char name[20];

        char sex;

        float  height;

        int age;

    }Per; 这种写法在声明结构体变量的时候就可以用 Per xiaoming;

         如果没有typedef 就必须用 struct Person,这里的Per实际上就是 struct Person的别名

     

     

    typedef的用途

    typedef可以看作是type define 的缩写,意思就是定义类型,也可以说它是给已有的类型重新定义一个新的别名,而不是产生一个新的类型

    typedef和宏定义有些类似,但是又有不同:

    1.typedef给出的符号名称仅限于对类型,而不是对值,并不是简单的宏替换,可以用作同时声明指针型的多个对象

      typedef unsigned int BYTE;  将unisigned int 类型起一个别名 BYTE,  这样我们定义unisigned int 类型的变量的时候就可以这样写  BYTE x,y;

      typedef char *MYCHAR;

      MYCHAR pa,pb; 同时声明了两个指向字符变量的指针

      //  char *pa,pb  ; 这种写法是声明了一个指向字符类型变量的指针和一个字符类型的变量(一个是指针,一个是变量),虽然用char *pa,*pb也可以达到我们定义两个字符指针的目的,但是这样明显不如用typedef来的方便。

     

    2.可以使程序参数化,提高程序的移植性

     type_myType doSomething(args *); 该函数的返回值是type_myType类型的,在一些系统中type_myType可能被定义成long类型,而有的系统中则被定义成 int类型,这样我们在移植程序的时候不需要再去修改函数的返回类型,只需要修改typedef定义就好了。

     

    3.可以使表达式更加简洁,如上面的结构体的定义

     

    4.能够为其它复杂的声明定义一个简单的别名

        原声明:  int *(*a[10])(int,cahr*);  这里的变量名为a, 我们用一个新的名字NEW_A来代替a,得到的简化后的定义为:  typedef int*(*NEW_A)(int,char *);

      用新的名字来定义变量 NEW_A a[6]; 

        可能一些小伙伴在回头看这个表达式有些不大理解, 这个涉及到运算符的优先级的问题,可以回头看看原来的书

      理解复杂声明可以用"右左法则":从变量名看起,先往右,在往左,碰到圆括号就调转阅读方向;括号内分析完毕就跳出括号,还是按照先右后左的顺序,直到声明分析完毕。

      以上面的声明为例: a为变量名称,a的右边有[ ],说明为数组,左边有一个*,说明数组中的元素为指针类型,即一个含有10个元素的数组,元素的类型为指针(这里的*不是修饰a,而是修饰a[10],是因为[]的优先级要高于*),跳出括号,右边又有一个括号,说明a数组的元素是指向函数类型的指针,而这个函数是参数为int,char*  ,返回值为int类型的函数。

    转载于:http://www.cnblogs.com/FYXin/p/5794719.html


    展开全文
  • typedef struct 是为了使用这个结构体方便。 具体区别在于: 若struct node { } 这样来定义结构体的话。在申请node 变量时,需要这样写,struct node n; 若用typedef,可以这样写:typedef struct node{ }NODE; ,...

    typedef是类型定义的意思。

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

    struct和typedef struct区别

    分三块来讲述:

    1 首先:

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

    typedef struct Student
    {
    	int a;
    }Stu;
    

    这里的Stu实际上就是struct Student的别名。
    于是在声明变量的时候就可以使用:Stu stu1;

    另外这里也可以不写Student,于是也不能使用struct Student stu1;了,只能使用Stu stu1;

    typedef struct
    {
    	int a;
    }Stu;
    

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

    在c++里很简单,直接

    struct Student
    {
    	int a;
    };
    

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

    2其次:

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

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

    使用时可以直接访问stu1.a
    但是stu2则必须先 stu2 s2;,然后 s2.a=10;

    如果在c程序中我们写:

    typedef struct
    {
    	int num;
    	int age;
    }aaa,bbb,ccc;
    

    其中aaa,bbb,ccc三者都是结构体类型,声明变量时用任何一个都可以,你可以当做取的三个别名,在c++中也是如此。但是你要注意的是这个在c++中如果写掉了typedef关键字,那么aaa,bbb,ccc将是截然不同的三个对象。

    C/C++中typedef struct和struct的具体用法

    struct _x1 { …}x1; 和 typedef struct _x2{ …} x2; 有什么不同?
    其实, 前者是定义了类_x1和_x1的对象实例x1,后者是定义了类_x2和_x2的类别名x2
    所以它们在使用过程中是有取别的,请看实例1。

    实例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.x = 8;
    	hello.y = 10;
    	cout<< "hellohello.x=" << hello.x << "hello.y=" <<hello.y <<endl;
    	return 0;
    }
    

    上面的hello pt2;这一行编译将不能通过. 为什么?
    因为hello是被定义了的对象实例了,正确做法如下: 用hello.x和hello.y

    问答

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

    struct Student
    {
    	int a;
    	} stu;
    
    typedef struct Student2
    {
    	int a;
    }stu2;
    

    A:
    事实上,这个东西是从C语言中遗留过来的,typedef可以定义新的复合类型或给现有类型起一个别名,在C语言中,如果你使用下列方法,使用时就必须用 struct ttt x; 来声明变量,

    struct ttt
    {
    	//定义
    }; 
    

    而使用下列方法 就可以写为 ttt x;

    typedef struct
    {
    	//定义
    }ttt;
    

    在C++中已经做了升级,无论你用哪一种写法都可以使用第二种方式声明变量。

    总结

    定义一种类型的别名,而不只是简单的宏替换。可以用作同时声明指针型的多个对象。比如:
    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语言中struct typedef 以及结构体指针用法

    万次阅读 多人点赞 2019-03-04 18:42:29
    structtypedef以及结构体指针用法 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 用法详解和用法小结

    万次阅读 多人点赞 2018-07-31 22:25:48
    typedef struct 是为了使用这个结构体方便。 具体区别在于: 若struct node{ }这样来定义结构体的话。在定义 node 的结构体变量时,需要这样写:struct node n; 若用typedef,可以这样写:typedef struct node{}NODE;...

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

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

    首先:

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

    typedef struct Student
    {
       int no;
       char name[12];
    }Stu,student;

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

    struct Student
    {
       int no;
       char name[12];
    }Stu;

    就必须用struct Student stu1;或者struct Stu stu1;来声明 
    另外这里也可以不写Student(于是也不能struct Student stu1;了)

    typedef struct
    {
       int no;
       char name[12];
    }Stu;

    其次:

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

    struct Student
    {
       int no;
       char name[12];
    }stu1;//stu1是一个变量
    typedef struct Student2
    {
       int no;
       char name[12];
    }stu2;//stu2是一个结构体类型,即stu2是Student2的别名

    使用时可以直接访问stu1.no 
    但是stu2则必须先定义 stu2 s2; 
    然后 s2.no=10;

    展开全文
  • 结构体 typedef struct

    2020-09-29 17:33:44
    之前学过typedef struct的用法,突然忘记了,这回再看理解的更清楚了 转发 https://blog.csdn.net/wzz110011/article/details/78883838 在学习数据结构的时候,我经常遇到typedef struct,刚开始感觉很别扭,查阅...
  • 结构体定义 typedef struct LNode 用法说明

    千次阅读 多人点赞 2019-06-10 20:45:12
    typedef结构体的定义和结构体指针定义连在一起写,精简为如下代码: typedef struct LNode{ ElemType data; struct LNode *next; }LNode,*LinkList; 将精简代码还原: struct LNode { ElemType data; ...
  • typedef struct 是为了使用这个结构体方便。 具体区别在于: 若struct node{ }这样来定义结构体的话。在定义 node 的结构体变量时,需要这样写:struct node n; 若用typedef,可以这样写:typedef struct node{ } NODE...
  • 结构体定义 typedef struct 用法详解和用法小结 文章目录结构体定义 typedef ... C/C++中typedef struct和struct的用法5. 问答6. 用法小结 0. 前言 typedef是类型定义的意思。 typedef struct 是为了使用这个结构体
  • 标题结构体定义 typedef struct 用法详解和用法小结 typedef是类型定义意思。typedef struct 是为了使用这个结构体方便。 具体区别在于: 若struct node {}这样来定义结构体的话。在申请node 变量时,需要这样写...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 477
精华内容 190
关键字:

struct的用法结构体typedef