结构体

声明方式

结构体常见的两种声明方式,其余稀奇古怪的皆不谈。

1
2
3
4
struct Node {
int data;
struct Node* next;
};

上面这种方式最为常见,在创建结构体的时候,必须是 struct Node 才能创建。如果你觉得每次创建都要加上 struct 关键字很麻烦,那可以起别名,就像下面这样。

1
2
3
4
typedef struct node {
int data;
struct node* next;
} Node;

这其中的原理是什么呢 ?

typedef 是给类型起别名的,因此我们的下面这部分其实代表的是一个自定义类型,因此为这个自定义类型取名为 Node,方便以后使用。

1
2
3
4
struct node {
int data;
struct node* next;
}

字节对齐

这个已在其他文章中讲过,不必多言,这里重点说一说结构体字节对齐的特点:

  1. 一片连续的内存空间
  2. 成员是按声明的顺序依次存放
  3. 在结构体的中间或者后面可能会存在填充
  4. 填充的目的是为了对齐,对齐的目的是为了更快的访问数据项

操作

如果想把 一个结构体所有的数据全部 复制给另一个数据,只需要通过 = 赋值即可,而数组就做不到了。

1
2
3
4
Node node1 = { 12,NULL };
Node node2 = { 13,NULL };

node2 = node1;

那我们如何访问结构体的数据呢?

  • 如果值访问,那就是 .
  • 如果是指针访问,那就是 ->
1
2
3
4
5
Node node1 = { 12,NULL };
node1.data = 14; // 值访问

Node* node2 = malloc(sizeof(Node));
node2->data = 17; // 指针访问