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;
struct Student {
int no; char name[12]; }Stu;
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; }
当尝试给另一个结构体指针赋值时,编译没有问题,程序运行奔溃。


正确用法应该是
- 结构体指针需要初始化
- 结构体指针的成员指针同样需要初始化
- 若直接使用结构体,结构体中有成员指针,成员指针也要先初始化

结构体初始化
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/211386.html原文链接:https://javaforall.net
