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;}