C语言的结构体

什么是结构体

结构体是一种数据存储结构,它可以存储各种不同类型的数据。所以,我们可以运用结构体,来存放我们所需要存放的各种类型的数据。

 

结构体的定义与使用

一般用 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;
}

 

 

 

 

 

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值