1.结构体类型的概念
1.1结构体指的是一些值的集合,而这些值被称作为成员变量,结构体的每个成员都可以是不同种类的变量
1.2结构体的声明
举一个例子 描述颜色
#include <stdio.h>
struct Color
{
int RED;//内部是;不是,
int RGEEN;
int BULE;
};Color-list;
又或者描述一个学生
struct student
{
char num;
int name;
char SEX[5];
float height;
};//不要忘记分号!
1.3 特殊结构体声明
在声明结构体的时候 可以进行不完全的声明
例如
struct
{
char brand[20];
int Speed;
float moeny;
}Car,*p;
struct
{
char brand[20];
int Speed;
float moeny;
}x;
如此 该结构体便是匿名结构体 注意 匿名结构体只能使用一次
接着 问题来了
在上面的两段代码的前提下 以下方式合法吗
p=&a
答案是 非法
为什么?
因为编译器会把上面两个结构体当作完全不同类型,所以是非法的
1.4 结构的自引用
在结构内是否可以包含一个类型为该类型本身的成员呢?
或许我们可能会这么用
struct Car
{
char brand[20];
int Speed;
float moeny;
struct Car tesla;
};
但是这样是错误的,仔细想想 ,因为在一个结构体内包含一个相同的类型的结构体变量 结构体就会无穷的大 无穷的小,(我身体里面有我,我有我的身体,我的身体又有我.......)
正确的自引用方式
struct Car
{
char brand[20];
int Speed;
float moeny;
struct Car* tesla;
};
在自引用的过程中,要是夹杂了typedef对匿名结构体类型的重命名,也容易发生问题
比如
typedef struct
{
char brand[20];
int Speed;
Car*tesla;
}Car;
这样也是不行的 因为Car是对前面匿名结构体类型的重命名产生的,但是在匿名结构体内部提前创造成员变量,是不行的
解决方法如下:定义结构体就不要用匿名结构体了
typedef struct Car
{
char brand[20];
int Speed;
struct Car*tesla;
}Car;
如此一来 便可使用