C 语言中的结构体(数据结构)

前言

结构体是在数据结构中经常使用的一类,下面对结构体进行一些知识的补充。

结构体和数组的区别

在这里插入图片描述

结构体的声明

结构体声明的基本形式

struct tag {
	member-list
}variable-list;

参数解释

  1. tag:结构体的名字
  2. member-list:成员列表
  3. variable-list:变量列表

在结构体声明的时候,我们常会看到下面两种声明的方式

方式一(不带 tag)

struct {
	int age;
	char sex;
}man;

大多数初学者看到这一长串的时候会发昏,这样的声明形式和一般的 int a 的形式有什么关联呢?

在这里插入图片描述

方式二(带 tag)

struct people{
	int age;
	char sex;
};

struct people man1 , man2;

我们可以看到方式二的好处就是减少了变量声明的冗余。如果像方式一那样,你在另一个地方要声明一个相同的变量,就必须把前面的成员列表那一大部分也带上。

struct peple 作为整体相当于数据类型的名字,也就是说 struct peopleintfloat 是同一级别的概念。

同时使用方法一还会存在下面这个问题

struct {
	int age;
	char sex;
}man1;

struct{
	int age;
	char sex;
}man2;

man1 = man2;  // 报错 

虽然 man1 和 man2 是一样的结构体类型,但是编译器会认为是不同的类型。

但如果用方式二就不会报错

struct people{
	int age;
	char sex;
};

struct people man1 , man2; // 或者为了好理解,也可以是 
						   // struct people xiaozhang , xiaoli;
struct people man3;

man1 = man3; // 这样就正确 

关于 typedef

typedef 也是在数据结构中常用的 C 语言的东西。它的英文翻译是 “类型定义”。下面就来看看它的用法。

我更喜欢叫 typedef 为语义化,因为很大程度上使用 typedef 是为了语义化,是需要结合现实世界的。

  typedef int Money

这句代码的意思就是,从今往后,Money 就可以代表 int 使用了。

Money money ; // 此时 money 就是 int 类型,等价于 int money;

至于为什么使用 typedef 这样的方式,个人最大的感受就是语义化吧,当然 typedef 为什么要使用的其他原因可以自行谷歌。

typedef 在结构体的使用

先来看看这段代码

typedef struct people {
	int age;
	char sex;
} chinese;

很多人会和结构体的声明弄混,其实不是,我用图例来解释就清楚了(对比结构体声明的图例,观察二者的区别)

在这里插入图片描述
其中,people 表示的是结构体的名字,正如前面所说,struct peopleintbool 这些是同一级别的概念。

当然,用 typedef 的时候,你也可以省略结构的标签,所以你有时还会看到下面的写法

typedef struct {
	int age;
	char sex;
} chinese;

下面来看看数据结构单链表里面比较难理解的对单链表如何去定义

typedef struct Node_1
{
	int data;
	struct Node_1 *next;
}Node_2;

typedef struct Node_1 *linkList;

// 通常代码会把 Node_1 和 Node_2 都写成一样的 Node,具体的原因我也不是很清楚,
// 有知道的同学可以在下面留言
// 但是仅就代码而言 Node_1 表示的是结构体的名称,而 Node_2 表示的是代替简写 
// struct Node_1 的名称。

// 特别的是 struct Node_1 定义的是一个单独的结点,所以我们看到 struct Node_1 
// *next; 其本意是只该结点的下一个结点
// 而 typedef struct Node_1 *linkList; 表示的是一个结构体指针,有了指针,我们就
// 可以通过 malloc 函数将一个单独的结点扩充成一个链表了。

// 所以我们在定义 *linkList 的时候,typedef Node_2 *linkList; 和 
// typedef struct Node_1 *linkList; 都是正确的。

结构成员的访问

主代码

struct people{
	int age;
	char sex;
};

struct people man1 , man2,man3,*man4;

在这里插入图片描述
一个访问 typedef 定义的结构体的示例

// c++ 版本
#include <iostream>
using namespace std;

int main()
{
   typedef struct
   {
      int age;
	  string name;
   }people, *ppeople;
	
	// 点操作符
	people zhangsan = {13, "zhangsan"};
	
	cout << zhangsan.age << endl; // 13
	cout << zhangsan.name << endl; // zhangsan
	
	
	// 箭头操作符
	ppeople lisi = &zhangsan;
	lisi->age = 17;
	lisi->name = "lisi";
	cout << lisi->age << endl;
	cout << lisi->name << endl;
	
    return 0;
}

图解
在这里插入图片描述

  • 16
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值