注意:
1.结构体是自定义数据类型,定义之后使用就跟使用库自带的int这些数据类型一样的。
2.定义结构体类型不会分配内存空间,定义变量才会。
1.匿名结构体(声明时创建变量,不然没啥用)
匿名结构体是没有定义类型名的结构体。它通常用于两种情况:
-
临时使用:匿名结构体可以在不定义具体类型的情况下快速创建一个结构体对象,并且可以在需要时直接使用。
-
嵌套结构体:匿名结构体可以作为另一个结构体中的字段,用于表示某个概念或属性的组合。这样可以在结构体中直接访问匿名结构体的字段,简化了代码结构
struct{char name[20];int age;
};
2.嵌套结构体
struct Employee {struct {char name[20];int age;} person;char department[20];
};
3.递归结构体(实现动态链接)
这两个结构体的定义在语法上有细微的区别。
第一个结构体的定义如下:
struct Node {int data;struct Node *next;
};
在这个定义中,struct Node
明确指明了next
成员的类型是指向struct Node
类型的指针。在C语言中,结构体的成员访问需要使用->
操作符。
第二个结构体的定义如下:
struct Node {int data;Node *next;
};
在这个定义中,Node
是一个不完整的类型,没有使用struct
关键字来指明它是一个结构体。这种写法在C语言中是不合法的,编译器会报错。
因此,这两个定义的区别在于对next
成员类型的指定方式。第一个定义使用了struct Node *
来明确指定next
的类型是指向struct Node
类型的指针;而第二个定义中,Node
是一个不完整的类型,缺少了struct
关键字,导致编译错误。
在C++语言中,可以使用Node
来代替struct Node
,因为C++允许直接使用结构体名字来访问成员(在C++中,默认的访问控制是public)。但是在C语言中,这种写法会导致编译错误。
4.常规结构体
以C语言举例
自定义数据类型
struct student{char name[20];int age;
};
再创建struct student类型变量a
int main() {struct student a;return 0;
}
也可以定义数据类型同时创建变量
struct student{char name[20];int age;
}a;
5.typedef的使用
通过使用typedef给数据类型起简洁的别名,从而提高代码的可读性和简洁性
在C语言中,typedef
关键字用于为已有的数据类型取一个新的别名。它的使用规则如下:
-
typedef
的基本语法是:typedef 原类型名 新类型名
。 -
typedef
可以用于为基本类型、指针类型、数组类型和结构体类型等定义别名。 -
当使用
typedef
为一个结构体类型定义别名时,可以在结构体的定义中直接使用该别名,也可以在定义结构体变量时使用该别名。 -
如果在结构体定义时使用了
typedef
关键字,则不需要再写struct
关键字来引用该结构体。 -
typedef
定义的别名,可以在当前作用域中使用,也可以在其他作用域中使用。
单别名
typedef struct Node {int data;Node* next;
}Node;
多别名(简单叠加)
typedef struct Node {int data;Node* next;
}Node,*Linklist;
Node是struct Node结构体类型的别名,可使用Node a;创建对应的变量
Linklist 是指向struct Node结构体类型的指针的别名,可使用Linklist a;创建对应的指针,而不需要声明指针变量时写明*。