C语言结构体详解

news/2024/11/27 12:44:51/

邀请加入嵌入式社区,您可以在上面发布问题,博客链接,公众号分享,行业消息,招聘信息等。

目录

结构体有什么用?

结构体声明

正常的结构体声明

匿名结构体

匿名结构体只有在创建的时候可以建立变量

两个相同的匿名结构体,编译器会认为是不相同

结构体自引用

结构体自引用结构体

结构体自引用结构体指针

typedef与结构体

只创建一个名称

创建两个变量名 

注意事项

赋值

引用数据


结构体有什么用?

我们学习结构体之前需要知道结构体有什么用。举个例子,假如我现在需要将100个学生的信息录入教学系统。他们有年龄,性别,名字。我们进行编程的时候。不可能一一进行变量创建。那样太麻烦了。

那么我们就可以创建一个结构体,这个结构体类型里面包含年龄,性别,名字。这样,我们可以把小明,小红,小华都设置为这个类型的结构体。然后再对这个结构体赋值就可以了。

结构体声明

正常的结构体声明

结构体声明有两种方法

第一种是struct Stu s2。需要注意,struct一定要写上!

第二种方法就是在声明结构体的时候,}后面加上需要设置的结构体变量。

//现在我们建立了一个结构体类型,这个结构体类型名字叫做Stu
//s3,s4,s5,s6为全局变量,s1,s2是局部变量,但是他们都是同一种类型的结构体变量struct Stu
{char name[20];//名字char tele[12];//电话char sex[10];//性别int age;
} s4,s5,s6;   //注意,这里的;不能少struct Stu s3;//全局变量int main()
{//创建的结构体变量struct Stu s1;//注意,这里的struct不能少struct Stu s2;return 0;
}

匿名结构体

匿名结构体只有在创建的时候可以建立变量

匿名结构体就是在创建结构体的时候,struct后面不加名字。个人不推荐使用匿名结构体,因为你创建了结构体之后,就不能再次创建该结构体的变量了

以下面这个为例子,我们struct后面没有增加名字。那么现在就只有sa这一个变量是属于该结构体类型变量。不能再次建立该类型的结构体变量了。

struct
{int a;char c;
}sa;  //这里一定要加sa,否则你接下来不能再次建立该结构体类型的变量了int main()
{struct s1;   //这样是不可以的return 0;
}

两个相同的匿名结构体,编译器会认为是不相同

我们都知道,char型指针如果指向一个int型数据。编译器会报警告。

int main()
{int x;char* y = &x;  //警告return 0;
}

匿名结构体依旧如此,我们看起来长得一样的两个匿名结构体,编译器也会将他们看成是两个不同的类型。

struct
{int a;char c;
}sa;struct
{int a;char c;
}* psa;int main()
{psa = &sa;  //警告,编译器会把上面的两个声明当成完全不同的两个类型return 0;
}

结构体自引用

结构体自引用结构体

结构体创建变量的时候,创建的变量中有一个是自己,类似于递归。(但是不同!)

struct Node
{int data;//4struct Node n;  //这样是错误的
};

上面这一串代码明显是错误的。因为,假如他是正确的,那么他的大小sizeof(struct Node)是多少呢?很显然,无法确认。

结构体自引用结构体指针

(1)数据结构中有一个东西叫做链表。

(2)因为我们平常使用的数据都是依次按照顺序连接的,但是,如果我现在需要在这一堆数据arr的中间假如一个其他数据a。那么现在我就需要将arr中间的数据改为a,然后更改的数据都往后移动。这样明显很麻烦。

(3)那么我们可以利用链表的方式,比如说,现在我们有一个数据链arr1。每一个数据指向后面这个数字。那么,我现在需要在中间增加一个数据b,只需要将插入前面这个数据指向b,然后b指向插入后面这个数据即可。

(4)那么,方法如下

 

struct Node
{int data;struct Node* next;
};

此时sizeof(struct Node)为多少呢?如果是32位的系统下,是8个字节。因为int是4个字节,后面这个指针在32位系统下也是4个字节。

typedef与结构体

只创建一个名称

因为我们每次创建一个变量需要写成 struct Stu s1;很明显太麻烦了。于是我们可以使用typedef与结构体给结构体起一个别名。

typedef struct Node
{double d;int data;
}Node;int main()
{//下面这两个等价struct Node n1;Node n2;return 0;
}

创建两个变量名 

有时候我们会看见typedef与结构体之后会有两个名字,这个是怎么会是呢?

这样就同时建立了两种类型,一种是Node型的结构体,一个是Node型的结构体指针。

// 在重命名结构体时,命名了两种:Node结构体类型,*pNode结构体指针类型
typedef struct Node
{double d;int data;
}Node,*pNode;int main()
{pNode = &Node;return 0;
}

注意事项

虽然我们有typedef,但是如果需要链表那种形式的创建,还是有讲究的地方。我们看下面这一段代码。

因为在我typedef之前,你就已经使用了Node了。那么编译器就不会认识Node*。

/***** 错误写法 *****/
typedef struct 
{double d;int data;//4Node* next;//4/8
}Node;/***** 正确写法 *****/typedef struct Node
{double d;int data;//4struct Node* next;//4/8
}Node;

赋值

对于结构体只能在定义的时候初始化才能全部赋值,之后就不能再全体赋值了,只能单个赋值

/******这样是可以的,在定义变量的时候就初始化了*******/struct book s1={ "guojiajiaoyun", "yuwen",22.5};/******这种就不行了,在定义变量之后,若再要对变量的成员赋值,那么只能单个赋值了*******/struct book s1;//这样就是不行的,只能在定义的时候初始化才能全部赋值,之后就不能再全体赋值了,只能单个赋值s1={"guojiajiaoyun","yuwen",22.5  };s1.title = "yuwen";//只能单个赋值;

引用数据

我们直接写上'.'进行数据引用

struct T
{double weight;short age;
};struct S
{char c;struct T st;int a;double d;char arr[20];
};int main()
{struct S s = { 'c', {55.6, 30}, 100, 3.14, "hello bit" };printf("%c %d %lf %s\n", s.c, s.a, s.d, s.arr);printf("%lf\n", s.st.weight);return 0;
}


http://www.ppmy.cn/news/2661.html

相关文章

Python编程 圣诞树教程 (附代码)程序员的浪漫

作者简介:一名在校计算机学生、每天分享Python的学习经验、和学习笔记。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​​ 目录 前言 一.python 做圣诞树 1.turtle库 2.python函数的定义规则 2.引入库 3.定…

02 stata入门【计量经济学及stata应用】

安装:建议直接在微信搜索,很多公众号有安装包资源及下载教程 不同版本在基本功能上无较大差异,一般为SE,更为专业MP,只是在处理变量个数或容量等存在不同 界面 历史命令;结果窗口&命令窗口&#xff1b…

MySQL——表的内容增删查改

文章目录表的增删改查一、Create1、单行全列插入2、多行数据指定列插入3、插入否则更新4、替换二、Retrieve😊(重点)2.1 select 列2.1.1 全列查询2.1.2 指定列查询2.1.3 查询字段为表达式2.1.4 为查询结果指定别名2.1.5 结果去重2.2 where查询2.3 结果排序2.4 筛选分…

Qt-数据库开发-QTableView操作数据库(1)

Qt-数据库开发-QTableView操作数据库 文章目录Qt-数据库开发-QTableView操作数据库1、概述2、实现效果3、主要代码4、完整源代码更多精彩内容👉个人内容分类汇总 👈👉数据库开发 👈 1、概述 这是通过学习Qt官方Demo产生的一个示例…

【Shell牛客刷题系列】SHELL22 处理文本

该系列是基于牛客Shell题库,针对具体题目进行查漏补缺,学习相应的命令。 刷题链接:牛客题霸-Shell篇。 该系列文章都放到专栏下,专栏链接为:《专栏:Shell》。欢迎关注专栏~ 本文知识预告: 本文…

C语言百日刷题第十三天

前言 今天是刷题第13天,放弃不难,但坚持一定很酷~ 临近期末,再刷一套模拟题 C语言百日刷题第十三天前言选择题判断题编程题选择题 1.若由定义int*p1,*p2,m5,n;以下赋值语句都正确的选项是() A、p1&m;p2&n…

计算机毕业设计ssm+vue基本微信小程序的琴房管理系统 uniapp 小程序

项目介绍 随着互联网技术的发发展,计算机技术广泛应用在人们的生活中,逐渐成为日常工作、生活不可或缺的工具,钢琴培训企业各种管理系统层出不穷,为钢琴培训企业琴房管理开发必要的系统,能够有效的提升管理效率。一直以来,钢琴培训企业琴房预约一直没有进行系统化的管理,学生无…

pytorch基础操作(三)梯度下降(小批量)计算线性回归

1、线性模型 线性假设是指⽬标(房屋价格)可以表⽰为特征(⾯积和房龄)的加权和,如下⾯的式⼦: price warea area wage age b. 其中: warea和wage 称为权重(weight),…