练习(含指针数组与数组指针的学习)

数组指针是一个指向数组的指针,而指针数组是一个存储指针的数组
‌数组指针‌是一个指针,指向一个数组的首地址,它用于指向整个数组,而不是数组中的某个元素。例如,int (*p)表示 p 是一个指向包含 5 个整数的数组的指针。‌‌数组指针‌声明时使用括号明确优先级,如 int (*p)[10],其中()的优先级高于[ ],因此p首先被定义为一个指针,然后指向一个大小为10的数组。
指针数组‌是一个数组,其元素都是指针,它用于存储多个指针,每个指针可以指向不同的数据。例如,int *p 表示 p 是一个包含 5 个整型指针的数组。‌‌指针数组‌声明时 [ ] 优先级高于 *,如 int *p[10],表示 p 首先被定义为一个数组,然后数组的元素是指针类型。
内存占有
‌数组指针‌:在 32 位系统中,数组指针占 4 字节,指向的数组大小由数组本身决定。
‌指针数组‌:数组的大小由元素数量和指针大小决定。例如,int *p 在 32 位系统中占 20 字节(5 个指针,每个 4 字节)。
使用场景‌
‌数组指针‌:常用于传递数组的首地址,避免复制整个数组,适合处理二维数组的行指针。
‌指针数组‌:用于存储多个指针,适合动态分配内存或管理多个对象的指针。‌
操作方式‌
‌数组指针‌:通过解引用访问数组元素,如 *(*p + i) 访问第 i 个元素。
‌指针数组‌:通过数组索引访问指针,如 *p[i] 访问第 i 个指针指向的值。
优先级与结合性‌
‌数组指针‌:() 优先级高于 [ ],因此 int (*p) 明确表示 p 是指针。
‌指针数组‌:[ ] 优先级高于 *,因此 int *p 明确表示 p 是数组。

---------------------------------------------------------------------------------------------------------------------------------

一、

在以下的代码中,struct student - 是一个类型,而Stu - 是这个类型所创建的变量

struct student
{int num;char name[32];float score;
}Stu;
//Stu - 是结构体变量int main()
{return 0;
}

而如果在此类型的前面加上 typedef ,就可以创建新的类型,例如以下的代码,Stu是新的类型,可以用这个类型创建新的变量s1

typedef struct student
{int num;char name[32];float score;
}Stu;
//Stu - 是类型int main()
{Stu s1;return 0;
}

二、喝汽水

一瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以喝多少汽水

int main()
{int money = 0;int total = 0;int empty = 0;scanf("%d",&money);//20total += money;//买empty = money;//置换while(empty >= 2){total += empty / 2;empty = empty / 2 + empty % 2;}printf("%d\n",total);return 0;
}

还有更高效的方式:

int main()
{int money = 0;int total = 0;scanf("%d",&money);//20if(money > 0)total = 2 * money - 1;printf("%d\n",total);return 0;
}

三、上三角矩阵判断

上三角矩阵即主对角线以下的元素都为0的矩阵,主对角线为从矩阵的左上角至右下角的连线

输入:第一行包含一个整数n,表示一个方阵包含n行n列,用空格分隔。从2到n+1行,每行输入n个整数,用空格分隔,共输入n*n个数。
输出:一行,如果输入方阵是上三角矩阵输出"YES"并换行,否则输出“NO"并换行。

示例:

3
1 2 3
0 4 5
0 0 6
YES2
2 3
4 5
NO
int main()
{int n = 0;scanf("%d",&n);//int arr[n][n];//C99 变长数组int arr[10][10];//输入int i = 0;for(i = 0;i < n; i++){int j = 0;for(j = 0;j < n; j++){scanf("%d",&arr[i][j]);}}//判断return 0;
}

接下来的部分是如何判断:

在主对角线以下的部分,我们可以发现 i > j,主对角线上 i = j,主对角线以上的部分,i < j

那么我们就可以这样写:

int main()
{int n = 0;scanf("%d",&n);//int arr[n][n];//C99 变长数组int arr[10][10];//输入int i = 0;for(i = 0;i < n; i++){int j = 0;for(j = 0;j < n; j++){scanf("%d",&arr[i][j]);}}//判断int flag = 1;//默认是上三角矩阵for(i = 0;i < n; i++){int j = 0;for(j =0;j < i; j++){if(arr[i][j] != 0){flag = 0;goto end;}}}   
end:if(flag == 1)printf("YES\n");elseprintf("NO\n");return 0;
}

四、矩阵相等判断

有两个n行m列的矩阵,想知道两个矩阵是否相等。(当两个矩阵对应数组元素都相等时两个矩阵相等)。

输入:两个n行m列的矩阵

输出:如果两个矩阵相等输出"Yes"并换行,否则输出"No“并换行。

int main()
{int n = 0;int m = 0;scanf("%d %d",&n,&m);int arr1[n][m];int arr2[n][m];//C99 变成数组//输入数据//第一个数组int i = 0;int j = 0;for(i = 0;i < n; i++){for(j = 0;j < m; j++){scanf("%d",&arr1[i][j]);}}//第二个数组for(i = 0;i < n; i++){for(j = 0;j < m; j++){scanf("%d",&arr2[i][j]);}}//比较int flag = 1;//默认2个矩阵相等for(i = 0;i < n; i++){for(j = 0;j < m; j++){if(arr1[i][j] != arr2[i][j]){flag = 0;goto end;}}}
end:if(flag == 1)printf("YES\n");elseprintf("NO\n");return 0;
}

另一种方法:第二个数组每输入一个就与第一个数组判断

int main()
{int n = 0;int m = 0;scanf("%d %d",&n,&m);//int arr1[n][m];//int arr2[n][m];//C99 变成数组int arr1[100][100];int arr2[100][100];//输入数据//第一个数组int i = 0;int j = 0;for(i = 0;i < n; i++){for(j = 0;j < m; j++){scanf("%d",&arr1[i][j]);}}//第二个数组int flag = 1;//默认2个矩阵相等for(i = 0;i < n; i++){for(j = 0;j < m; j++){scanf("%d",&arr2[i][j]);if(arr1[i][j] != arr2[i][j]){flag = 0;goto end;}}}
end:if(flag == 1)printf("YES\n");elseprintf("NO\n");return 0;
}

五、调整奇数偶数顺序

输入一个数组,实现一个函数,来调整该数组中数字的顺序使得数组中所有的奇数位于偶数的前面,即位于数组的前半部分

void move(int arr[],int sz)
{int left = 0;int right = sz - 1;while(left < right){//找偶数的过程while(left < right && arr[left] % 2 ==1){left++;}//找奇数while(left < right && arr[right] % 2 == 0){right--;}if(left < right){int tmp = 0;arr[left] = arr[right];arr[right] = tmp;left++;right--;}}
}
int main()
{int arr[10] = {0};int sz = sizeof(arr) / sizeof(arr[0]);//输入int i = 0;for(i = 0;i < sz, i++){scanf("%d",&arr[i]);}//调整move(arr,sz);//输出for(i = 0;i < sz; i++){printf("%d ",arr[i]);}return 0;
}

六、有序序列合并

输入两个升序排序的序列,将两个序列合并为一个有序序列并输出

输入:两个整数n、m,表示升序序列中数据的个数

输出:输出长度为n+m的升序序列,即长度为n的升序序列和长度为m的升序序列中的元素重新进行升序序列排列并合并

示例:

输入:5 61 3 7 9 222 8 10 17 33 44
输出:1 2 3 7 8 9 10 17 22 33 44

int main()
{int n = 0;int m = 0;//输入scanf("%d %d",&n,&m);int arr1[n];//1000int arr2[m];//1000int arr3[n+m];//2000//arr1的输入int i = 0;for(i = 0;i < n; i++){scanf("%d",&arr1[i]);}//arr2的输入for(i = 0;i < m; i++){scanf("%d",&arr2[i]);}i = 0;int j = 0;int k = 0;while(i < n && j < m){if(arr1[i] < arr2[j]){arr3[k] = arr1[i];i++;k++;}else  //如果是大于等于走这条代码{arr3[k] = arr2[j];j++;k++;}}if(i == n)//数组arr1中元素比arr2少{//把arr2中剩余的元素放在arr3中while(j < m){arr3[k] = arr2[j];j++;k++;}}else  //比arr2多(j == m){//把arr1中剩余的元素放在arr3中while(i < n){arr3[k] = arr1[i];i++;k++;}}//输出for(k = 0;k < n+m; k++){printf("%d ",arr3[k]);}return 0;
}

或者还可以这样(投巧):

int main()
{int n = 0;int m = 0;//输入scanf("%d %d",&n,&m);int arr1[n];//1000int arr2[m];//1000int arr3[n+m];//2000//arr1的输入int i = 0;for(i = 0;i < n; i++){scanf("%d",&arr1[i]);}//arr2的输入for(i = 0;i < m; i++){scanf("%d",&arr2[i]);}i = 0;int j = 0;int k = 0;while(i < n && j < m){if(arr1[i] < arr2[j]){printf("%d ",arr1[i]);i++;}else  {printf("%d ",arr2[j]);j++;}}if(i == n){//把arr2中剩余的元素放在arr3中while(j < m){printf("%d ",arr2[j]);j++;}}else  {//把arr1中剩余的元素放在arr3中while(i < n){printf("%d ",arr1[i]);i++;}}return 0;
}

七、有序序列判断

输入一个整数序列,判断是否是有序序列,有序,指序列中的整数从小到大排序或者从大到小排序(相同元素也视为有序)
输入:第一行输入一个整数N;第二行输入N个整数
输出:如果是有序序列输出sorted,否则输出unsorted

示例1:

输入:51 6 9 22 30
输出:sorted

示例2:

输入:53 4 7 2 10
输出:unsorted

示例3:

输入:51 1 1 1 1
输出:sorted

int main()
{int n = 0;scanf("%d",&n);int arr[n];int i = 0;for(i = 0;i < n; i++){scanf("%d",&arr[i]);}int flag1 = 0;//标记升序int flag2 = 0;//标记降序for(i = 1;i < n; i++){if(arr[i-1] < arr[i]){flag1 = 1;}else{flag2 = 1;}}if(flag1 + flag2 == 2){printf("unsorted\n");}else{printf("sorted\n");}retrun 0;
}

或者:

int main()
{int n = 0;scanf("%d",&n);int arr[n];int i = 0;int flag1 = 0;//标记升序int flag2 = 0;//标记降序for(i = 0;i < n; i++){scanf("%d",&arr[i]);if(i > 0){if(arr[i-1] < arr[i]){flag1 = 1;}else{flag2 = 1;}}}if(flag1 + flag2 == 2){printf("unsorted\n");}else{printf("sorted\n");}retrun 0;
}

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

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

相关文章

NSS#Round30 Web

小桃的PHP挑战 <?php include jeer.php; highlight_file(__FILE__); error_reporting(0); $A 0; $B 0; $C 0;//第一关 if (isset($_GET[one])){$str $_GET[str] ?? 0;$add substr($str, 0, 1); $add;if (strlen($add) > 1 ) {$A 1;} else {echo $one; } } else…

MCP基础学习二:MCP服务搭建与配置

文章目录 MCP服务搭建与配置一&#xff0c;学习目标&#xff1a;二&#xff0c;学习内容&#xff1a;1. 如何搭建MCP服务端服务端初始化与配置MCP服务架构与数据流交互图核心实现注册服务功能服务器启动与API暴露 2. 本地应用与MCP服务的集成客户端SDK实现客户端应用实现功能演…

ZKmall开源商城服务端验证:Jakarta Validation 详解

ZKmall开源商城基于Spring Boot 3构建&#xff0c;其服务端数据验证采用Jakarta Validation API​&#xff08;原JSR 380规范&#xff09;&#xff0c;通过声明式注解与自定义扩展机制实现高效、灵活的数据校验体系。以下从技术实现、核心能力、场景优化三个维度展开解析&#…

使用Docker创建postgres

准备工作&#xff1a; 1. 检查网络 检查网络连接&#xff1a;确保你的服务器网络连接正常&#xff0c;可尝试使用 ping 命令测试与 Docker Hub 服务器&#xff08;如 ping registry-1.docker.io&#xff09;的连通性。 ping registry-1.docker.io 检查防火墙&#xff1a;确…

32 python json

在办公室忙碌的日常里,我们经常需要和各种数据打交道。想象一下,你是办公室里负责处理员工信息、项目数据的 “数据小管家”,每天都要面对大量格式各异的数据。 这时候,JSON(JavaScript Object Notation)就像是你得力的数据助手,它是一种轻量级的数据交换格式,简单又高…

Java 实现 List<String> 与 String 互转

在 Java 开发过程中&#xff0c;有时需要将 List<String> 转为 String 存储&#xff0c;后续使用时再还原回去。此时就需要 Java 实现 List<String> 与 String 互转。以下是一种互转方式。 采用如下工具包实现。 <dependency><groupId>org.apache.com…

NO.87十六届蓝桥杯备战|动态规划-完全背包|疯狂的采药|Buying Hay|纪念品(C++)

完全背包 先解决第⼀问 状态表⽰&#xff1a; dp[i][j]表⽰&#xff1a;从前i个物品中挑选&#xff0c;总体积不超过j&#xff0c;所有的选法中&#xff0c;能挑选出来的最⼤价 值。&#xff08;这⾥是和01背包⼀样哒&#xff09; 那我们的最终结果就是dp[n][V] 。状态转移⽅…

第十三天 - Ansible基础架构 - YAML语法与Playbook - 练习:批量配置部署

Ansible自动化运维实战&#xff1a;从入门到批量配置部署 前言&#xff1a;自动化运维的时代选择 在服务器规模呈指数级增长的今天&#xff0c;手工操作已无法满足运维需求。本文将手把手教你使用Ansible这个明星级自动化工具&#xff0c;通过YAML语法和Playbook实现批量配置…

Redis的过期和内存淘汰策略

文章目录 惰性删除定期删除内存满了&#xff0c;数据淘汰策略 Redis 提供了两种删除策略&#xff1a; 惰性删除 、定期删除 惰性删除 定期删除 两种清除模式: 内存满了&#xff0c;数据淘汰策略 Redis 提供了八种数据淘汰策略&#xff1a; 1. 默认是不淘汰任何的 key&#x…

用PHPExcel 封装的导出方法,支持导出无限列

用PHPExcel 封装的导出方法&#xff0c;支持导出无限列 避免PHPExcel_Exception Invalid cell coordinate [1 异常错误 /*** EXCEL导出* param [string] $file_name 保存的文件名及表格工作区名&#xff0c;不加excel后缀名* param [array] $fields 二维数组* param [array] $…

WHAT - React 元素接收的 ref 详解

目录 1. ref 的基本概念2. 如何使用 ref2.1 基本用法2.2 类组件使用 createRef 3. forwardRef 转发 ref4. ref 的应用场景5. ref 和函数组件总结 在 React 中&#xff0c;ref&#xff08;引用&#xff09;用于访问 DOM 元素或类组件实例。它允许我们直接与元素进行交互&#xf…

【QT】QT的消息盒子和对话框(自定义对话框)

QT的消息盒子和对话框&#xff08;自定义对话框&#xff09; 一、消息盒子QMessageBox1、弹出警告盒子示例代码&#xff1a;现象&#xff1a; 2、致命错误盒子示例代码&#xff1a;现象&#xff1a; 3、帮助盒子示例代码&#xff1a;现象&#xff1a; 4、示例代码&#xff1a; …

依靠视频设备轨迹回放平台EasyCVR构建视频监控,为幼教连锁园区安全护航

一、项目背景 幼教行业连锁化发展态势越发明显。在此趋势下&#xff0c;幼儿园管理者对于深入了解园内日常教学与生活情况的需求愈发紧迫&#xff0c;将这些数据作为提升管理水平、优化教育服务的重要依据。同时&#xff0c;安装监控系统不仅有效缓解家长对孩子在校安全与生活…

Stable Diffusion+Pyqt5: 实现图像生成与管理界面(带保存 + 历史记录 + 删除功能)——我的实验记录(结尾附系统效果图)

目录 &#x1f9e0; 前言 &#x1f9fe; 我的需求 &#x1f527; 实现过程&#xff08;按功能一步步来&#xff09; &#x1f6b6;‍♂️ Step 1&#xff1a;基本图像生成界面 &#x1f5c3;️ Step 2&#xff1a;保存图片并显示历史记录 &#x1f4cf; Step 3&#xff1a…

量子计算未来的潜力和挑战

据麦肯锡预测&#xff0c;到 2035 年或 2040 年&#xff0c;量子计算市场规模可能增长至约 800 亿美元。目前&#xff0c;许多量子比特技术正竞相成为首台通用、无差错量子计算机的基础&#xff0c;但仍面临诸多挑战。 我们将探讨量子计算的未来前景、潜力&#xff0c;以及它对…

ArcGIS 给大面内小面字段赋值

文章目录 引言:地理数据处理中的自动化赋值为何重要?实现思路模型实现关键点效果实现步骤1、准备数据2、执行3、完成4、效果引言:地理数据处理中的自动化赋值为何重要? 在地理信息系统(GIS)的日常工作中,空间数据的属性字段赋值是高频且关键的操作,例如在土地利用规划…

如何打通虚拟化-容器环境并保障流量安全?SmartX VCCI 方案升级!

为了提升资源利用率、交付效率和业务灵活性&#xff0c;不少企业用户都在推进从传统架构向云原生架构的演进&#xff0c;并采用虚拟机与容器共存的混合模式支持多种业务系统。由于两个环境在业务交互层面形成高度耦合&#xff0c;企业需要具备简单、高效方案&#xff0c;实现虚…

stable diffusion 量化加速点

文章目录 一、导出为dynamic shape1)函数讲解(函数导出、输出检查)2)代码展示二、导出为static shape1)函数讲解(略)2)代码展示三、序列化为FP32测速1)测速2)代码四、序列化为FP16测速1)测速2)代码同上五、发现并解决解决CLIP FP16溢出,并测速1)如何找到溢出的算子…

7-openwrt-one通过web页面配置访客网络、无线中继等功能

前几个章节一直在介绍编译、分区之类的,都还没正常开始使用这个路由器的wifi。默认wifi是没有启动的,前面还是通过手动修改uci配置启动的,这个章节介绍下官方web页面的使用。特别是访客网络、无线中继 1、开启wifi,配置wifi基本信息 我们使用有线连接路由器,通过192.168.…

AcWing 6099. 座位

原题目链接 问题描述 有 n 头奶牛&#xff08;n ≥ 5&#xff09;&#xff0c;编号为 1 ∼ n&#xff0c;按照某种顺序围着一张圆桌坐成一圈。 奶牛之间存在如下的朋友关系&#xff1a; 如果两头奶牛相邻&#xff0c;则它们是朋友&#xff1b;如果两头奶牛之间只隔着一头奶…