,以及结构体指针的使用
它的意思是类型定义。 就是为了方便使用这个结构。具体的区别是:用法
使用示例1:在C中定义结构体类型时,如果要使用:
typedef struct Student
{
int no;
char name[12];
}Stu,student;
所以声明变量时可以: Stu Stu1; 或:stu2; (Stu 和两个别名)
用法示例 2:如果没有,传统上定义一个结构体:
struct Student
{
int no;
char name[12];
}Stu;
这时,就说明已经定义了一个结构体Stu变量。 如果要创建新的,必须使用stu1;
用法示例3:如果使用的话,这里就不用写了(所以不能stu1;)
typedef struct
{
int no;
char name[12];
}Stu;
用法示例 4:您还可以屏蔽复合类型,例如指针和数组。 每当您想要使用相同类型和大小的数组时,就定义一个数组,如下所示:
typedef char Line[81];
此时,Line类型代表一个有81个元素的字符数组。 使用方法例如:Line text, ;
结构体指针的使用
结构体指针用法1:
当一个结构被自引用时,这是一种错误的用法。 想象一下,引用成员 next 是另一个完整的结构,它也将包含它自己的成员 next。 第二个成员包含一个完整的结构,接下来它也将包含它自己的成员。 这样无休止地重复。 ,内存全部用完。 所以这是不合法的。
struct Student1
{
int age;
struct Student1 next;
};
正确的用法是:结构体是自引用的,只能自引用指针。 在确定结构体长度之前,编译器就已经知道了指针的长度,因此这种自引用是合法的。 结构的自引用在实现链表和树等高级操作时非常有用。
struct Student1
{
int age;
struct Student *next;
};
关于结构指针使用的注意事项:这是不可能的。 虽然它代表一个结构体,但类型名称的声明是在最后定义的。 当声明 { } 时,内部无法识别类型。
typedef struct
{
int age;
Student1 *next;
}Student1,*StudentPtr;
结构体指针用法2:
注意,此时它是{}的别名,也是一个指针
typedef struct Student1
{
int age;
Student1 *next;
}Student1,*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;
}
当尝试给另一个结构体指针赋值时,编译没有问题,程序崩溃。
正确的用法应该是
结构体指针需要初始化。 结构体指针的成员指针也需要初始化。 如果直接使用结构体,且结构体中有成员指针,也必须先初始化成员指针。
结构初始化
结构初始化与数组初始化非常相似。 一对大括号内的以逗号分隔的初始化值列表可用于初始化结构。 值按照结构成员列出的顺序写出。