C语言数组:数据的集合艺术(续)

前言
在上一篇文章中,我们深入探讨了C语言数组的基本概念、操作以及多维数组的应用。今天,我们将继续探索数组的更多高级特性,包括动态内存分配、指针与数组的关系以及数组在实际编程中的应用案例。
在这里插入图片描述

一、动态内存分配与数组

在C语言中,虽然数组的大小在定义时是固定的,但我们可以使用动态内存分配来改变数组的大小。这主要通过malloccallocrealloc等函数来实现。

malloc函数用于在堆上分配指定大小的内存,并返回指向该内存区域的指针。例如:

int *dynamicArray = (int *)malloc(10 * sizeof(int));
if (dynamicArray == NULL) {// 内存分配失败处理
}
// 使用dynamicArray...
free(dynamicArray); // 使用完毕后释放内存

在上述代码中,我们分配了一个包含10个整数的动态数组,并通过指针dynamicArray来访问和修改数组中的元素。需要注意的是,使用malloc分配的内存需要在使用完毕后通过free函数释放,以避免内存泄漏。

calloc函数与malloc类似,但它会初始化分配的内存为零。realloc函数则用于调整已分配内存的大小。

二、指针与数组的关系

在C语言中,数组名在大多数情况下会被解释为指向数组首元素的指针。这使得我们可以使用指针来访问和修改数组中的元素。

int numbers[5] = {1, 2, 3, 4, 5};
int *ptr = numbers; // ptr指向数组首元素
printf("%d\n", *(ptr + 2)); // 输出数组中的第三个元素:3

通过指针运算,我们可以灵活地访问数组中的任意元素。同时,指针也可以作为函数参数传递数组,使得函数能够操作数组而无需知道其大小。

然而,需要注意的是,指针和数组在类型上是有区别的。指针是一个变量,存储的是内存地址;而数组则是一系列相同类型元素的集合。因此,在使用时需要明确区分它们。

三、数组在实际编程中的应用

数组作为一种基础数据结构,在实际编程中有着广泛的应用。下面我们将通过几个示例来展示数组在不同场景下的使用。

示例1:统计字符串中字符出现的次数

#include <stdio.h>
#include <string.h>#define MAX_CHAR 256 // 假设只处理ASCII字符int main() {char str[] = "Hello, world!";int charCount[MAX_CHAR] = {0}; // 初始化字符计数器数组// 统计每个字符出现的次数for (int i = 0; i < strlen(str); i++) {charCount[(int)str[i]]++;}// 输出统计结果for (int i = 0; i < MAX_CHAR; i++) {if (charCount[i] > 0) {printf("'%c' appears %d times\n", (char)i, charCount[i]);}}return 0;
}

在上面的代码中,我们使用了一个大小为256的整数数组charCount来统计字符串中每个ASCII字符出现的次数。通过遍历字符串并增加对应字符的计数器,我们得到了每个字符的出现频率。
在这里插入图片描述

示例2:实现简单的排序算法

在之前的文章中,我们已经展示了如何使用数组实现冒泡排序算法。这里我们再给出一个使用数组实现选择排序算法的示例:

#include <stdio.h>void selectionSort(int arr[], int n) {for (int i = 0; i < n - 1; i++) {int minIndex = i;for (int j = i + 1; j < n; j++) {if (arr[j] < arr[minIndex]) {minIndex = j;}}// 交换arr[i]和arr[minIndex]int temp = arr[i];arr[i] = arr[minIndex];arr[minIndex] = temp;}
}int main() {int numbers[] = {64, 25, 12, 22, 11};int n = sizeof(numbers) / sizeof(numbers[0]);selectionSort(numbers, n);for (int i = 0; i < n; i++) {printf("%d ", numbers[i]);}printf("\n");return 0;
}

在上面的代码中,我们定义了一个selectionSort函数来实现选择排序算法。该函数接受一个整数数组和数组的大小作为参数,通过遍历数组并找到未排序部分中的最小元素,然后将其与未排序部分的第一个元素交换,从而完成排序。在main函数中,我们定义了一个待排序的整数数组,并调用selectionSort函数对其进行排序,最后输出排序后的结果。

示例3:使用数组实现简单的矩阵运算

数组还可以用于表示和操作矩阵,从而进行线性代数中的运算。下面是一个简单的示例,展示了如何使用二维数组实现矩阵的加法:

#include <stdio.h>#define ROWS 3
#define COLS 3void addMatrices(int a[][COLS], int b[][COLS], int result[][COLS]) {for (int i = 0; i < ROWS; i++) {for (int j = 0; j < COLS; j++) {result[i][j] = a[i][j] + b[i][j];}}
}int main() {int matrixA[ROWS][COLS] = {{1, 2, 3},{4, 5, 6},{7, 8, 9}};int matrixB[ROWS][COLS] = {{9, 8, 7},{6, 5, 4},{3, 2, 1}};int result[ROWS][COLS];addMatrices(matrixA, matrixB, result);// 输出结果矩阵for (int i = 0; i < ROWS; i++) {for (int j = 0; j < COLS; j++) {printf("%d ", result[i][j]);}printf("\n");}return 0;
}

在上面的代码中,我们定义了一个addMatrices函数,它接受两个相同大小的二维数组作为输入,并将它们的对应元素相加,将结果存储在第三个二维数组中。在main函数中,我们定义了两个3x3的矩阵matrixAmatrixB,并调用addMatrices函数计算它们的和,最后输出结果矩阵。

四、结语

数组作为C语言中的一种基础数据结构,具有广泛的应用场景。通过掌握数组的定义、操作以及与其他编程概念(如指针、动态内存分配等)的结合使用,我们可以编写出高效且灵活的代码来处理各种数据集合。同时,在实际编程中,我们还需要注意数组的局限性和注意事项,以避免潜在的问题。

在本文中,我们深入探讨了数组与指针的关系、动态内存分配以及数组在实际编程中的应用案例。希望这些内容能够帮助你更全面地理解C语言中的数组,并在实际编程中灵活运用它们。在未来的学习和实践中,你还将继续发现数组的强大之处和更多高级用法。
在这里插入图片描述

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

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

相关文章

Unity开发一个FPS游戏之三

在前面的两篇博客中&#xff0c;我已实现了一个FPS游戏的大部分功能&#xff0c;包括了第一人称的主角运动控制&#xff0c;武器射击以及敌人的智能行为。这里我将继续完善这个游戏&#xff0c;包括以下几个方面&#xff1a; 增加一个真实的游戏场景&#xff0c;模拟一个废弃的…

数据加密的两种方案

说明&#xff1a;本文介绍对项目中的数据加密的两种方案&#xff1b; 场景 源自真实的项目需求&#xff0c;需要我们对系统中的敏感数据&#xff08;如手机号、证件号等&#xff09;进行加密处理&#xff0c;即存入到数据库中的是加密后的密文数据。加密本身是不难的&#xf…

Spring Security——11,自定义权限校验方法

自定义权限校验方法 一键三连有没有捏~~ 我们也可以定义自己的权限校验方法&#xff0c;在PreAuthorize注解中使用我们的方法。 自定义一个权限检验方法&#xff1a; 在SPEL表达式中使用 ex相当于获取容器中bean的名字未ex的对象。然后再调用这个对象的 hasAuthority方法&am…

软考高级架构师:嵌入式系统的内核架构

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;大厂高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

ssm028蜀都天香酒楼的网站设计与实现+jsp

基于JSP的蜀都天香酒楼管理系统的设计与实现 摘要 近年来&#xff0c;信息化管理行业的不断兴起&#xff0c;使得人们的日常生活越来越离不开计算机和互联网技术。首先&#xff0c;根据收集到的用户需求分析&#xff0c;对设计系统有一个初步的认识与了解&#xff0c;确定蜀都…

带头双向循环链表实现

1.结构及特性 前面我们实现了无头单向非循环链表&#xff0c;它的结构是这样的&#xff1a; 在这里的head只是一个指向头结点的指针&#xff0c;而不是带头链表的头节点。 而带头双向循环链表的逻辑结构则是这样的 这就是链表的结构&#xff0c;链表的每一个节点都有两个指针…

docker 安装redis报错:can not init background jbos

启动redis&#xff0c;发现一直再重启 docker run -d --name redis -p 6379:6379 --restartalways redis:6.2.6 --requirepass "123456" 查看日志&#xff0c;发现job没启动 docker logs 47f6572a779c 尝试了一堆解决办法。。。最后发现尝试安装了redis6.2.6版本&a…

从《布瓦尔与佩库歇》实践中学习社会科学概论

从《布瓦尔与佩库歇》实践中学习社会科学概论 前情提要《布瓦尔与佩库歇》实践笔记云藏山鹰社会科学概论报告核心--信息形数身知™意合™意气实体过程意气实体过程宇宙学诠释™ 社会科学概论花间流风版导读&#xff0c;马斯克风格演讲[ 一尚韬竹团队供稿&#xff1b;] 内容展开…

实验4 层次图和HIPO图

一、实验目的 通过绘制层次图和HIPO图&#xff0c;熟练掌握层次图和HIPO图的基本原理。 能对简单问题进行层次图和HIPO图的分析&#xff0c;独立地完成层次图和HIPO图设计。 二、实验项目内容&#xff08;实验题目&#xff09; 1、用Microsoft Visio绘制出图书馆管理系统的层…

Flume 拦截器概念及自定义拦截器的运用

文章目录 Flume 拦截器拦截器的作用拦截器运用1.创建项目2.实现拦截器接口3.编写事件处理逻辑4.拦截器构建5.打包与上传6.编写配置文件7.测试运行 Flume 拦截器 在 Flume 中&#xff0c;拦截器&#xff08;Interceptors&#xff09;是一种可以在事件传输过程中拦截、处理和修改…

Spring定义Bean对象笔记(二)

前言&#xff1a;上一篇记录了通过XML文件来定义Bean对象&#xff0c;这一篇将记录通过注解和配置类的方式来定义Bean对象。 核心注解&#xff1a; 定义对象&#xff1a;Component,Service,Repository,Controller 依赖注入&#xff1a; 按类型&#xff1a;Autowired 按名称&am…

【JavaScript】作用域 ③ ( JavaScript 作用域链 | 作用域链变量查找机制 )

文章目录 一、JavaScript 作用域链1、作用域2、作用域链3、作用域链变量查找机制 二、代码示例 - 作用域链 一、JavaScript 作用域链 1、作用域 在 JavaScript 中 , 任何代码都有 作用域 , 全局作用域 : 在 <script> 标签中 或者 js 脚本中 定义的变量 属于 全局作用域 …

Vue3【进阶】

简介 https://cn.vuejs.org/guide/introduction.html 创建vue3工程 【基于 vue-cli创建】 基本和vue-cli的过程类似&#xff0c;只是选择的时候用vue3创建 【基于vite创建】【推荐】 【官网】https://vitejs.cn/ 【可以先去学一下webpack】 步骤 【https://cn.vitejs.…

kubernetes集群添加到jumpserver堡垒机里管理

第一步、在kubernetes集群中获取一个永久的token。 jumpserver堡垒机用api的来管理kubernetes&#xff0c;所以需要kubernetes的token&#xff0c;这个token还需要是一个永久的token&#xff0c;版本变更&#xff1a;Kubernetes 1.24基于安全方面的考虑&#xff08;特性门控Le…

LeetCode-热题100:118. 杨辉三角

题目描述 给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 示例 1: 输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]] 示例 2: 输入: numRows 1 输出: [[1]]…

代码随想录第32天|455.分发饼干 376. 摆动序列

理论基础 贪心算法核心&#xff1a;选择每一阶段的局部最优&#xff0c;从而达到全局最优。 455.分发饼干 455. 分发饼干 - 力扣&#xff08;LeetCode&#xff09;代码随想录 (programmercarl.com)455. 分发饼干 - 力扣&#xff08;LeetCode&#xff09; 贪心算法理论基础&am…

【AI绘画/作图】风景背景类关键词模板参考

因为ds官网被墙,所以翻了IDE的源码整理了下stablestudio里的官方模板&#xff0c;顺便每个模板生成了一份…不知道怎么写关键词的可以参考 Stunning sunset over a futuristic city, with towering skyscrapers and flying vehicles, golden hour lighting and dramatic cloud…

C语言高效的网络爬虫:实现对新闻网站的全面爬取

1. 背景 搜狐是一个拥有丰富新闻内容的网站&#xff0c;我们希望能够通过网络爬虫系统&#xff0c;将其各类新闻内容进行全面地获取和分析。为了实现这一目标&#xff0c;我们将采用C语言编写网络爬虫程序&#xff0c;通过该程序实现对 news.sohu.com 的自动化访问和数据提取。…

行业型软文怎么写,媒介盒子分享

行业型软文即指面对行业内人群的软文,此类文章的目的通常是为了扩大行业影响力,奠定行业品牌地位。企业的行业地位将直接影响到其核心竞争力,甚至会影响到最终用户的选择。今天媒介盒子就和大家聊聊行业型软文怎么写。 一、了解受众需求&#xff1a; 首先&#xff0c;深入研究…

【C++第三阶段】string容器

以下内容仅为当前认识&#xff0c;可能有不足之处&#xff0c;欢迎讨论&#xff01; 文章目录 string容器基本概念构造函数赋值操作拼接操作字符串查找和替换字符串比较字符串存取字符串插入和删除字符串子串 string容器 基本概念 本质&#x1f449;string是C风格的字符串&…