C语言基础(六)
一维数组:
C语言中的数组是一种基本的数据结构,用于在计算机内存中连续存储相同类型的数据。
数组中的每个元素可以通过索引(或下标)来访问,索引通常是从0开始的。
数组的大小在声明时确定,并且之后不能改变(除非使用动态内存分配技术,如指针和malloc/free等)。如果初始化时省略数组的大小,编译器会自动根据初始化列表中元素的数量确定数组的大小。
数组索引越界是C语言中常见的错误。如果尝试访问数组边界之外的元素,程序会崩溃或产生不可预测的行为。
数组的大小在编译时确定,且固定不变。如果需要动态改变数组大小,应考虑使用指针和动态内存分配。
数组名在表达式中通常被当作指向数组首元素的指针。但是,数组名本身并不是一个指针变量,而是一个常量表达式,其值为数组首元素的地址。
测试代码1:
#include <stdio.h>
int main() { // 定义并初始化一个整型数组 int numbers[5] = {1, 2, 3, 4, 5}; // 访问并打印数组中的每个元素// 数组下标从0开始 for(int i = 0; i < 5; i++) { printf("numbers[%d] = %d\n", i, numbers[i]); } // 修改数组中的某个元素 numbers[2] = 10; // 将索引为2的元素(即第三个元素)修改为10 // 再次访问并打印修改后的数组元素 printf("After modification:\n"); for(int i = 0; i < 5; i++) { printf("numbers[%d] = %d\n", i, numbers[i]); } // 部分初始化和自动初始化为0 int partialInit[5] = {1, 2}; // 只初始化了前两个元素,其余自动初始化为0 printf("Partially initialized array:\n"); for(int i = 0; i < 5; i++) { printf("partialInit[%d] = %d\n", i, partialInit[i]); } // 使用变量大小,变长数组(VLA) int size = 3; int vla[size]; // 变长数组 for(int i = 0; i < size; i++) { vla[i] = i * 2; // 初始化 } printf("Variable Length Array:\n"); for(int i = 0; i < size; i++) { printf("vla[%d] = %d\n", i, vla[i]); } return 0;
}
运行结果如下:
测试代码2:
#include <stdio.h>
// 冒泡排序
void bubbleSort(int arr[], int n) { int i, j, temp; for (i = 0; i < n-1; i++) { for (j = 0; j < n-i-1; j++) { if (arr[j] > arr[j+1]) { temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } } }
} // 选择排序
void selectionSort(int arr[], int n) { int i, j, minIndex, temp; for (i = 0; i < n-1; i++) { minIndex = i; for (j = i+1; j < n; j++) { if (arr[j] < arr[minIndex]) { minIndex = j; } } temp = arr[minIndex]; arr[minIndex] = arr[i]; arr[i] = temp; }
} int main() { //户输入整数以及整数个数 int n, choice, i; printf("请输入整数的个数: "); scanf("%d", &n); int arr[n]; printf("请输入%d个整数:\n", n); for(i = 0; i < n; i++) { scanf("%d", &arr[i]); } printf("选择排序算法(1: 冒泡排序, 2: 选择排序): "); scanf("%d", &choice); //选择排序方式 switch(choice) { case 1: bubbleSort(arr, n); printf("冒泡排序后的数组:\n"); break; case 2: selectionSort(arr, n); printf("选择排序后的数组:\n"); break; default: printf("无效的选择,请重新运行程序。\n"); return 1; } //打印排序后的数组 for (i = 0; i < n; i++) printf("%d ", arr[i]); printf("\n"); return 0;
}
运行结果如下:
测试代码3:
#include <stdio.h>
#include <stdlib.h>
#include <time.h> // 函数声明
void generateRandomNumbers(int arr[], int n);
void sortDescending(int arr[], int n);
void insertNumber(int arr[], int *n, int number);
void deleteNumber(int arr[], int *n, int m);
void printArray(int arr[], int n); int main() { int n, number, m; int *arr; // 初始化随机数生成器 srand(time(NULL)); printf("Enter the number of two-digit integers: "); scanf("%d", &n); // 动态分配数组 arr = (int *)malloc(n * sizeof(int)); if (arr == NULL) { printf("Memory allocation failed!\n"); return 1; } // 生成随机数 generateRandomNumbers(arr, n); printf("Original array:\n"); printArray(arr, n); // 排序 sortDescending(arr, n); printf("Sorted array (descending):\n"); printArray(arr, n); // 插入数字 printf("Enter a number to insert: "); scanf("%d", &number); insertNumber(arr, &n, number); printf("Array after insertion:\n"); printArray(arr, n); // 删除数字 printf("Enter the index (0-%d) to delete: ", n - 1); scanf("%d", &m); if (m >= 0 && m < n) { deleteNumber(arr, &n, m); printf("Array after deletion:\n"); printArray(arr, n); } else { printf("Invalid index!\n"); } // 释放内存 free(arr); return 0;
} // 实现函数
void generateRandomNumbers(int arr[], int n) { for (int i = 0; i < n; i++) { arr[i] = rand() % 90 + 10; // 生成10到99之间的随机数 }
} //冒泡排序,按降序排列数组
void sortDescending(int arr[], int n) { for (int i = 0; i < n - 1; i++) { for (int j = 0; j < n - i - 1; j++) { if (arr[j] < arr[j + 1]) { int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } }
}
//在数组中插入一个数,并保持数组的有序性。
void insertNumber(int arr[], int *n, int number) { int i; for (i = *n - 1; (i >= 0 && arr[i] < number); i--) { arr[i + 1] = arr[i]; } arr[i + 1] = number; (*n)++;
}
//根据索引删除数组中的一个元素,并调整数组大小。
void deleteNumber(int arr[], int *n, int m) { for (int i = m; i < *n - 1; i++) { arr[i] = arr[i + 1]; } (*n)--;
}
// 打印数组
void printArray(int arr[], int n) { for (int i = 0; i < n; i++) { printf("%d ", arr[i]); } printf("\n");
}
运行结果如下:
测试代码4:
#include <stdio.h>
//一维数组转换为二维数组
//"转换"只是逻辑上的,物理上仍然是一个一维数组。
//确保不要超出数组的实际边界,即index必须在0到total-1之间。
//这种方法在需要动态确定数组大小或数组大小较大时特别有用,
//可以避免使用二维数组可能带来的内存分配问题。
int main() { int i, j; int rows = 3; // 3行 int cols = 4; // 4列 int total = rows * cols; // 总元素数量 // 初始化一维数组 int array[total]; for (i = 0; i < total; i++) { array[i] = i + 1; //将数组元素初始化为1到total的整数 printf("%d ", array[i]); } printf("\n");// 使用二维数组的索引方式访问一维数组 // 通过计算索引(index = i * cols + j)访问一个二维数组。// i代表行索引,j代表列索引,cols是每行的列数。for (i = 0; i < rows; i++) { for (j = 0; j < cols; j++) { // 计算一维数组中的索引 int index = i * cols + j; printf("%d ", array[index]); } printf("\n"); // 每完成一行的打印后换行 } return 0;
}
运行结果如下:
测试代码5:
#include <stdio.h>
int main() { // 定义一个5x3的二维数组 int twoDArray[5][3] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9}, {10, 11, 12}, {13, 14, 15} }; // 定义一个足够大的一维数组以存储二维数组的元素 int oneDArray[5 * 3]; // 因为是5x3的二维数组,所以一维数组需要15个元素的空间 // 遍历二维数组,并将元素复制到一维数组中 int index = 0; // 用于一维数组的索引 for (int i = 0; i < 5; i++) { // 遍历二维数组的行 for (int j = 0; j < 3; j++) { // 遍历二维数组的列 oneDArray[index++] = twoDArray[i][j]; // 将二维数组的元素复制到一维数组中,并更新索引 } } // 打印一维数组的元素for (int i = 0; i < 5 * 3; i++) { printf("%d ", oneDArray[i]); } return 0;
}
运行结果如下:
相关文章:

C语言基础(六)
一维数组: C语言中的数组是一种基本的数据结构,用于在计算机内存中连续存储相同类型的数据。 数组中的每个元素可以通过索引(或下标)来访问,索引通常是从0开始的。 数组的大小在声明时确定,并且之后不能改…...

什么是词向量?如何得到词向量?Embedding 快速解读
我第一次接触 Embedding 是在 Word2Vec 时期,那时候还没有 Transformer 和 BERT 。Embedding 给我的印象是,可以将词映射成一个数值向量,而且语义相近的词,在向量空间上具有相似的位置。 有了 Embedding ,就可以对词进…...

AI视频创作应用
重磅推荐专栏: 《大模型AIGC》 《课程大纲》 《知识星球》 本专栏致力于探索和讨论当今最前沿的技术趋势和应用领域,包括但不限于ChatGPT和Stable Diffusion等。我们将深入研究大型模型的开发和应用,以及与之相关的人工智能生成内容(AIGC)技术。通过深入的技术解析和实践经…...
JAVA常见的工具类之Object类(超详细)
1、Java API简介 Java API(Java Application Programming Interface)是Java应用程序编程接口的缩写。Java中的API,就是JDK提供的具有各种功能的Java类,灵活使用Java API能够大大提高使用Java语言编写程序的效率。 Java API的帮助文档可到 http://docs.or…...

深度学习(YOLO、DETR) 十折交叉验证
二:交叉验证 在 K 折验证之前最常用的验证方法就是交叉验证,即把数据划分为训练集、验证集和测试集。一般的划分比例为 7:1:2。但如何合理的抽取样本就成为了使用交叉验证的难点,不同的抽取方法会导致截然不同的训练性…...

基于php网上差旅费报销系统设计与实现
网上报销系统以LAMP(LinuxApacheMySQLPHP)作为平台,涉及到PHP语言、MySQL数据库、JavaScript语言、HTML语言。 2.1 PHP语言简介 PHP,一个嵌套的缩写名称,是英文 “超级文本预处理语言”(PHP: Hypertext Preprocessor)的缩写。P…...

微服务及安全
一、微服务的原理 1.什么是微服务架构 微服务架构区别于传统的单体软件架构,是一种为了适应当前互联网后台服务的「三高需求:高并发、高性能、高可用」而产生的的软件架构。 单体式应用程序 与微服务相对的另一个概念是传统的单体式应用程序( Monolithic application ),…...

图文详解ThreadLocal:原理、结构与内存泄漏解析
目录 一.什么是ThreadLocal 二.ThreadLocal的内部结构 三.ThreadLocal带来的内存泄露问题 ▐ key强引用 ▐ key弱引用 总结 一.什么是ThreadLocal 在Java中,ThreadLocal 类提供了一种方式,使得每个线程可以独立地持有自己的变量副本,而…...

基于java的综合小区管理系统论文.doc
摘 要 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统综合小区管理系统信息管理难度大,容错率低&am…...
如何合理设置PostgreSQL的`max_connections`参数
合理设置PostgreSQL的max_connections参数对于数据库的稳定性和性能至关重要。这个设置值决定了允许同时连接到数据库的最大客户端数量。如果设置不当,可能导致资源浪费或系统过载。以下是设置max_connections时需要考虑的几个关键因素: 1. 评估系统硬件…...

Kubectl 常用命令汇总大全
kubectl 是 Kubernetes 自带的客户端,可以用它来直接操作 Kubernetes 集群。 从用户角度来说,kubectl 就是控制 Kubernetes 的驾驶舱,它允许你执行所有可能的 Kubernetes 操作;从技术角度来看,kubectl 就是 Kubernetes…...

【Linux】Linux环境基础开发工具使用之Linux调试器-gdb使用
目录 一、程序发布模式1.1 debug模式1.2 release模式 二、默认发布模式三、gdb的使用结尾 一、程序发布模式 程序的发布方式有两种,debug模式和release模式 1.1 debug模式 目的:主要用于开发和测试阶段,目的是让开发者能够更容易地调试和跟…...
clickhouse_driver
一、简介 clickhouse_driver是一个Python库,用于与ClickHouse数据库进行交互。ClickHouse是一个高性能的列式数据库管理系统(DBMS),它适用于实时分析(OLAP)场景。clickhouse_driver模块提供了与ClickHouse…...

BI分析实操案例分享:零售企业如何利用BI工具对销售数据进行分析?
在当下这个竞争激烈的零售市场,企业如何在波诡云谲的商场中站稳脚跟,实现销售目标的翻倍增长? 答案可能就藏在那些看似杂乱无章的数字里。 是的,你没有看错,答案正是那些我们日常接触的销售数据。它们就像是宝藏&…...

python : Requests请求库入门使用指南 + 简单爬取豆瓣影评
Requests 是一个用于发送 HTTP 请求的简单易用的 Python 库。它能够处理多种 HTTP 请求方法,如 GET、POST、PUT、DELETE 等,并简化了 HTTP 请求流程。对于想要进行网络爬虫或 API 调用的开发者来说,Requests 是一个非常有用的工具。在今天的博…...

宋红康JVM调优思维导图
文章目录 1. 概述2. JVM监控及诊断命令-命令行篇3. JVM监控及诊断工具-GUI篇4. JVM运行时参数5. 分析GC日志 课程地址 1. 概述 2. JVM监控及诊断命令-命令行篇 3. JVM监控及诊断工具-GUI篇 4. JVM运行时参数 5. 分析GC日志...
linux 网卡配置
linux网卡可以通过命令和配置文件配置,如果是桌面环境还可以通过图形化界面配置. 1.ifconfig(interfaces config)命令方式 通常需要以root身份登录或使用sudo以便在Linux机器上使用ifconfig工具。依赖于ifconfig命令中使用一些选项属性,ifconfig工具不仅可以被用来…...

IEEE |第五届机器学习与计算机应用国际学术会议(ICMLCA 2024)
第五届机器学习与计算机应用国际学术会议(ICMLCA 2024)定于2024年10月18-20日在中国杭州隆重举行。本届会议将主要关注机器学习和计算机应用面临的新的挑战问题和研究方向,着力反映国际机器学习和计算机应用相关技术研究的最新进展。 IEEE |第五届机器学习与计算机应…...

【网络安全】漏洞挖掘:IDOR实例
未经许可,不得转载。 文章目录 正文 正文 某提交系统,可以选择打印或下载passport。 点击Documents > Download后,应用程序将执行 HTTP GET 请求: /production/api/v1/attachment?id4550381&enamemId123888id为文件id&am…...
vue项目执行 cnpm install 报错证书过期的解决方案
拉下源码后执行依赖安装过程,报错 error Error: Certificate has expired,可以通过一下方发解决:npm config set strict-ssl false 再执行 cnpm 命令即可正常拉依赖...

龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...

C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...

力扣热题100 k个一组反转链表题解
题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...