Linux(五)

news2025/2/22 1:38:29

Linux(五)

  • 结构体
    • 如何定义一个结构体
    • 如何定义一个结构体变量
    • 结构体变量如何访问成员
    • 如何定义一个指向结构体的指针
  • 动态分配空间 malloc,free
    • 在堆区分配5个存Stu的空间

在这里插入图片描述

#include <stdio.h>
//编写一子函数,对pstr中的值进行输出
/*void output(int * arr,int n);
void output(int arr[],int n); //[]表示你传过来的是个数组,该数组中的每个元素是 int
*/
//参数1: &pstr[0] pstr[0]-->char * &pstr[0]---->char **
//参数2:
//void output(char **pstr,int n);
void output(char *pstr[],int n);
void output(char *pstr[],int n)
{
	int i=0;

	for(i=0;i<n;i++)
	{
		printf("%s ",pstr[i]);
	}
	printf("\n");
}
int main(void)
{
//定义一个长度为5的数组,该数组中的每个元素是char *
	char * pstr[5]={"xian","beijing","shanghai","guangzhou","chongqing"};
	output(pstr,5); //pstr<====>&pstr[0]
	//output(&pstr[0],5); //pstr<====>&pstr[0]
	return 0;
}

在这里插入图片描述

结构体

如何定义一个结构体

struct 结构体名
{
	//该类型的属性:
	成员1;
	成员2;
	成员3;
};
//定义一个学生的数据类型
//学生的属性: 姓名 学号 身高 成绩 等等
2.如何定义一个结构体变量
struct date
{
	int year;
	int month;
	int day;
};
//定义一个结构体数据类型,该结构体体数据类型的名字叫 struct date
struct student
{
	char name[20]; //姓名 字符数组 ----->字符串
	int height; //身高
};
//定义一个结构体数据类型,该结构体数据类型的名字叫struct student

如何定义一个结构体变量

//如何定义一个整型变量
//类型名 变量名;
int i=12;
//如何定义一个结构体变量
//类型名 变量名;
struct student s1={"zhangsan",176};
#include <stdio.h>
//1.定义一个日期的结构体
struct date
{
	int year;
	int month;
	int day;
};
//定义一个日期的结构体 strut date
//1,定义一个结构体数据类型
struct student
{
	char name[20]; //姓名
	int height; //身高
	struct date birDay; //出生日期
};
//定义一个结构体数据类型,该数据类型的名字叫struct student
int main(void)
{
	//1.定义一个结构体变量
	struct student s1;
	return 0;
}

在这里插入图片描述

结构体变量如何访问成员

在这里插入图片描述

//结构体变量访问成员
变量名.成员名

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include <stdio.h>
//定义一个日期的结构体 strut date
//1,定义一个结构体数据类型
struct student
{
	char name[20]; //姓名
	int height; //身高
};
//定义一个结构体数据类型,该数据类型的名字叫struct student
int main(void)
{
	//2.定义一个结构体变量 类型名 变量名
	struct student s1={"zhangsan",176};
	//3.结构体变量访问成员 变量名.成员名
	printf("请输入姓名和身高\n");
	scanf("%s",s1.name);
	scanf("%d",&s1.height);
	printf("s1: name:%s height=%d\n",s1.name,s1.height);
	//4.定义一个结构体变量
	struct student s2;
	s2=s1; //将s1中的值赋值给s2
	printf("s2: name:%s height=%d\n",s2.name,s2.height);
	return 0;
}

如何定义一个指向结构体的指针

在这里插入图片描述

#include <stdio.h>
/*
//1.定义一个结构体数据类型
struct student
{
	char name[20];
	int height;
};
//该数据类型的名字叫struct student
//2.给结构体数据类型取个别名
typedef struct student Stu; // Stu <===>struct student
*/
//1.在定义结构体数据类型的同时给它取别名
typedef struct student
{
	char name[20];
	int height;
}Stu;
//该结构体数据类型的名字叫Stu
int main(void)
{
	//2.定义一个结构体变量并赋值
	//类型名 变量名
	Stu s1={"zhangsan",178};
	printf("name:%s height=%d\n",s1.name,s1.height);
	//定义一个指向int的指针
	int * pi=NULL; //sizeof(pi)=8
	//3.定义一个指向结构体的指针
	Stu * ps=NULL; //sizeof(ps)=8
	ps=&s1; //ps指向s1 s1<===>*ps
	printf("name:%s height=%d\n",(*ps).name,(*ps).height);
	printf("name:%s height=%d\n",ps->name,ps->height);
	return 0;
}

动态分配空间 malloc,free

在这里插入图片描述

#include <stdlib.h>
void *malloc(size_t size);
void free(void *ptr);

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在堆区分配5个存Stu的空间

在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>
//1.定义一个结构体数据类型,并取别名
typedef struct student
{
	char name[20];
	int height;
}Stu;
//2.编写一子函数,对ps指向的空间输入数据
//参数1:空间的首地址 Stu * ps
//参数2:元素的个数 int size
void input(Stu * ps,int size)
{
	int i=0;
	for(i=0;i<size;i++)
	{
		printf("请输入姓名和身高\n");
		scanf("%s%d",ps->name,&ps->height);
		ps++;
	}
}
//3.编写一子函数,对ps和指向的空间输出数据
//参数1:空间的首地址 Stu * ps
//参数2:元素的个数 int size
void output(Stu * ps,int size)
{
	int i=0;
	for(i=0;i<size;i++)
	{
		printf("name:%20sheight:%d\n",ps->name,ps->height);
		ps++;
	}
}
int main(void)
{
	//1.在堆区分配5个存结构体的空间
	Stu * ps=NULL;
	ps=(Stu *)malloc(sizeof(Stu)*5);
	input(ps,5);
	output(ps,5);
	//2.释放
	free(ps);
	ps=NULL;
	return 0;
}
#include <stdio.h>
#include <stdlib.h>
//1.定义一个结构体数据类型,并取别名
typedef struct student
{
	char name[20];
	int height;
}Stu;
void menu(void)
{
	printf("1-----input\n");
	printf("2-----output\n");
	printf("3-----calpMax\n"); //求身高最高的人的首地址
	printf("4-----calpMin\n"); //求身高最低的人的首地址
	printf("5-----swap(pMax,pMin)\n"); //交换两个人的位置
	printf("6-----sortByHeight\n");
	printf("7-----sortByName\n");
	printf("-1----exit\n");
}
//2.编写一子函数,对ps指向的空间输入数据
//参数1:空间的首地址 Stu * ps
//参数2:元素的个数 int size
void input(Stu * ps,int size)
{
	int i=0;
	for(i=0;i<size;i++)
	{
		printf("请输入姓名和身高\n");
		scanf("%s%d",ps->name,&ps->height);
		ps++;
	}
}
//3.编写一子函数,对ps和指向的空间输出数据
//参数1:空间的首地址 Stu * ps
//参数2:元素的个数 int size
void output(Stu * ps,int size)
{
	int i=0;
	for(i=0;i<size;i++)
	{
		printf("name:%-20s height:%d\n",ps->name,ps->height);
		ps++;
	}
}
int main(void)
{
	int op=0;
	//1.在堆区分配5个存结构体的空间
	Stu * ps=NULL;
	ps=(Stu *)malloc(sizeof(Stu)*5);
	while(1)
	{
			menu();
			printf("请输入选项\n");
			scanf("%d",&op);
			if(-1==op) break;
			switch(op)
			{
				case 1:
				input(ps,5);
				break;
				case 2:
				output(ps,5);
				break;
			}
	}
	//2.释放
	free(ps);
	ps=NULL;
	return 0;
}

在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>
//1.定义一个结构体数据类型,并取别名
typedef struct student
{
	char name[20];
	int height;
	//float scores[5];
}Stu;
void menu(void);
void menu(void)
{
	printf("1-----input\n");
	printf("2-----output\n");
	printf("3-----calpMax\n"); //求身高最高的人的首地址
	printf("4-----calpMin\n"); //求身高最低的人的首地址
	printf("5-----swap(pMax,pMin)\n"); //交换两个人的位置
	printf("6-----sortByHeight\n");
	printf("7-----sortByName\n");
	printf("-1----exit\n");
}
//2.编写一子函数,对ps指向的空间输入数据
//参数1:空间的首地址 Stu * ps
//参数2:元素的个数 int size
void input(Stu * ps,int size);
void input(Stu * ps,int size)
{
	int i=0;
	for(i=0;i<size;i++)
	{
		printf("请输入姓名和身高\n");
		scanf("%s%d",ps->name,&ps->height);
		ps++;
	}
}
//3.编写一子函数,对ps和指向的空间输出数据
//参数1:空间的首地址 Stu * ps
//参数2:元素的个数 int size
void output(Stu * ps,int size);
void output(Stu * ps,int size)
{
	int i=0;
	for(i=0;i<size;i++)
	{
		printf("name:%-20s height:%d\n",ps->name,ps->height);
		ps++;
	}
}
//编写一子函数,获得ps指向的空间中身高最高的那个人的首地址
//参数1:空间的首地址 Stu * ps
//参数2:元素的个数 int size
//返回值:身高最高的那个人的首地址 Stu *
Stu * calpMax(Stu *ps,int size);
Stu * calpMax(Stu *ps,int size)
{
	//1.定义一个指针变量,用它来保存最大值的地址
	Stu * pMax=NULL;
	//2.假设第一个为最大
	pMax=ps;
	//3.用pMax->height和后面的每一个height进行比较,循环size-1次
	int i=0;
	for(i=0;i<size-1;i++)
	{
		ps++;
		if(pMax->height<ps->height)
		{
			pMax=ps;
		}
	}
//4.返回pMax;
return pMax;
}
//编写一子函数,获得ps指向的空间中身高最矮的那个人的首地址
//参数1:空间的首地址 Stu * ps
//参数2:元素的个数 int size
//返回值:身高最矮的那个人的首地址 Stu *
Stu * calpMin(Stu *ps,int size);
Stu * calpMin(Stu *ps,int size)
{
	//1.定义一个指针变量,用它来保存最大值的地址
	Stu * pMin=NULL;
	//2.假设第一个为最矮
	pMin=ps;
	//3.用pMax->height和后面的每一个height进行比较,循环size-1次
	int i=0;
	for(i=0;i<size-1;i++)
	{
		ps++;
		if(pMin->height>ps->height)
		{
			pMin=ps;
		}
	}
	//4.返回pMin;
	return pMin;
}
//编写一子函数,交换两个人的位置
//参数1:第一个人的首地址 参数2:第二个人的首地址
//返回值:void
void swap(Stu * pMax,Stu * pMin);
void swap(Stu * pMax,Stu * pMin)
{
	Stu tmp;
	tmp=*pMax;
	*pMax=*pMin;
	*pMin=tmp;
}
//编写一子函数,按照身高进行排序
//参数1:空间的首地址 Stu * ps
//参数2:元素的个数 int size
//返回值:void
void sortByHeight(Stu * ps,int size);
void sortByHeight(Stu * ps,int size)
{
	int i=0;
	int j=0;
	for(i=0;i<size-1;i++)
	{
		for(j=0;j<size-1-i;j++)
		{
		//if(strcmp((ps+j)->name,(ps+j+1)->name)>0)
			if((ps+j)->height > (ps+j+1)->height)
			{
				//交换ps+j ps+j+1 这两个人的位置
				swap(ps+j,ps+j+1);
			}	
		}
	}
	printf("sort over\n");
}
int main(void)
{
	int op=0;
	//1.在堆区分配5个存结构体的空间
	Stu * ps=NULL;
	ps=(Stu *)malloc(sizeof(Stu)*5);
	Stu * pMax=NULL;
	Stu * pMin=NULL;
	while(1)
	{
		menu();
		printf("请输入选项\n");
		scanf("%d",&op);
		if(-1==op) break;
		switch(op)
		{
			case 1:
				input(ps,5);
				break;
			case 2:
				output(ps,5);
				break;
			case 3:
				pMax=calpMax(ps,5);
				printf("身高最高是 %s %d\n",pMax->name,pMax->height);
				break;
			case 4:
				pMin=calpMin(ps,5);
				printf("身高最矮是 %s %d\n",pMin->name,pMin->height);
				break;
			case 5:
				swap(pMax,pMin);
				break;
			case 6:
				sortByHeight(ps,5);
				break;
		}
	}
	//2.释放
	free(ps);
	ps=NULL;
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1700188.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【开源】租房管理系统 JAVA+Vue+SpringBoot+MySQL

目录 一、系统介绍 租客屋主模块 房源信息模块 租客评价模块 房源订单模块 留言板模块 二、系统截图 三、核心代码 一、系统介绍 基于Vue.js和SpringBoot的租房管理系统&#xff0c;分为管理后台和用户网页端&#xff0c;可以给管理员、租客和屋主角色使用&#xff0c…

Layui设置table表格中时间的显示格式

1、问题概述? 【数据库中的时间格式】 【Layui中table表格默认的显示格式】 默认的格式中会显示时间的毫秒单位,但是这个毫秒有时候是不需要的。 总结:这个时候我们就需要定义table表格中的时间显示格式。 2、解决办法? 【解决后时间的显示格式】 【解决办法1:通过字符…

AI图书推荐:ChatGPT解码—人工智能增强生活指南

《ChatGPT解码—人工智能增强生活指南》&#xff08;ChatGPT Decoded. A Beginners Guide to AI-Enhanced Living &#xff09;是一本由 大卫维恩斯&#xff08;David Wiens &#xff09;所著的书籍&#xff0c;旨在帮助读者了解并有效利用GPT-4语言模型这一强大工具来提升日常…

开发依赖与运行依赖

1. 概念 开发依赖&#xff1a;devDependencies 运行依赖&#xff1a;dependencies 2. 理解 &#xff08;1&#xff09;devDependencies 在线上状态不需要使用的依赖&#xff0c;就是开发依赖。为什么 npm 要把它单独分拆出来呢&#xff1f;最终目的是为了减少 node_modul…

ESP32-C6接入巴法云,Arduino方式

ESP32-C6接入巴法云&#xff0c;Arduino方式 第一、ESP32-C6开发环境搭建第一步&#xff1a;安装arduino IDE 软件第二步&#xff1a;安装esp32库第三&#xff1a;arduino 软件设置 第二&#xff1a;简单AP配网程序第一步&#xff1a;程序下载第二步&#xff1a;程序使用第三步…

《德米安:彷徨少年时》

文前 我之所愿无非是尝试依本性而生活&#xff0c; 却缘何如此之难&#xff1f; 强盗 疏于独立思考和自我评判的人只能顺应现成的世俗法则&#xff0c;让生活变轻松。其他人则有自己的戒条&#xff1a;正派人惯常做的事于他可能是禁忌&#xff0c;而他自认合理的或许遭他人唾…

Mac安装pytorch

先下载 Anaconda | The Operating System for AI 网速慢&#xff0c;用中国大陆镜像&#xff1a;NJU Mirror 之前装python3时用的是pip3&#xff0c;这里说一下这pip与conda的区别 Conda和pip都是Python包管理工具&#xff0c;用于安装和管理Python包 包管理范围&#xff1a…

简单的基于信号处理的心电信号ECG特征波分割方法(MATLAB)

正常的心电图中&#xff0c;每个心跳周期内包含三个主要的特征波&#xff1a;&#xff30;波、QRS波和&#xff34;波&#xff0c;如下图所示。心电特征波能够反映心脏的生理状态信息&#xff0c;通过对其形状、幅值和持续时间的分析&#xff0c;可以用来辅助诊断心血管疾病。对…

Java顺序表

Java顺序表 前言一、线性表介绍常见线性表总结图解 二、顺序表概念顺序表的分类顺序表的实现throw具体代码 三、顺序表会出现的问题 前言 推荐一个网站给想要了解或者学习人工智能知识的读者&#xff0c;这个网站里内容讲解通俗易懂且风趣幽默&#xff0c;对我帮助很大。我想与…

深入解析BGP与OSPF:互联网与企业网络中的路由协议对比

BGP&#xff08;Border Gateway Protocol&#xff09;和OSPF&#xff08;Open Shortest Path First&#xff09;是两种不同的路由协议&#xff0c;它们在互联网和企业网络中扮演着重要的角色。下面是它们各自特点的详细内容丰富&#xff1a; BGP&#xff08;Border Gateway Pro…

leecode 226 翻转二叉树、101 对称二叉树、104 二叉树的最大深度

leecode 226 翻转二叉树、101 对称二叉树、104 二叉树的最大深度 leecode 226 翻转二叉树 题目链接 &#xff1a;https://leetcode.cn/problems/invert-binary-tree/description/ 题目 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。…

Neovim 配置全面解析(上)

Neovim 配置全面解析&#xff08;上&#xff09; 原文&#xff1a;Neovim 配置全面解析&#xff08;上&#xff09; - 知乎 (zhihu.com) 环境&#xff1a;Ubuntu 20.04 宿主机&#xff1a;windows &#xff08;windows terminal&#xff09;WSL 2 NVIM&#xff1a;v 0.10.0-de…

自从有了可观测性,传统运维如何进行提升?

在 201x 年&#xff0c;随着容器技术的出现&#xff0c;容器的部署方式逐渐被各大互联网公司采用&#xff0c;相比物理机/虚拟机&#xff0c;容器的好处是环境隔离、轻量、快速。 但是管理容器是一件复杂的事情&#xff0c;后来出现了 Kubernetes&#xff0c;成为了事实上的容…

Python编程的黑暗魔法:模块与包的神秘力量!

哈喽&#xff0c;我是阿佑&#xff0c;今天给大家讲讲模块与包~ 文章目录 1. 引言1.1 模块化编程的意义1.2 Python中模块与包的概念概述 2. 背景介绍2.1 Python模块系统模块的定义与作用Python标准库简介 2.2 包的结构与目的包的定义与目录结构包在项目组织中的重要性 3. 创建与…

网络攻击攻击之-远程命令执行/RCE告警运营分析篇

在各种网络安全产品的告警中,远程命令执行是一种非常常见的告警。本文将从远程命令执行的定义,远程命令执行利用的流量数据包示例,远程命令执行的suricata规则,远程命令执行的告分析警研判,远程命令执行的处置建议等几个方面阐述如何通过IDS/NDR,态势感知等流量平台的远程…

Linux系统编程(三)进程间通信(IPC)

本文目录 一、linux 进程之间的通信种类二、管道1. 管道的概述2. 什么是管道文件&#xff1f;3. 管道的特点4. 管道类型&#xff08;1&#xff09;无名管道&#xff08;pipe&#xff09;&#xff08;2&#xff09;有名(命名)管道&#xff08;fifo&#xff09; 三、信号&#xf…

自定义Linux命令,显示docker镜像、容器信息

1、修改环境变量&#xff08;仅对当前用户有效&#xff09; vim ~/.bashrc2、给命令取别名 alias dpsdocker ps --format "table{{.ID}}\t{{.Names}}\t{{.Status}}\t{{.Ports}}" alias disdocker images#保存并退出 :wq3、让配置重新生效 source ~/.bashrc4、测试&…

前端设计模式学习记录

设计模式介绍 概念 设计模式是我们在解决问题的时候针对特定的问题给出的简洁而优化的处理方案在JS设计模式中&#xff0c;最核心的思想&#xff1a;封装变化将变与不变分离&#xff0c;确保变化的部分灵活、不变的部分稳定 注意&#xff1a;下面文章介绍的设计模式&#xff…

shell脚本实战--批量修改文件名

字符串截取 先来了解一下shell字符串相关操作的变量 # 从开头删除匹配最短 ## 从开头删除匹配最长 % 从结尾削除匹配最短 %% 从结尾删除匹配最长#指定字符内容截取 a*c 匹配开头为a&#xff0c;中间任意个字符&#xff0c;结尾为c的字符串 a*C 匹配…

​​​【收录 Hello 算法】10.4 哈希优化策略

目录 10.4 哈希优化策略 10.4.1 线性查找&#xff1a;以时间换空间 10.4.2 哈希查找&#xff1a;以空间换时间 10.4 哈希优化策略 在算法题中&#xff0c;我们常通过将线性查找替换为哈希查找来降低算法的时间复杂度。我们借助一个算法题来加深理解。 Question 给…