C语⾔中structtypedef以及结构体指针⽤法
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
c语言struct头文件{
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);
return0;
}
  当尝试给另⼀个结构体指针赋值时,编译没有问题,程序运⾏奔溃。
  正确⽤法应该是
1. 结构体指针需要初始化
2. 结构体指针的成员指针同样需要初始化
3. 若直接使⽤结构体,结构体中有成员指针,成员指针也要先初始化
结构体初始化
  结构的初始化⽅式和数组初始化很相似。⼀个位于⼀对花括号内部,由逗号分隔的初始值列表可⽤于结构的初始化。这些值根据结构成员列表的顺序写出。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。