C语言基础之——结构体

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

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


目录

一.什么是结构体

二.结构体讲解

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

2.结构体成员的类型

3.结构体变量的初始化

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

总结


一.什么是结构体

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

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

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

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

二.结构体讲解

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

struct name

{

member-list;

}variable-list;

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

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

cs 复制代码
#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就可以创建局部变量:

cs 复制代码
#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.结构体成员的类型

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

cs 复制代码
struct B
{
	char s;
};
struct A
{
	int a;
	char b;
	int* p;
	char arr[20];
	struct B ab;
};

3.结构体变量的初始化

我们还以学生为例:

cs 复制代码
#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;
}

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

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

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

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

cs 复制代码
#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;
}

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

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

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

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

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

来看实例:

cs 复制代码
#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;
}

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

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

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

cs 复制代码
#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语言的各个章节的整体的基础知识。

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

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

我们下期再见!

相关推荐
A懿轩A27 分钟前
C/C++ 数据结构与算法【数组】 数组详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·考研·算法·数组
半盏茶香32 分钟前
在21世纪的我用C语言探寻世界本质 ——编译和链接(编译环境和运行环境)
c语言·开发语言·c++·算法
Evand J1 小时前
LOS/NLOS环境建模与三维TOA定位,MATLAB仿真程序,可自定义锚点数量和轨迹点长度
开发语言·matlab
LucianaiB1 小时前
探索CSDN博客数据:使用Python爬虫技术
开发语言·爬虫·python
Ronin3052 小时前
11.vector的介绍及模拟实现
开发语言·c++
字节高级特工2 小时前
【C++】深入剖析默认成员函数3:拷贝构造函数
c语言·c++
计算机学长大白3 小时前
C中设计不允许继承的类的实现方法是什么?
c语言·开发语言
PieroPc3 小时前
Python 写的 智慧记 进销存 辅助 程序 导入导出 excel 可打印
开发语言·python·excel
2401_857439696 小时前
SSM 架构下 Vue 电脑测评系统:为电脑性能评估赋能
开发语言·php
SoraLuna6 小时前
「Mac畅玩鸿蒙与硬件47」UI互动应用篇24 - 虚拟音乐控制台
开发语言·macos·ui·华为·harmonyos