本篇文章将讲解以下知识点:
(1)结构体类型的声明
(2)结构体变量的创建和初始化
(3)结构体的自引用:
前言:
其实C语言中有内置类型也有自定义类型。
内置类型C语言本身支持的现成的类型。例如:整型(int),浮点型(double float),字符型(char)
但是仅仅有内置类型是不够的。比如:你描述一本书,书有:价格,书的作者名,等。如果用C语言的内置类型是不能描述的。
C语言允许有自定义的类型。
结构体-------struct
枚举-------enum
联合体-------union
结构体类型
结构体是一些值的集合,这些值称为成员变量。结构体的每个成员可以是不同类型的变量。
(1)结构体的声明
struct tag
{
member-list;//结构体的成员,一个或者多个
}variable --list;
tag为名字,variable-list是变量列表
例如;
创建一个学生:
struct student
{
char name[20];//名字
int age;//年龄
char sex[5];//性别
};
(2)结构体变量的创建和初始化
代码:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
struct Book
{
char name[20];
char author[10];
float price;
char id[13];
};
int main()
{
//按照结构体成员的顺序初始化
struct Book b1 = { "西游记","吴承恩",50.2,"1245521" };
//按照指定的顺序初始化
struct Book b2 = { .author = "曹雪芹",.id = "4557544",.name = "红楼梦",.price = 45.9 };
return 0;
}
结构体的特殊声明:
在声明结构体的时候,可以不完全的声明
例如://匿名结构体类型
struct
{
int a;
char ch;
float c;
}s = { 100,'x',45.3 };
代码运行:
匿名结构体在声明的时候省略了结构体标签(tag)。
一:
struct
{
int a;
int b;
float c;
}x;
二:
struct
{
int a;char b;
float c;
}a[20],*p;
p=&x合法吗?
会报警告,编译器会把上面的两个声明当成完全不同的两个类型,所以是非法的。匿名结构体类型,如果没有对结构体重命名的话,基本上只能使用一次。
对匿名结构体重命名:
typedef struct
{
char ch;
int i;
double d;
}S;
S s;
(3)结构体的自引用
数据结构---其实是数据在内存中的存储和组织的结构。
在结构体中包含一个类型为该结构体本身的成员是否可以呢?
例如:定义一个链表的节点
struct Node
{
int data;
struct Node ch;
};
上述代码不正确,因为一个结构体中再包含一个同类型的结构体变量,这样结构体变量的大小就会无穷大。
正确的自引用方式:
struct Node
{
int data;
struct Node* next;
};
在结构体自引用使用的过程中,夹杂了typedef对匿名结构体类型的重命名也容易引入问题。
类型重命名:
1))
typedef struct Node
{
int data;
struct Node* next;
} Node;Node n2;
2))
struct Node
{
int data;
struct Node* next;
};
typedef struct Node Node;
Node n2;
1))的效果与2))的效果一样