返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言结构体的全方面解读
  • 790
分享到

C语言结构体的全方面解读

2024-04-02 19:04:59 790人浏览 八月长安
摘要

目录前言一、结构体的声明与定义1.结构体的声明2.结构成员的类型3.结构体的定义二、初始化结构体三、访问结构体成员四、结构体嵌套五、结构体指针六、结构体传参总结前言 C语言提供了不同

前言

C语言提供了不同的数据类型,比如说int、float、double、char等,不同的类型决定了一个变量在内存中应该占据的空间以及表现形式。
但是,当我们定义一个人的时候,人的不同属性就比较难用同一个数据类型来定义了,因为人的身高、年龄、体重等属性往往需要不同数据类型,在这个时候,我们便引入结构体这个概念。

一、结构体的声明与定义

1.结构体的声明

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

当我们面对的事物有多个不同的数据类型的时候,我们就可以使用结构体来组织了。

比如说,一本书有书名、作者、售价、出版日期等等不同的数据类型,这时候我们可以创建结构体来包含书的不同数据类型。

而结构体声明是描述结构体组合的主要方法,语法格式为:

struct 结构体名称
{
结构体成员1;
结构体成员2;
结构体成员3;

};//分号不能丢

【注意】

结构体成员既可以是任何一种基本的数据类型,也可以是另一种结构体,如果是后者就相当于结构体的嵌套。(俗称套娃)

例如:


struct Book//描述一本书的相关属性,其中Book是这个框架的名称
{
	char name[20];//书名
	char author[20];//作者
	float price;//价格
};//分号一定不能丢

这样就相当于描述了一本书的框架。

2.结构成员的类型

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

3.结构体的定义

结构体的声明只是进行一个简单的描述,实际上在没有定义结构体类型变量之前,它是不会在内存中分配空间的。

也就是说,它还没有被真正使用,虚拟存在,只有定义了结构体类型变量,才真实存在。

举个例子,上面定义了书的框架


struct Book//描述一本书的相关属性,其中Book是这个框架的名称
{
	char name[20];//书名
	char author[20];//作者
	float price;//价格
};//分号一定不能丢

这里在编译器中,并不会分配内存空间,它仅仅是虚拟存在。而一旦我们定义了结构体类型变量,它就可以被分配空间了。

比如:


struct Book//描述一本书的相关属性,其中Book是这个框架的名称
{
	char name[20];//书名
	char author[20];//作者
	float price;//价格
};//分号一定不能丢

int main()
{
	struct Book book;//局部变量--放在栈区
	return 0;
}

我们在上面例子中也可以注意到,定义结构体变量的语法是:

struct 结构体名称 结构体变量名

此外,还可以在结构体声明的时候定义结构体变量


struct Book//描述一本书的相关属性
{
	char name[20];
	char author[20];
	float price;
}b1,b2;//b1,b2是全局变量。放在静态区

int main()
{
	struct Book book;//局部变量--放在栈区
	return 0;
}

b1、b2结构体变量是一个全局变量,在其他函数中也可以对它进行访问。

二、初始化结构体

我们在定义一个变量或数组的时候可以对其进行初始化,
例如:


int a=10;
int arr[10]={1,2,3,4,5,6,7,8,9,0};

同理,定义结构体变量的时候,我们也可以同时为其初始化


struct Book//描述一本书的相关属性
{
	char name[20];
	char author[20];
	float price;
}b1,b2;//b1,b2是全局变量。放在静态区

int main()
{
	struct Book book=
	{
	"《笑傲江湖》","金庸",30
	};//这样的话,就将结构体变量初始化了,也就是定义变量的同时赋初值
	return 0;
}

三、访问结构体成员

结构体变量访问成员 结构变量的成员是通过点操作符(.)访问的。点操作符接受两个操作数。

比如,book.name就是引用book结构体变量的name成员,它是一个字符数组。


#include <stdio.h>

struct Book//描述一本书的相关属性
{
	char name[20];
	char author[20];
	float price;
}b1, b2;//b1,b2是全局变量。放在静态区

int main()
{
	struct Book book=
	{
		"《笑傲江湖》", "金庸", 30
	};//这样的话,就将结构体变量初始化了,也就是定义变量的同时赋初值
	printf("%s %s %f\n", book.name, book.author, book.price);
//用. 来访问
	return 0;
}

在这里插入图片描述

四、结构体嵌套

如果访问嵌套的结构体成员的话,就需要使用多层点号运算符来进行操作。因为C语言的结构体只能对最底层的成员进行访问,如果存在多级结构体嵌套的话,就需要一级一级地深入,直到找到最底层的成员才行


struct S
{
	int a;
	char c;
	double d;
};
struct T
{
	struct S s;//结构体嵌套
	char name[20];
	int num;
};

int main()
{
	struct T t = { {100,'c',3.14},"里斯",30 };
	printf("%d %c %f %s %d\n", t.s.a, t.s.c, t.s.d, t.name, t.num);//使用了两层点号运算符寻找成员
	return 0;
}

在这里插入图片描述

五、结构体指针

在开头的时候说过,结构的成员可以是标量、数组、指针。
在这里,我们来认识一下结构体指针。

struct Book *pt;

这里声明了一个指向Book结构体类型的指针变量pt


struct S
{
	int a;
	char c;
	double d;
};
struct T
{
	struct S s;
	char name[20];
	int num;
};

int main()
{
	struct T t = { {100,'c',3.14},"里斯",30 };
	printf("%d %c %f %s %d\n", t.s.a, t.s.c, t.s.d, t.name, t.num);

	struct T*pt = &t;//拿到地址的方式
	printf("%d %c %f %s %d\n", (*pt).s.a, (*pt).s.c, (*pt).s.d, (*pt).name, (*pt).num);
	printf("%d %c %f %s %d\n",pt->s.a,pt->s.c,pt->s.d,pt->name,pt->num);
	return 0;
}

【注意】数组名指向的是第一个元素的地址,所以可以直接将数组名赋值给指针变量。但是结构体变量的变量名并不是指向该结构体的地址,所以要使用取地址运算符(&)才能获取其地址。
如上面的:

struct T*pt = &t;//拿到地址的方式

通过上面的例子我们也可以发现,通过结构体指针访问结构体成员有以下两种方法:

(1)(*结构体指针).成员名
(2)结构体指针->成员名

第一种由于点号运算符(.)比指针的取值运算符(*)优先级高,所以要使用小口号先对指针进行解引用,让它变成该结构体变量,再用点运算符取访问其成员。

以上两种方法在实现的时候完全等价。但是,切记,点号(.)只能用于结构体,而箭头(->)只能用于结构体指针。

【打印结果一样】

在这里插入图片描述

当二者皆可用的时候,优先采用第二种方法,因为箭头具有指向性,很直观的就可以把它与指针联系起来了。

六、结构体传参

函数调用的时候,参数的传递就是值传递的过程,也就是将实参传给形参的过程。所以,结构体变量可以作为函数的参数传递,两个相同结构体类型的结构体变量也支持直接赋值。


struct S
{
	int arr[100];
	int num;
	char ch;
	double d;
};

//结构体传参
void print1(struct S ss)
{
	printf("%d %d %d %c %1f", ss.arr[0],ss.arr[2],ss.num,ss.ch,ss.d);
}
//结构体地址传参
void print2(struct S*ps)
{
	printf("%d %d %d %c %1f", ps->arr[0], ps->arr[2], ps->num, ps->ch, ps->d);
}
int main()
{
	struct S s = { {1,2,3,4,5}, 100, 'w',3.14  };

	print1(s);//传结构体
	print2(&s);//传地址
	return 0;
}

在这里插入图片描述

可以看到,确实把参数传递过去了。

那么,上面的 print1 和 print2 函数哪个好些?

答案是:首选print2函数。 原因:

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

因此,结构体传参的时候,要传结构体的地址。

总结

本文介绍的是C语言结构体的一些基础知识,结构体的内容还远远不止这些,在以后学习到了更深的内容之后,或许会再写一篇博客深入介绍。此外,本文参考了小甲鱼的《零基础入门学习C语言》一书,以及网上的部分资料,与自己在学习听课时的笔记,梳理而成。其中或有遗漏之处,或内容的来源,或讲解的疏漏,还请看到的大家多多包含与见谅!

希望能对看到的大家有所帮助!

到此这篇关于C语言结构体的全方面解读的文章就介绍到这了,更多相关C语言 结构体内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C语言结构体的全方面解读

本文链接: https://lsjlt.com/news/155414.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C语言结构体的全方面解读
    目录前言一、结构体的声明与定义1.结构体的声明2.结构成员的类型3.结构体的定义二、初始化结构体三、访问结构体成员四、结构体嵌套五、结构体指针六、结构体传参总结前言 C语言提供了不同...
    99+
    2024-04-02
  • C语言全面梳理结构体知识点
    目录一、什么是结构体二、结构体的定义三、结构体变量的定义四、结构体变量的初始化五、结构体变量的赋值六、引用结构体变量中的成员七、结构体变量的传参问题八、传输地址带来的问题九、动态结构...
    99+
    2024-04-02
  • C语言结构体struct详解
    目录结构体的概念结构体类型的声明结构体变量的创建typedef关键字结构体的嵌套结构体变量的初始化结构体成员的访问结构体的传参总结结构体的概念 结构体是由一系列具有相同类型或不同类型...
    99+
    2024-04-02
  • C 语言结构体的使用方法
    目录C 语言结构体使用1. 结构体的声明和定义1.1 介绍1.2定义的几种类型2. 结构体初始化3. 结构体成员访问4. 结构体传参C 语言结构体使用 1. 结构体的声明和定义 1....
    99+
    2024-04-02
  • C语言结构体的具体使用方法
    目录初识C语言结构体1.为什么要有结构体2.结构体的定义2.1结构体类型的定义2.2定义结构体普通变量及访问2.3定义结构体指针变量及访问初识C语言结构体 1.为什么要有结构体 (1...
    99+
    2024-04-02
  • C语言的结构体你了解吗
    目录结构体内存对齐结构体传参结构体实现位段什么是位段位段在内存中的存储位段的问题总结结构体内存对齐 当我们创建一个结构体变量时,内存就会开辟一块空间,那么在创建结构体变量时内存到底是...
    99+
    2024-04-02
  • C语言之结构体(struct)详解
    目录为什么需要引入结构体struct定义typedef与#define结构体变量初始化及成员访问结构体访问总结为什么需要引入结构体 原有的数据类型不能满足需求,因此才设计了构造类型结...
    99+
    2024-04-02
  • C语言 - 结构体、结构体数组、结构体指针和结构体嵌套
    结构体的意义 问题:学籍管理需要每个学生的下列数据:学号、姓名、性别、年龄、分数,请用 C 语言程序存储并处理一组学生的学籍。 单个学生学籍的数据结构: 学号(num): int 型姓名(name) :char [ ] 型性别(sex):c...
    99+
    2023-08-30
    c语言 开发语言
  • 浅谈C语言结构体
    目录前言什么是结构体结构体类型的声明结构的自引用结构体变量的定义和初始化结构体的使用结构体内存对齐结构体传参总结前言 在C语言中,除了内置的许多数据类型,C语言还为我们提供了自定义的...
    99+
    2024-04-02
  • C语言结构体(struct)的详细讲解
    目录引言1. 动态内存管理2. 结构体2.1 定义语法2.2 定义示例2.3 初始化2.4 结构体赋值2.5 结构体数组2.6 结构体指针赋值3. 学生管理系统附:结构体变量的存储原...
    99+
    2024-04-02
  • 详解C语言中结构体的使用
    目录结构体的声明结构体成员的类型结构体成员的访问结构体的声明 结构体的定义:结构体是一些值的集合,这些值称为成员变量,结构体的每个成员可以是不同类型的变量。 举例: //定义结构体类...
    99+
    2024-04-02
  • C语言结构体,枚举,联合体详解
    目录1.什么是结构体、枚举、联合体2.定义结构体2.1 包含结构体成员变量、variable2.2 tag、结构体成员变量2.3 用结构体声名变量2.4 用typedef 创建新类型...
    99+
    2024-04-02
  • C语言中结构体实例解析
    目录一.结构体定义二.实例演示结构体作为函数参数结构体指针三.typedef struct 和 struct的区别1、声明不同2、访问成员变量不同3、重新定义不同总结一.结构体定义 ...
    99+
    2024-04-02
  • C语言结构体超详细讲解
    目录前言1、结构体的声明1.1 结构的基础知识1.2 结构的声明1.3 结构成员的类型1.4 结构体变量的定义和初始化2、结构体成员的访问2.1 点操作符访问2.2 ->操作符...
    99+
    2024-04-02
  • Go语言数据结构全面解析:队列和栈解读
    队列遵循先进先出原则,在go语言中可使用链表实现。栈遵循后进先出原则,可使用切片便捷创建。队列适用于需按序处理数据的场景,如打印任务队列或消息队列。栈适用于需倒序处理数据的场景,如函数调...
    99+
    2024-04-08
    队列 go语言
  • C语言struct结构体介绍
    目录structstruct的嵌套实验struct C 语言没有其他语言的对象(object)和类(class)的概念,struct 结构很大程度上提供了对象和类的功能。 下面是st...
    99+
    2024-04-02
  • c语言怎么加结构体
    c 语言中添加结构体的方法是:使用 struct 关键字定义结构体类型。声明结构体变量。通过点运算符 (.) 访问结构体成员。 C 语言中添加结构体 在 C 语言中,可以通过使用 st...
    99+
    2024-05-23
    c语言 typedef
  • c语言结构体怎么用
    结构体是一种将相关数据项组合在一起的复合数据类型。声明结构体时需使用 struct 关键字,定义结构体变量需使用结构体名称后跟变量名。访问结构体成员使用点号运算符 (.)。结构体可以在声...
    99+
    2024-05-15
    c语言
  • C语言结构体指针案例解析
    写结构体指针前,先说一下 . 号和 -> 的区别 记得当初刚学C语言的时候,搞不清结构体的 . 号和 -> ,经常混淆二...
    99+
    2024-04-02
  • C语言结构体简单入门讲解
    结构体 定义:用于存储不同的数据类型,存储在同一块内存空间里面 关键字 struct 标签 结构体名称 成员 例如: struct student {...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作