1. 结构体的声明
首先呢, 结构是一些值的集合, 这些值称为成员变量, 结构的每个成员变量可以是不同类型的变量.
一般的声明
- struct Book
- {
- char name[100]; // 书名
- float price; // 价格
- }b1,b2; // 全局变量
- struct Book b3; // 全局变量
- // 并且上面两种表示方式是相同的意思
- int main()
- {
- struct Book b5; // 这里的变量叫做局部变量
- return 0;
- }
特殊的声明
- struct
- {
- int a;
- char b;
- float c;
- // 此处未完全声明变量, 缺少了结构体标签
- // 这种叫做匿名结构体类型
- }b;
- struct
- {
- int a;
- char b;
- float c;
- }*ps;// 结构体的指针变量, 用来存储地址
!! 但是 ps=&x;
这种写法是不合法的, 编译器认为这两种不同的写法是两个不同的类型.
2. 结构体的自引用
此处, 我们用一个例子来讲述我们来表述一个数据结构链表中的节点
- struct Node
- {
- int data;
- struct Node*next;
- };
- int main()
- {
- struct Node a = { 3, NULL };
- struct Node b = { 5, &a };
- printf("%d\n", b.data);
- printf("%p\n", b.next);
- system("pause");
- return 0;
- }
下面的地址便是结构体中 b 指向的地址, 即 a 的地址.
!!! 很重要的一点, 当结构体自引用的时候, 不可写成匿名结构体类型.
例题如下
- typedef struct
- {
- int data;
- Node* next;
- }Node;
在此处编译会出现错误, 是由于 Node 在末尾端才定义, 但在结构体内部便已经被调用, 这样是非法的.
正确的写法如下:
- typedef struct Node
- {
- int data;
- struct Node* next;
- }Node;
3. 结构体变量的定义和初始化
简单结构体的初始化
- struct Point
- {
- int x;
- int y;
- };
- int main()
- {
- struct Point p2 = { 1, 2 }; // 定义一个局部变量 p2 并且给其进行赋值
- printf("%d %d\n", p2.x, p2.y);
- system("pause");
- return 0;
- }
结构体嵌套的初始化
- struct Point
- {
- int x;
- int y;
- };
- struct Node
- {
- int data;
- struct Point p;
- struct Node* next;
- };
- int main()
- {
- struct Node n1 = { 5, { 1, 2 }, NULL };
- struct Node n2 = { 8, { 3, 4 }, &n1 };
- printf("%d\n", n2.next->data);
- printf("%d %d\n", n2.next->p.x, n2.next->p.y);
- printf("%p\n", n2.next);
- system("pause");
- return 0;
- }
来源: http://www.bubuko.com/infodetail-3096019.html