C语言基础之——结构体

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

前言:小伙伴们又见面啦,那么本篇文章,我们就将对C语言基础知识的最后一个章节——结构体展开讲解。

世上无难事,只要肯攀登!


目录

一.什么是结构体

二.结构体讲解

1.结构体的声明和变量的定义

2.结构体成员的类型

3.结构体变量的初始化

三.结构体成员的访问与传参

 总结


一.什么是结构体

结构体是为了用来描述复杂对象而创建的一种数据类型

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

那么我们为什么要创造和使用结构体呢???

比如说:当我们要描述一个人时,需要接收这个人的名字、年龄、性别、电话等等,这些信息分别属于不同的数据类型,单单用一种数据类型无法完全描述,所以就出现了结构体这一能够将多个不同数据类型的变量集合起来集合性数据类型

二.结构体讲解

1.结构体的声明和变量的定义

struct name

{

        member-list;

}variable-list;

  • struct是创建一个结构体所必要的关键字,它表示我们要创建一个什么样的结构体类型。
  • name则是这个结构体的类型名字,可以自由选择。
  • member-list是你所需要的成员变量的列表,可以是多个。
  • variable-list是结构体类型的变量列表。

我们来实际创建一个学生类型的结构体:

#include<stdio.h>
struct Student
{
	//学生的各种属性成员
	char name[20];//名字是字符串,用数组存放
	int age;//年龄
	char sex[5];//性别是字符串,用数组存放
	int stunum[15];//学号也是一串数字,用数组存放
}s1, s2;//定义变量
int main()
{
	struct Student s3;//定义变量
	struct Student s4;//定义变量
	return 0;
}

学生有姓名、年龄、性别、学号等等属性成员。

s1、s2、s3、s4是我们分别定义的结构体类型的变量。其中s1、s2是全局变量,因为在main函数的外边,s3、s4则是局部变量。

我们看到上边对结构体局部类型变量的创建前边都需要struct来表示,其实我们还有另一种创建方式,不需要用到struct就可以创建局部变量:

#include<stdio.h>
typedef struct Student
{
	//学生的各种属性成员
	char name[20];//名字是字符串,用数组存放
	int age;//年龄
	char sex[5];//性别是字符串,用数组存放
	int stunum[15];//学号也是一串数字,用数组存放
}Student;//重命名产生的新类型
int main()
{
	Student s3;//变量
	Student s4;//变量
    struct Student s5;//变量
	return 0;
}

我们用到了typedef关键字,作用是类型定义。它用在结构体的开头时,我们就可以给结构体类型取一个新的名字,就比如我们结构体末尾的Student,随后就可以用这个新名字来定义变量啦。

当然struct在这样的定义下也是可以继续用的

2.结构体成员的类型

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

struct B
{
	char s;
};
struct A
{
	int a;
	char b;
	int* p;
	char arr[20];
	struct B ab;
};

3.结构体变量的初始化

我们还以学生为例:

#include<stdio.h>
struct Student
{
	//学生的各种属性成员
	char name[20];//名字是字符串,用数组存放
	int age;//年龄
	char sex[5];//性别是字符串,用数组存放
	int stunum[15];//学号也是一串数字,用数组存放
};
int main()
{
	struct Student s1;//定义变量
	struct Student s1 = { "zhangsan",18,"nan",{2,2,2,8,7,6,0,0,1} };
	return 0;
}

初始化结构体变量初始化时要用{},我们上述的初始化是按顺序全部初始化的,当然我们也可以不按顺序,来看方法:

struct Student
{
	//学生的各种属性成员
	char name[20];//名字是字符串,用数组存放
	int age;//年龄
	char sex[5];//性别是字符串,用数组存放
	int stunum[15];//学号也是一串数字,用数组存放
};
int main()
{
	struct Student s1 = { .age = 18,.name = "zhangsan" };
	return 0;
}

不按顺序初始化则需要用到'.'+变量名的形式,这样我们也可以不对全部的变量初始化。

此外,结构体也可以嵌套初始化

#include<stdio.h>
struct Student2
{
	char name[20];//名字是字符串,用数组存放
	int age;//年龄
	char sex[5];//性别是字符串,用数组存放
	int stunum[15];//学号也是一串数字,用数组存放
};
struct Student
{
	//学生的各种属性成员
	char name[20];//名字是字符串,用数组存放
	int age;//年龄
	char sex[5];//性别是字符串,用数组存放
	int stunum[15];//学号也是一串数字,用数组存放
	struct Student2 s2;
};
int main()
{
	struct Student s1 = { "zhangsan",18,"nan",{2,2,2,8,7,6,0,0,1},{ "lisi",20,"nv",{2,2,0,8,7,6,0,0,1}} };
	return 0;
}

我们后边初始化的李四的信息,就是嵌套初始化。

此外,我们还有一种初始化方法,用成员访问操作符来初始化。我们在下文结构体成员的访问中讲述。

三.结构体成员的访问与传参

结构体成员的访问有两种方法:

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

来看实例:

#include<stdio.h>
#include<string.h>
struct Student
{
	char name[20];
	int age;
};
void set_s(struct Student s)
{
	//用成员访问操作符来初始化
	s.age = 18;
	//s.name = "zhangsan";//错误写法,因为name是一个数组名,是一个地址
	//想要用成员访问操作符初始化数组类型的成员变量,要用到strcpy
	strcpy(s.name, "zhangsan");
}
void print_s(struct Student s)
{
	printf("%s %d",s.name, s.age);
}
int main()
{
	struct Student s;
	//写一个函数来给s中存放数据
	set_s(s);
	//写一个函数来打印s中的数据
	print_s(s);
	return 0;
}

这样我们便实现了用结构体变量.成员名来访问并初始化成员变量

但是我们上述的写法却忘记了一个非常重要的问题,那就是我们传递给函数的参数问题

我们知道,形参是实参的一份临时拷贝,改变形参的值并不会影响实参,所以我们如果想用用函数来访问初始化成员变量,就必须传址

#include<stdio.h>
#include<string.h>
struct Student
{
	char name[20];
	int age;
};
void set_s(struct Student *ps)
{
	//用成员访问操作符来初始化
	ps->age = 18;
	//s.name = "zhangsan";//错误写法,因为name是一个数组名,是一个地址
	//想要用成员访问操作符初始化数组类型的成员变量,要用到strcpy
	strcpy(ps->name, "zhangsan");
}
void print_s(struct Student s)
{
	printf("%s %d",s.name, s.age);
}
int main()
{
	struct Student s;
	//写一个函数来给s中存放数据
	set_s(&s);
	//写一个函数来打印s中的数据
	print_s(s);
	return 0;
}

接收地址便要用到指针,而用指针访问成员变量,就需要用到结构体指针->成员名。这样我们便可以得到结果:

C语言基础之——结构体,c语言,开发语言,结构体

 总结

关于结构体的基础知识到这里就要结束啦。

至此,博主也是讲完了有关C语言的各个章节的整体的基础知识。

后续将会不定时的更新一些难以理解或者是零碎的一些小知识点的讲解,敬请期待!

喜欢博主文章的小伙伴们不要忘记一键三连哦!

我们下期再见!文章来源地址https://www.toymoban.com/news/detail-681031.html

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

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

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

相关文章

  • C语言基础 结构体排序

    任务描述 本关任务:有 n 个学生的信息(包括学号,姓名,成绩),要求按照成绩的高低顺序输出学生的信息。 相关知识 参考 结构体第1关 相关知识 编程要求 要求按照成绩的高低顺序输出学生的信息。 测试说明 平台会对你编写的代码进行测试,比对你输出的数值与实际正确

    2024年02月03日
    浏览(34)
  • 【go语言基础】结构体struct

    主要是敲代码,敲的过程中会慢慢体会。 结构体是用户定义的类型,表示若干字段的集合,目的是将数据整合在一起。 简单的说,类似Java中的实体类。存储某个实体属性的集合。 注意:结构体名字,结构体属性名的首字母大写代表其余的包可以访问该结构体,类似Java中的

    2024年02月13日
    浏览(48)
  • 【05】STM32·HAL库开发-C语言基础知识 | stdint.h介绍 | 位操作 | 宏定义的使用 | 条件编译 | extern声明 | typdef使用 | 结构体、指针、代码规范介绍。

      stdint.h 是从 C99 中引进的一个标准 C 库的文件,可以在MDK5的安装路径:D:MDK5.34ARMARMCCinclude中找到。   stdint.h 定义了很多类型别名,将有符号的char类型定义别名为int8_t等,使用此套别名有易于移植。   在MDK中需要配置才能支持使用S99标准, 默认是勾选的 。   只

    2024年02月08日
    浏览(33)
  • C语言基础 结构体存储学生信息

    任务描述 本关任务:使用结构体储存学生信息(包括学号,姓名, 3 门课程成绩,总分),要求实现对学生信息修改和删除操作,最多 50 名学生。 相关知识 参考 结构体第1关 相关知识 编程要求 使用结构体储存学生信息,实现对学生信息修改和删除操作。 测试说明 平台会

    2024年02月12日
    浏览(28)
  • Python语言基础---选择判断循环结构详解

    在Python编程语言中,选择判断和循环是两个非常重要的概念。它们可以让我们根据条件执行不同的代码块,或者重复执行一段代码,这为我们解决各种问题提供了强大的功能。本文将详细介绍Python语言中的选择判断和循环结构,帮助读者更好地理解和运用这些概念。 Python提供

    2024年02月13日
    浏览(53)
  • C语言零基础入门(结构体)

    C 语言内置的数据类型,除了最基本的几种原始类型,只有数组属于复合类型,可以同时包含多个值,但是只能包含相同类型的数据,实际使用中并不够用。 实际使用中,主要有下面两种情况,需要更灵活强大的复合类型。 复杂的物体需要使用多个变量描述,这些变量都是相

    2024年01月17日
    浏览(30)
  • 数据结构——二叉树基础结构篇(C语言)

    现在是北京时间2023年6月13日9点11分。从决定要开始减脂之后,饥饿总是伴随着我。一觉起来肚子咕咕叫,我还是想先把文章发了再吃第一餐。燕麦加蛋白粉几乎伴随了我大学的第一年早饭。昨天练了一个小时背,练背后还做了45分钟有氧。空腹训练没有影响我的训练状态。这

    2024年02月08日
    浏览(29)
  • 考研C语言刷题基础篇之分支循环结构基础(二)

    目录 第一题分数求和  第二题:求10 个整数中最大值 第三题:在屏幕上输出9*9乘法口诀表 第四题:写一个代码:打印100~200之间的素数  第五题:求斐波那契数的第N个数 斐波那契数的概念:前两个数相加等于第三个数 斐波那契数的公式: 第六题:汉诺塔游戏  思路:  1

    2024年01月22日
    浏览(40)
  • 零基础玩转C语言—结构体【初阶】

    大家好,我是深鱼~ 目录 【前言】: 一、结构体的声明 1.1结构的基本知识 1.2结构的声明 1.3结构体成员的类型 1.4结构体变量的定义和初始化 二、结构体成员的访问 【前言】:本章来介绍结构体的部分知识,并不会深入讲解,只是初阶部分,看得懂结构体的逻辑,并且会简单

    2024年02月14日
    浏览(31)
  • 数据结构零基础入门篇(C语言实现)

    前言:数据结构属于C++学习中较难的一部分,对应学习者的要求较高,如基础不扎实,建议着重学习C语言中的指针和结构体,万丈高楼平地起。 目录:   一,链表 1)单链表的大致结构实现 2)单链表的思考(然后找到链表和判断链表的结束) 3)单链表的程序实现及源代码

    2024年02月09日
    浏览(33)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包