什么是结构体
结构体是一种数据存储结构,它可以存储各种不同类型的数据。所以,我们可以运用结构体,来存放我们所需要存放的各种类型的数据。
结构体的定义与使用
一般用 struct 来定义一个结构体变量,并且一般都会将结构体定义在全局范围。
定义:
一般形式如下:
struct 结构体名
{
数据类型 变量名;
数据类型 变量名;
... ...
}结构体变量;
例如:
struct Node
{
int num;
int age;
float t;
char sex;
}node;
我们还有另一种常用的定义方式:
typedef struct 结构体名
{
数据类型 变量名;
数据类型 变量名;
... ...
}结构体别名;
例如:
typedef struct Node
{
int a;
char b;
}node;
其中 typedef 的作用就是重新为结构体变量 Node 定义一个名字:node 他们可以同时表示这个结构体。
typedef 的其他应用:
typedef int m
此时 m 就相当于 int
拓展:
结构体的位域(位段)
我们在定义一些数据时,有时可能不需要太多的空间,可能用不了一个完整的字节,而只需要占几位。为了节省空间,将一个字节分为几个不同的区域,并说明每个区域的位数,每个区域又有各自的域名,我们就可以通过这样来利用位域处理变量。
一般形式如下:
typedef struct Node
{
类型说明符 位域名 : 位域长度
}node;
如:
typedef struct Node
{
int a :2;
char b :6;
}node;
注意点:
1.一个位域必须存储在同一个字节中,不能跨两个字节。若一个字节所剩空间不足以放另一个位域时,应在下一个字节存放。如下:
typedef struct Node
{
int a : 6;
char b : 3;//存放在下一个字节中
}node;
2.位域的长度不能跨越两个字节。
3.位域可以无位域名,这时它只用作填充或调整位置,无名的位域不能使用,如下:
typedef struct Node
{
int a : 5;
int b : 2;
int : 6;//无位域名,这6位无法用,只能用作填充或调整位置
int c : 5;
}node;
使用:
要使用结构体那就必须介绍 ". "运算符与 "-> " 运算符。
1. ". "运算符:要使用 “箭头运算符” 就必须声明一个结构体变量,结构体变量可以通过 "." 来访问结构体变量中的成员。
一般操作如下:
#include<stdio.h>
#include<stdlib.h>
typedef struct Node
{
int a; //定义结构体成员
}node;
int main()
{
node n; //定义结构体变量
scanf("%d",&n.a);//结构体变量通过点运算符访问结构体成员
//并对该成员赋值
system ("pause");
return 0;
}
点运算一般用于简单的结构体操作。
2. "-> " 运算符:要使用 “箭头运算符” 就必须声明一个结构体指针变量。并且还要为这个指针手动开辟一块内存,让这个指针指向那块内存。此时结构体指针变量可以通过 "->" 来访问结构体变量中的成员。
这里又不得不提两个函数 malloc 函数 与 free 函数
malloc函数:
原型为:void *malloc(unsigned int size);
它的作用是在内存的动态存储区中分配一个长度为 size 的连续空间(size是一个无符号常数)。
它的返回值是一个指向分配域起始地址的指针(void类型的指针)。
运用时,我们一般将定义的结构体指针变量称为头指针,我们要手动的分配一块内存,让头指针指向那块内存,我们将头指针指向的那块内存称之为头结点。结点中又分为两个部分,数据域和指针域,一般在开始时给它初始化。
如下:
#include<stdio.h>
#include<stdlib.h>
typedef struct Node
{
int date; //数据域
struct Node *next; //指针域
}node; //结构体名称
void Init(node *&n)//*&n的意思是直接引用在main函数中定义的n,不用在函数内再定义
{
n = (node *)malloc(sizeof(node));//为其分配一块内存
n ->next = NULL;//将指针域赋为空,防止发生内存泄漏
}
int main()
{
node *n ;//定义一个结构体指针变量
Init(n);//初始化
system ("pause");
return 0;
}
free函数:
一般与 malloc 函数连用,释放掉 malloc 函数给指针变量分配的内存空间。一般如果要释放哪一块内存,就free掉那一块所对应的指针就行。但是,在free后,一定要将那个指针赋为 NULL(零) 。因为free只是释放掉的那一块内存,并没有将指针销毁,所以会让编译器认为 p 是合法的指针,我们将其称为“悬空指针”,它可能会使程序功能不正常,导致系统崩溃。
结构体的初始化
一、可以在定义时赋值
struct Node
{
int a; //定义结构体成员
char *b;
double c;
}node={100,"asd",64.666};//赋值
二、定义之后逐个赋值
#include<stdio.h>
#include<stdlib.h>
struct Node
{
int a; //定义结构体成员
char *b;
double c;
}node;
int main()
{
node.a = 100;
node.b = "Ig NB";
node.c = 66.666;
system ("pause");
return 0;
}
定义后赋值,可以不用考虑赋值的顺序问题,如下:
#include<stdio.h>
#include<stdlib.h>
struct Node
{
int a; //定义结构体成员
char *b;
double c;
}node;
int main()
{
node.b = "Ig NB";
node.a = 100;
node.c = 66.666;
system ("pause");
return 0;
}