Linux学习--C语言(指针4、结构体)

1.二维数组的传参

int a[2][3] = {1, 2, 3, 4, 5, 6};fun(a,2);
int fun(int (*p)[3], int len);

 2.指针数组的传参

char *pastr[5] = {NULL};int fun(char **pstr,int len);

例子:

#include <stdio.h>
#include <string.h>int InputArray(char (*p)[32], int len)
{int i = 0;for(i = 0; i < len; i++){gets(p[i]);}return 0;
}int SortArray(char **ppstr, int len)
{int i = 0;int j = 0;char *ptmp = NULL;for(j = 0; j < len-1; j++){for(i = 0; i < len-1-j; i++){if(strcmp(ppstr[i], ppstr[i+1]) > 0){ptmp = ppstr[i];ppstr[i] = ppstr[i+1];ppstr[i+1] = ptmp;}}}return 0;
}int OutputArray1(char **ppstr, int len)
{int i = 0;for(i = 0; i < len; i++){printf("%s\n",ppstr[i]);}return 0;
}int OutputArray2(char (*p)[32], int len)
{int i = 0;for(i = 0; i < len; i++){printf("%s\n",p[i]);}return 0;
}
int main(void)
{char str[5][32] = {0};char *pstr[5] = {str[0], str[1], str[2], str[3], str[4]};InputArray(str,5);SortArray(pstr,5);OutputArray1(pstr,5);OutputArray2(str,5);return 0;
}

3.void *指针

  •  void *指针主要用来保存内存地址
  • void *转换为char *、 int *、 double *类型时,不需要类型转换,直接赋值就行
  • char *、 int *、 double *转换转换为void *类型时,需要强制类型转换
  • void *多用于函数参数和返回值,统一参数和返回值类型
void *p;
char *a;
int *b;
double *c;a = p;
p = (void *)a;

4.构造数据类型

4.1 结构体

1.类型定义:

struct 结构体名 {数据类型1 成员变量1;数据类型2 成员变量2;数据类型3 成员变量3;...
};struct date{int year;int mon;int day;
};struct student{char name[32];char sex;int age;int score;
};

2.结构体变量定义

存储类型 数据类型 变量名;

3.结构体元素初始化

1.全部初始化

struct student stu = {"zhangsan", 'm', 18, 90};

2.局部初始化

struct student stu = {.name = {"zhangsan"},.score = 90,
};

4.结构体成员的访问

.  :结构体变量类型访问成员变量  .
-> :结构体指针类型访问成员变量 ->结构体访问成员变量最终的类型由成员类型变量决定
#include <stdio.h>struct date{int year;int mon;int day;
};struct time{int hour;int min;int sec;
};struct datetime{struct date d;struct time t;
};struct student{char name[32];char m;int age;int score;
};int main(void)
{struct datetime dt = {{2025, 7, 29},{15, 11, 20},};struct datetime dt2 = {.d = {2025, 6, 29},.t = {11 , 11},};struct student stu1 = {"zhangsan", 'm', 12, 98};struct student stu2 = {"lisi", 'm', 11, 85};struct student *pstu2 = NULL;pstu2 = &stu2;struct datetime *pdt = NULL;pdt = &dt;printf("%04d.%02d.%02d\n", dt.d.year, dt.d.mon, dt.d.day);printf("%02d:%02d:%02d\n", dt.t.hour, dt.t.min, dt.t.sec);printf("%04d.%02d.%02d %02d:%02d:%02d\n",pdt->d.year, pdt->d.mon, pdt->d.day, pdt->t.hour, pdt->t.min, pdt->t.sec);printf("姓名:%s\n", stu1.name);printf("性别:%c\n", stu1.m);printf("年龄:%d\n", stu1.age);printf("分数:%d\n", stu1.score);printf("=================================\n");printf("姓名:%s\n", pstu2->name);printf("性别:%c\n", pstu2->m);printf("年龄:%d\n", pstu2->age);printf("分数:%d\n", pstu2->score);return 0;
}

5.结构体的存储

  • 结构体成员必须存放在内存地址为自身类型长度整数倍的内存单元中
  • 结构体大小必须为自身最大类型长度的整数倍
struct student{char name[32];char sex;int age;int score;
};  //44个字节

6.结构体的传参

传地址更好,因为实参将8字节拷贝给形参,避免大结构体大空间的拷贝

  • 传值
void fun(struct student tmp);
  • 传地址
void fun(struct student *ptmp);

作业

1.定义结构体包含年月日信息,封装一个函数从终端接收年月日,封装一个函数判断年份是否为闰年,封装一个函数获得该天为该年第几天,封装一个函数获得剩余天数

2.从终端接收一个字符串,完成单词倒置

"how are you" -> "uoy era woh" -> "you era woh" -> "you are woh" -> "you are how"

#include <stdio.h>struct date{int year;int mon;int day;
};void InputDate(struct date *pret)
{scanf("%d%d%d",&pret->year, &pret->mon, &pret->day);return;
}int IsLeepyear(int year)
{if((year % 4 == 0 && year % 100 !=0) || (year & 400 == 0)){return 1;}else{return 0;}
}int WhatDay(struct date ret)
{int sum = 0;switch(ret.mon){case 1:sum = 0;break;case 2:sum = 31;break;case 3:sum = 59;break;case 4:sum = 90;break;case 5:sum = 120;break;case 6:sum = 151;break;case 7:sum = 181;break;case 8:sum = 212;break;case 9:sum = 243;break;case 10:sum = 273;break;case 11:sum = 304;break;case 12:sum = 334;break;}if(IsLeepyear(ret.year) && ret.mon > 2){return sum + ret.day + 1;}else{return sum + ret.day;}
}int ReDay(struct date ret)
{if(IsLeepyear(ret.year)){return 366-WhatDay(ret);}else{return 365-WhatDay(ret);}
}int main(void)
{struct date d;InputDate(&d);IsLeepyear(d.year) ? printf("%d是闰年\n",d.year) : printf("%d不是闰年\n",d.year);printf("是该年第%d天\n",WhatDay(d));printf("剩余天数:%d\n",ReDay(d));return 0;
}
#include <stdio.h>void InputArray(char *pstr)
{gets(pstr);return;
}void SortArray(char *pstr)
{char tmp = 0;char *phead = pstr;char *ptail = pstr;char *ptmp = NULL;while(*ptail != '\0'){		ptail++;}ptail--;while(phead < ptail){tmp = *phead;*phead = *ptail;*ptail = tmp;phead++;ptail--;}printf("%s\n",pstr);phead = ptail = pstr;while(1){while(*ptail != ' '){if(*ptail == '\0'){break;}ptail++;}ptmp = ptail;ptail -= 1;while(phead < ptail){tmp = *phead;*phead = *ptail;*ptail = tmp;phead++;ptail--;}printf("%s\n",pstr);if(*ptmp == '\0'){break;}ptail = phead = ptmp+1;}return;
}int main(void)
{char a[100] = {0};char *p = a;InputArray(p);SortArray(p);return 0;
}

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

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

相关文章

【STM32】FreeRTOS 消息队列(五)

在 FreeRTOS 中&#xff0c;任务消息队列&#xff08;Message Queue&#xff09; 是一种非常关键的通信机制&#xff0c;用于在任务之间 传递数据、同步事件。 它是实现任务 解耦、异步通信 的核心工具之一&#xff0c;FreeRTOS 的消息队列是任务之间通信的桥梁。 简单点说&am…

【笔记】加速 uv 安装:系统环境变量配置国内镜像源

使用 Conda 工具链创建 UV 本地虚拟环境全记录——基于《Python 多版本与开发环境治理架构设计》-CSDN博客 命令行创建 UV 环境及本地化实战演示—— 基于《Python 多版本与开发环境治理架构设计》的最佳实践-CSDN博客 加速 uv 包安装&#xff1a;Windows 系统环境变量配置国内…

Three.js 渲染优化处理

基于项目经验和最佳实践&#xff0c;以下是渲染优化的具体处理方法&#xff1a; 1. 几何体与材质优化 使用 BufferGeometry // 推荐&#xff1a;使用 BufferGeometry 替代 Geometry const geometry new THREE.BufferGeometry();合并几何体 // 将多个几何体合并为一个以减少绘制…

Kafka——Kafka控制器

引言在Kafka集群中&#xff0c;有一个组件堪称"隐形的指挥官"——它默默协调着Broker的加入与退出&#xff0c;管理着主题的创建与删除&#xff0c;掌控着分区领导者的选举&#xff0c;它就是控制器&#xff08;Controller&#xff09;。想象一个拥有100台Broker的大…

编程与数学 03-002 计算机网络 11_域名系统(DNS)

编程与数学 03-002 计算机网络 11_域名系统&#xff08;DNS&#xff09;一、DNS的作用与功能&#xff08;一&#xff09;域名与IP地址的映射关系&#xff08;二&#xff09;DNS的层次结构二、DNS查询过程&#xff08;一&#xff09;递归查询与迭代查询&#xff08;二&#xff0…

影翎Antigravity将发布全球首款全景无人机,8月开启公测招募

7月28日&#xff0c;消费级无人机品牌「影翎Antigravity」及品牌标识官宣亮相&#xff0c;计划推出全新品类——全球首款「全景无人机」。这一消息引发行业震动&#xff0c;消费级航拍无人机市场或将迎来颠覆性飞行体验。影翎Antigravity官方介绍&#xff0c;引力不仅是束缚双脚…

SpringBoot集成Quzrtz实现定时任务

一 定时任务介绍 自律是很多人都想拥有的一种能力&#xff0c;或者说素质&#xff0c;但是理想往往很美好&#xff0c;现实却是无比残酷的。在现实生活中&#xff0c;我们很难做到自律&#xff0c;或者说做到持续自律。例如&#xff0c;我们经常会做各种学习计划、储蓄计划或减…

Java中的异常判断以及文件中的常用方法及功能

目录 异常 作用 异常的处理方式 JVM&#xff08;虚拟机&#xff09;默认的处理方式 自己处理&#xff08;捕获异常&#xff09; 抛出异常&#xff08;也就是交给调用者处理&#xff09; 自定义异常 file File中常见成员方法 判断和获取 创建和删除 获取并遍历 异常…

【C++算法】74.优先级队列_最后一块石头的重量

文章目录题目链接&#xff1a;题目描述&#xff1a;解法C 算法代码&#xff1a;题目链接&#xff1a; 1046. 最后一块石头的重量 题目描述&#xff1a; 解法 每次取出最重的两块石头进行碰撞&#xff0c;将剩余的石头重新放入堆中。 C 算法代码&#xff1a; class Solution …

中兴云电脑W101D2-晶晨S905L3A-2G+8G-安卓9-线刷固件包

中兴云电脑W101D2-晶晨S905L3A-2G8G-WIFI-蓝牙5.0-3个USB2.0-线刷包线刷方法&#xff1a;1、准备好一根双公头USB线刷刷机线&#xff0c;长度30-50CM长度最佳&#xff0c;同时准备一台电脑&#xff1b;2、电脑上安装好刷机工具Amlogic USB Burning Tool 软件 →打开软件 →文件…

Android OkHttp 底层原理和实战完全教程(责任链模式详解)

目录 1. OkHttp 入门:从一个请求开始 1.1 基本 GET 请求:三步走 1.2 同步 vs 异步:选择你的风格 1.3 为什么选 OkHttp? 2. 配置 OkHttpClient:打造你的专属网络引擎 2.1 超时设置:别让请求卡死 2.2 添加拦截器:窥探请求全过程 2.3 缓存:让请求更快更省流量 3. …

【RK3588部署yolo】算法篇

简历描述收集并制作军事伪装目标数据集&#xff0c;包含真实与伪装各种类型军事目标共计60余类。其中&#xff0c;包含最新战场充气伪装军事装备30余类&#xff0c;并为每一张图片制作了详细的标注。针对军事伪装目标的特点&#xff0c;在YOLOv8的Backbone与Neck部分分别加…

【Spring Boot 快速入门】一、入门

目录Spring Boot 简介Web 入门Spring Boot 快速入门HTTP 协议概述请求协议响应协议解析协议TomcatSpring Boot 简介 Spring Boot 是由 Pivotal 团队&#xff08;后被 VMware 收购&#xff09;开发的基于 Spring 框架的开源项目&#xff0c;于 2014 年首次发布。其核心目标是简…

如何调整服务器的内核参数?-哈尔滨云前沿

调整服务器内核参数是一项较为专业的操作&#xff0c;不同的操作系统调整方式略有不同&#xff0c;以下以常见的 Linux 系统为例&#xff0c;介绍一些调整服务器内核参数的一般步骤和常用参数&#xff1a;一般步骤 备份当前配置&#xff1a;在修改内核参数之前&#xff0c;先备…

C++基础:模拟实现queue和stack。底层:适配器

引言模拟实现queue和stack&#xff0c;理解适配器&#xff0c;实现起来非常简单。一、适配器 适配器是一种能让原本不兼容的接口协同工作的设计模式或者组件。它的主要作用是对一个类的接口进行转换&#xff0c;使其符合另一个类的期望接口&#xff0c;进而实现适配和复用。&am…

OI 杂题

OI 杂题字符串括号匹配例 1&#xff1a;与之前的类似&#xff0c;就是讲一点技巧&#xff0c;但是比较乱&#xff0c;凑合着看吧。 字符串 括号匹配 几何意义&#xff1a;考虑令 ( 为 111 变换&#xff0c;令 ) 为 −1-1−1 变换&#xff0c;然后对这个 1/−11/-11/−1 构成…

【论文阅读】Safety Alignment Should Be Made More Than Just a Few Tokens Deep

Safety Alignment Should Be Made More Than Just a Few Tokens Deep原文摘要问题提出现状与漏洞&#xff1a;当前LLMs的安全对齐机制容易被攻破&#xff0c;即使是简单的攻击&#xff08;如对抗性后缀攻击&#xff09;或良性的微调也可能导致模型越狱。核心论点&#xff1a; 作…

Generative AI in Game Development

如有侵权或其他问题&#xff0c;欢迎留言联系更正或删除。 出处&#xff1a;CHI 20241. 一段话总结本研究通过对来自 Reddit 和 Facebook 群组的 3,091 条独立游戏开发者的在线帖子和评论进行定性分析&#xff0c;探讨了他们对生成式 AI在游戏开发中多方面作用的认知与设想。研…

【C++算法】72.队列+宽搜_二叉树的最大宽度

文章目录题目链接&#xff1a;题目描述&#xff1a;解法C 算法代码&#xff1a;题目链接&#xff1a; 662. 二叉树最大宽度 题目描述&#xff1a; 解法 这里的宽度指的是一层的最右边的非空节点到一层的最左边的非空节点&#xff0c;一共的节点数。 解法一&#xff1a;硬来&am…

什么是3DVR?VR技术有哪些应用场景?

VR与3D技术解析及应用在高科技领域&#xff0c;VR和3D是两个常被提及的名词。那么&#xff0c;这两者之间究竟存在着怎样的区别与联系呢&#xff1f;简而来说&#xff0c;VR技术是3D技术的一种高级延展和深化应用。3D技术&#xff0c;即将二维设计图转化为立体、逼真的视觉效果…