IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C语言犄角旮旯的知识之结构体 -> 正文阅读

[C++知识库]C语言犄角旮旯的知识之结构体

目录

结构体

基本语法

定义新结构体

实例化结构体

访问成员变量

直接分量选择 双目操作符 "?. "

普通访问

指针访问

间接分量选择 双目操作符 "?-> "

结构体初始化

结构体统一初始化

直接初始化

结构体数组的初始化

实例操作


结构体

基本语法

定义新结构体

结构体是我们程序员自己定义的一种数据类型

struct 结构体名
{
    类型1 成员变量名1
    类型2 成员变量名2
    ...
};

实例化结构体

struct 结构体名 a;  //a就是新类型struct 结构体名的一个实例

不知道大家看到结构体实例化是不是特别眼熟 ,其实“struct 结构体名”与“int”是一个意思,只不过“struct 结构体名”是我们自己定义的类型,而“int”是C语言库中已经定义好的,使用方法都一样,就如同我们使用“int”一样,定义一个4字节32bit的整形数,而我们用我们自己定义的结构体就是,定义一个“struct 结构体名”的变量。


访问成员变量

如上述,我们实例化结构体后,便可以通过一些运算符来访问成员变量了。如下面这个结构体中的成员变量应该如何访问呢

struct date
{
	int y;
	int m;
	int d;
};

struct student
{
	char name[32];
	int num;
	float score;
	struct date birthday;
};

直接分量选择 双目操作符 "?. "

普通访问

组合类型变量.成员变量 ?==》去取组合类型变量内部的成员变量

我们现在来访问上面结构体实例化后的成员变量

struct student s;

s.name;
s.num;
s.score;
s.birthday;
s.birthday.y;
s.birthday.m;
s.birthday.d;

怎么样,这个还是很简单吧,其中要注意的是,在外面访问的结构体中,还存在结构体,我们要先访问当前结构体中的结构体,再访问具体成员变量。就如我们访问 struct date 中的 y ,我们先访问struct student中的struct date birthday,再访问 struct date 中的 y,代码实现就是?s.birthday.y。

成功访问后,我们就可以对成员变量进行赋值等操作了。


指针访问

(*结构体指针).成员变量
?? ??? ?*结构体指针 ==》指向的那个结构体变量
?? ??? ??? ?结构体变量.成员变量

有了上面的例子,这个就很简单啦

struct student *p = malloc(sizeof(struct student));

(*p).name;
(*p).num;
(*p).score;
(*p).birthday;
(*p).birthday.y;
(*p).birthday.m;
(*p).birthday.d;

间接分量选择 双目操作符 "?-> "

用法:结构体指针->成员变量名

依旧是我们上面定义的结构体,我们要如何访问呢

struct student *p = malloc(sizeof(struct student));

p->name;
p->num;
p->score;
p->birthday;
p->birthday.y;
p->birthday.m;
p->birthday.d;

值得注意的是,再本例中,访问birthday中的成员变量时,因为没有对date进行操作,依旧是用直接分量选择,所以打码实现为:p->birthday.m;。


综上,结构体访问成员变量共有三种方式,按本例来,则是

struct student s;
s.成员变量;

struct student *p = malloc(sizeof(struct student));
(*p).成员变量;

struct student *p = malloc(sizeof(struct student));
p->成员变量;

结构体初始化

结构体统一初始化

就是如何将之后定义的实例都有一个初始值,我们还是按上面的例子来

struct date
{
	int y = 2000;
	int m = 1;
	int d = 1;
};

struct student
{
	char name[32] = 张三;
	int num = 20000101;
	float score = 0;
	struct date birthday;
};

在定义结构体时,给结构体中的成员变量赋值即可。这样之后每个实例化对象都会有这些初始值。

直接初始化

如果我们没有在创建结构体时,就初始化,或者像改变初始化的值,我们就可以直接对结构体实例赋值进行初始化。

按定义时的顺序,依次初始化各成员变量,用逗号分开:

struct student s ={
    "张三",
    20000101,
    0,
    {
        2000,1,1
    },
}

当然,我们也可以不安顺序来定义,那我们就要加上成员变量名:

struct student s = {
    .num = 20000101,
    .name = "张三",
    .birthday = {
        2000,1,1
    },
    .score = 0
}

结构体数组的初始化

按顺序初始化

struct student class[3] = 
{
    //class[0]
	{
		.name = "张三",
        .num = 20000101,
		.score = 0,
		.birthday = {2001,01,01}
							
	},
	//class[1]
	{
		.name = "李四",
        .num = 20000102,
		.score = 0,
		.birthday = {2001,01,02}
	},
	//class[2]
	{
		.name = "王五",
        .num = 20000103,
		.score = 0,
		.birthday = {2001,01,03}
	}			
};

同样的,我们也可以不按顺序初始化 ,医用数组下标来实现,不过这种方式,不同编译器下,情况或者限制不一样

struct student class[3] = 
{
	[1] = {
		.name = "张三",
        .num = 20000101,
		.score = 0,
		.birthday = {2001,01,01}
							
	},

	[0] = {
		.name = "李四",
        .num = 20000102,
		.score = 0,
		.birthday = {2001,01,02}
	},

	[2] = {
		.name = "王五",
        .num = 20000103,
		.score = 0,
		.birthday = {2001,01,03}
	}			
};

实例操作

有了以上的知识储备,我们就来练一练手吧

首先定义一个结构体来描述一个学生的情况(姓名、学号、成绩,出生年、月、日),再定义一个结构体数组来描述我们这个班的同学(3个),并从键盘上输入每一个学生的信息,并输出到终端上。


代码实现

#include<stdio.h>

struct date
{
	int y;
	int m;
	int d;
};

struct student
{
	char name[32];
	int num;
	float score;
	struct date birthday;
};

int main()
{
	struct student CS[3];

	for(int i = 0;i < sizeof(CS) / sizeof(struct student);i++)
	{
		scanf("%d%d%d%s%d%f",&CS[i].birthday.y,&CS[i].birthday.m,&CS[i].birthday.d,CS[i].name,&CS[i].num,&CS[i].score);
	}
	for(int i = 0;i < sizeof(CS) / sizeof(struct student);i++)
	{
		printf("%d  %d\t%d\t%s\t%d\t%f\n",CS[i].birthday.y,CS[i].birthday.m,CS[i].birthday.d,CS[i].name,CS[i].num,CS[i].score);
	}

	return 0;
}

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-08-06 10:25:04  更:2022-08-06 10:29:43 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 12:52:45-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码