C语言:结构体详解(简单易懂)

这篇具有很好参考价值的文章主要介绍了C语言:结构体详解(简单易懂)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言:

我们在前面的C语言学习过程中,学习了各种数据类型,例如:整型数据类型、字符型数据类型,浮点型数据类型等,这些数据类型的设计都是为了对实际生活中的各种数据进行在计算机上的储存,但我们生活中还有一些数据无法使用以上单一的数据类型进行描述,例如;如何在计算机上保存一个人的信息,一个人的信息包括名字(字符)、年龄(整型),身高(浮点型)、体重(浮点型)等等。此时,C语言就设计出了结构体来对一些复杂的数据进行描述及数据的储存。

结构体类型的声明

结构的基础知识

结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量

结构体的声明

struct tag
{
 	member-list;
}variable-list;//注意这里的分号不要漏写

c语言中结构体的实现,C语言,c语言,c++,算法,经验分享,开发语言
举个例子:

描述一个学生的信息。

struct Stu
{
	char name[20];//名字
	int age;//年龄
	char sex[5];//性别
	char id[10];//学号
}s1;//结构体成员变量

c语言中结构体的实现,C语言,c语言,c++,算法,经验分享,开发语言

结构成员的类型

结构的成员可以是标量、数组、指针,甚至是其他结构体。

结构体变量的定义和初始化

有了结构体类型,那如何定义变量,其实很简单。
结构体变量的定义有两种:

  1. 在创建结构体的同时定义结构体变量。
  2. 在结构体的外边定义结构体变量。
#include <stdio.h>
struct Point
{
	int x;
	int y;
}p1; //声明类型的同时定义变量p1(第一种定义方式)

struct Point p2; //定义结构体变量p2(第二种定义方式)

struct Point p3 = { 1, 2 };//初始化:定义变量的同时赋初值。


struct Stu//类型声明
{
	char name[15];//名字
	int age;//年龄
};
struct Stu s = { "zhangsan", 20 };//初始化


struct Node
{
	int data;
	struct Point p;//结构体嵌套
	struct Node* next;
}n1 = { 10, {4,5}, NULL }; //结构体嵌套初始化

struct Node n2 = { 20, {5, 6}, NULL };//结构体嵌套初始化

结构体成员访问

我在之前的C语言操作符详解文章中详细讲解过结构体成员访问操作符,这里就简要介绍一下,不过多赘述了,有兴趣的可以看下我之前的文章:

  • 文章链接:C语言:操作符详解

结构体成员访问操作符分为点操作符(.)箭头操作符(->)
结构体成员访问操作符接受两个操作数

使用格式:

  • .
    结构体.成员名
  • ->
    结构体指针->成员名

举例:点操作符

#include <stdio.h>
struct stu
{
	char name[15];
	int age;
};

int main()
{
	struct stu s1 = { "zhangsan", 20 };//定义及其初始化
	printf("%s %d\n", s1.name, s1.age);
	//通过点操作符(.)访问到结构体变量s1中的name成员
	//通过点操作符(.)访问到结构体变量s1中的age成员
	return 0;
}

c语言中结构体的实现,C语言,c语言,c++,算法,经验分享,开发语言
注意:
如果你在结构体定义初始化的时候不按照结构体内部成员变量的顺序来初始化的时候,就需要使用点操作符来指向对应的结构体成员。

#include <stdio.h>
struct stu
{
	char name[15];
	int age;
};

int main()
{
	struct stu s1 = { "zhangsan", 20 };
	struct stu s2 = { .age = 20, .name = "zhangsan" };
	printf("%s %d\n", s1.name, s1.age);
	printf("%s %d\n", s2.name, s2.age);
	return 0;
}

c语言中结构体的实现,C语言,c语言,c++,算法,经验分享,开发语言


举例:箭头操作符

#include <stdio.h>
struct stu
{
	char name[15];
	int age;
};

int main()
{
	struct stu s1 = { "zhangsan", 20 };//定义及其初始化
	struct stu* p1 = &s1;//结构体指针p1指向s1的地址
	printf("%s %d\n", p1->name, p1->age);
	//通过箭头操作符(->)通过p1指针访问到结构体变量s1中的name成员
	//通过箭头操作符(->)通过p1指针访问到结构体变量s1中的age成员
	return 0;
}

c语言中结构体的实现,C语言,c语言,c++,算法,经验分享,开发语言

结构体传参

当我们需要把结构体传到某一个函数内部调用时,就涉及到结构体传参的知识。
举例:

设计一个print函数来打印结构体的内容。

函数调用时,函数传参分为传值调用和传址调用。

如果你不太了解,这里放上我的另一篇文章,里面详细介绍了有关函数的相关知识,有兴趣的可以点击阅读:

  • 文章链接:C语言:函数详解

这里我们用两种形式分别实现一下:
传值调用:

#include <stdio.h>
struct stu
{
	char name[15];
	int age;
};

//结构体传参
void print(struct stu s)
{
		printf("%s %d\n", s.name, s.age);
}
int main()
{
	struct stu s1 = { "zhangsan", 20 };//定义及其初始化
	print(s1);//结构体传值
	return 0;
}

c语言中结构体的实现,C语言,c语言,c++,算法,经验分享,开发语言

我们知道,函数传参时使用传值调用,形参是实参的一份临时拷贝

所以这里在结构体s1传参的时候,其实是把s1的内容完全复制了一份让print函数中的结构体s来接收,打印的是s中拷贝的s1的内容。


传址调用:

#include <stdio.h>
struct stu
{
	char name[15];
	int age;
};

//结构体地址传参
void print(struct stu* s)
{
	printf("%s %d\n", s->name, s->age);
}
int main()
{
	struct stu s1 = { "zhangsan", 20 };//定义及其初始化
	print(&s1);//结构体传址
	return 0;
}

c语言中结构体的实现,C语言,c语言,c++,算法,经验分享,开发语言

函数传参时使用传址调用,形参是实参的地址

所以这里在结构体s1传参的时候,其实是把s1的地址传过去,print函数中的结构体指针s接受s1的地址,然后通过箭头操作符,通过指针s找到s1的空间,最后打印的是s1的内容。


思考:
上面的两种传参函数哪个好些?
答案是:首选传址调用的函数。
原因:

函数传参的时候,参数是需要压栈的。
如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。

结论:

结构体传参的时候,尽量要传结构体的地址。


本篇关于C语言结构体的讲解就到此结束了,感兴趣的的小伙伴点点赞,点点关注,谢谢大家的阅读哦!!!
但是对于结构体的知识还不止这些,关于结构体内存对齐、结构体实现位段、枚举和联合的讲解会放在后边继续介绍,点点关注,后期不错过哦。😘


我相信大家在编写代码的时候常常会出现各种各样的错误,但又不知道错误在哪,搞得自己痛苦不堪,本博主告诉你不用担心,我下一篇将会对代码的实用调试技巧出一篇文章,详细介绍各种调试工具,帮助你更好的发现问题,解决问题哦。
你们的鼓励就是我的动力,欢迎下次继续阅读!!!😘😘😘文章来源地址https://www.toymoban.com/news/detail-789562.html

到了这里,关于C语言:结构体详解(简单易懂)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 结构体的简单介绍

    目录 概念: 与数组类比: 结构体声明: 注意: 结构体变量、全局变量、局部变量:  结构体声明中包含其他结构体变量: 结构体变量的初始化: 包含了其他结构体变量的初始化: 初始化的顺序:   结构体变量的打印: 包含其他结构体变量的打印: 使用指针变量名的打

    2024年02月10日
    浏览(35)
  • RSA 加密解密算法实现(简单,易懂)!!!

    目录 一、什么是RSA算法 1.对称加密 2.非对称加密 3.非对称加密的应用 二、RSA算法的基础操作步骤 1.生成公钥和私钥 2.用公钥加密信息  3.用私钥解密信息 三、AC代码 六、RSA算法的测试  七、共勉     在计算机中常用的加密算法分为两类: 对称加密算法和非对称加密算法。

    2024年01月20日
    浏览(68)
  • 【C语言13】结构体的声明,定义与结构体的内存对齐

    通俗的说,结构体就是一个类的集合,如同整形数组是整形数字的集合体,结构体也是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。 如果我们要表达一本书,那么这本书的元素有什么呢,书的名字,书的作者,书的创作日期~,而c语言中内置

    2024年02月13日
    浏览(72)
  • 【算法与数据结构】 C语言实现单链表队列详解

    前面我们学习了队列的顺序表的实现,本节将用单链表实现队列。 队列也可以数组和链表的结构实现, 使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数组头上出数据,效率会比较低 。下面我们先复习一下队列的基本概念: 队列:只允许在一端进行插入

    2024年04月11日
    浏览(59)
  • C语言结构体的定义与使用

    参考:C语言指针 1.定义与使用 结构体是一种构造数据类型,把不同类型的数据组合成一个整体 结构体的定义形式:   结构体是一种集合,它里面包含了多个变量或数组,它们的类型可以相同,也可以不同,每个这样的变量或数组都称为结构体的成员(Member)。请看下面的

    2024年02月05日
    浏览(49)
  • C语言如何计算结构体大小(结构体的内存对齐)

    结构体的内存对齐是有关结构体内容的很重要一个知识点,主要考察方式是计算结构体的字节大小。 当我们对计算结构体一无所知,我们不妨自己思索如何计算,是不是直接计算结构体成员变量占用内存的大小呢? 那我们先举个例子  观察发现结构体的大小计算跟我们想的

    2024年02月16日
    浏览(46)
  • C语言结构体的初始化方式

    逐个初始化字段 :这是最直接的方式,你可以逐个为结构体的每个字段进行初始化。 2.使用结构体字面值初始化 :这种方式允许你在初始化时使用一个字面值来为结构体提供初始值 3. 全局初始化 :在全局范围内,你可以在变量声明时就进行初始化。 4. 使用  memset  函数 :

    2024年02月09日
    浏览(57)
  • C语言笔记——结构体的三种打印方法

    (看鹏哥C语言视频学的,自己做的笔记) 首先定义一个结构体(以学生的信息为例): 第一种 打印方法: 注意:age要对应%d,其余都是%s,其余三个顺序换了无所谓。 运行结果:   第二种 打印方法(函数+地址): 第三种 打印方法(与第二种方法类似,用箭头表示而已)

    2024年02月02日
    浏览(50)
  • 【C语言】什么是结构体内存对齐?结构体的大小怎么计算?

      目录 1.结构体内存对齐 对偏移量的理解:​ 2.结构体的大小计算 2.1结构体中只有普通的数据类型的大小计算 2.2 结构体中有嵌套的结构体的大小计算 3.修改默认对齐数 4.为什么存在内存对齐? 这篇文章主要介绍结构体内存对齐和如何计算大小。 在学习结构体内存对齐之前,

    2024年02月11日
    浏览(52)
  • C语言深度剖析,关于查找一个数组里面的最大值(max)、最小值(min)的通俗算法,简单易懂。采用比较法进行查找。

    这里采用了一个假设 假设第一个数为最大值,其他数与第一个数比较。 这个算法与上面求解最大值的方法相反。 1、首先,定义行和列。 用行标记来确定列的数量。 i 来表示行, j来表示列。 2、内嵌的for循环只打印一行所有列。 如,i=3时,此时j=3. 从1*3 遍历到3*3后内嵌循环

    2024年02月08日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包