周亚辉
摘要:随着人工智能和计算机技术的不断发展,C语言因其独特优势一直被广泛应用。数组是C语言中常用的数据类型之一,本文介绍了C语言在程序设计中数组的有效运用,首先文章从数组的排序、插入、删除和应用四个方面介绍了数组的各类应用和编程方法,然后介绍了数组和指针的关系,并以处理转置矩阵为例介绍了数组和指针的联合应用是如何解决实际问题的。本文所做研究对C语言的数组的学习和应用提供了一定的指导意义。
关键词:C语言;数组;应用
中图分类号:TP311 文献标识码:A
文章编号:1009-3044(2020)35-0209-02
开放科学(资源服务)标识码(OSID):
1 引言
自1972年C语言作为一种独立的面向过程的开发语言问世以来,一直作为适应于底层开发的通用设计语言。因其编译方式简单,低级存储器便可处理编译工作,不需要任何其他编译环境,且支持高校程序设计,多年来一直被广大开发者热衷[1]。其跨平台输出的特点,决定了C语言程序可在嵌入式处理器等平台中被编译和使用。与C++和JAVA等面向对象编程的语言不同,C语言的主要目标是实现简易编译、适应低级存储器,高编译效率[2]。
C语言主要的数据类型包括:整数型、字符型、实型、浮点型、枚举型、数组类型、结构体类型、共用体类型、指针类型和空类型。数组是一组有序的元素组合序列,为了方便计算机进行数据处理[3],把无序的元素按照一定的次序有序组织起来。从数据处理角度讲,数组能够方便解决各类复杂的数据处理问题。元素是构成数组的基本单位,不同元素通过顺序号将其顺序标识。根据数组中元素的类型可以分为字符型数组、数值型数组、指针数组和结构数组等[4]。
虽然C语言中数组类型定义比较简单,但因其由于范围广,在进行排序、字符串处理、计算函数处理等过程中,都离不开数组[5]。本文介绍C语言设计过程中,数组的有效运用,对其在解决实际问题过程中的方法进行总结。对于数组的应用,首先要掌握其基本操作,如变量定义、赋值和使用。一般数组的应用可以分为五大类:排序、插入、删除、合并、查询,还可来存储大数据。
2 数组的应用
2.1排序
排序是程序设计中最常见的一种算法,对于数组的排序也是C语言编程中的一类重要内容,排序规则也是其他应用开发的基础。排序是将无规则的数据或者字符串等元素,按照固定规则和顺序进行大小排列,常见的排序防范有插入法排序、冒泡排序、交换排序法等,其中冒泡排序法是排序的最常用方式。针对a[0]-a[9]10个数字采用冒泡排序法进行排序,应用案例如下:
1)数组元素输入;a[0]-a[9];
2)數组中相邻元素两两比较,数值大者往前冒泡,数值小者往后冒泡;
3)第一轮比较结束后,用相同方式再进行循环比较。若数组中元素个数有N个,则N-1轮便可将数组按照从大到小的顺序排好。
若此排序要求,不按照冒泡等排序算法进行而用常规变量解决,需定义10个变量,且无法再排序过程中借助循环法解决此问题。
2.2插入
针对已经做好排序工作的数组,若要在数组中增加新元素,并且按照原有排序规则重新组合新数据,是常见的一类数组操作。数组插入元素的基本操作步骤如下。
比较待插入元素X和数组中末尾元素的大小,若末尾元素大于X,则将X直接插入至数组末尾,若末尾元素小于X,则一次比较a[0]-a[n-1],直至a[i]>X是,将X插入a[i-1]之后,a[i]之前,同时将其后的元素逐一后移,增加其序号值。
在数组元素插入过程中,常见问题是会出现数组index越界问题,发生此类问题的主要原因在于数组在定义之初,未充分考虑元素插入问题,插入新元素后其容量比原有数组定义元素数量数值大。还有常见问题是,当出现比X大的数组元素时,未进行中段操作,致使插入错误。
2.3 删除
数组删除和数组插入类似。数组删除分两种情况,一类是未排序数组的元素删除,一类是已排序数组的元素删除。两类数组元素的删除逻辑相同,具体步骤如下:
1)在键盘中输入数组中要删除的元素;
2)所输入元素在数组中是否存在,如果存在则执行删除操作,如果不存在则忽略此元素;
3)若数组本身是已排序数组,则在数组删除元素位置进行依次递补,数组元素总数减1。
在删除数组元素过程中,元素漏删现象较多,一旦输入元素在数组中连续出现时,为了保证删除动作正常进行,应该在程序中一次删除多个元素。其程序逻辑图如图1所示。
2.4 合并
数组的合并是对两个已经实现排序的数组重新合并后组成新数组的过程,合并完成后的数组仍然要有序。
2.5 查询
常规的数组元素查询方法一般是根据输入元素从数组中每个元素逐一查找,直至查询到元素为止,若数组中查找不到被查元素,则程序结束。此种查找方式查询效率较低,假设数组中存在500个元素且被查元素在数组末尾,则需要进行499次比较才能得到最终结果。按照概率计算,数组元素的搜索至少需要250次方可完成比较。折半法是常用的数组元素查找方法,其查找效率比正常查找效率高、速度快。例如存在数组,其元素数量为9,分别为1,2,3,7,11,16,18,19,22,若输入3,查找3是否在数组中,步骤如下:
1)首先找出数组中位置居中的数,由于数组已经按照从小到大顺序排序。中位数为11。
2)比较3和11的大小,若前者小于后者,则在全班段中(即a[1]-a[5]中)寻找与3相同的元素。
3)根据以上逻辑继续在a[1]-a[5]中寻找,再次取中位数,a[3],恰好a[3]=3,因此,通过两步便得到了最终想要的结果。在查找效率上有了很大提升。若数组中数组元素的含量为int(log2n)+1。
3 数组与指针
数组和指针在C语言中是联系最紧密的两种数据类型,对于数组的处理,往往借助指针的手段实现。在具体程序设计中,数组和指针的关系很容易被混淆。具体来讲,指针是用来存放具体变量之地址的变量。变量中保存了其他变量的地址,根据对变量地址的访问间接实现对变量的访问。
3.1指针和一维数组
可借助数组元素的指针实现指针和一维数组的关联,也就是通过定义数组元素的指针,并将其指向一维数组的第一个元素。假设p是已经被定义的指向整形数组的指针,且已被赋值,使其指向数组元素的第一个元素,则p+1便指向数组的第二个元素。
3.2指针和多维数组
多维数组和指针的关系比较复杂,其使用方法也相对灵活,这样在一定程度上增加了编程的复杂性。本文以二维数组为例,介绍指针和其关系。首先定义int b[3][4] = {{0,2,4,6},{1,3,5,7},{7,8,10,11}},由于二维数组是指由两个一维数组组合而成的,a数组含有3个行和4个列,其三个行可以分别表示为a[0],a[1],a[2],每个一维数组又含有4个子元素。另外,二维数组在存储过程中是按照行的主顺序方法占据一连串存储空间的,因此C语言通过建立二维数组和指针的关系,除使用指针指向数组元素外,还可采用数组指针和指针数组两种方式。
(1)数组的指针。数组的指针可以是一个指向多维或者一维的指针,定义数组指针后,可以对其复制,并以此在数组和指针之间建立起关联关系。例如int(*)p[4]=a,定义了p为数组指针,并将其赋值为数组a。
(2)指针数组。数组的元素可以为整数,也可以为浮点型数据或字符类数据。故数组的元素种类可以是多种多样的,因此数组的元素类型也可以为指针类型。例如定义int*p[3] = {b[0],b[1],b[2]},此种形式表示定义了包含有3个整数型指针的数组。
具体应用过程中,为了不断优化C语言的程序,进而提升程序的运转效率,在程序中会充分利用数组和指针的关系,借助指针实现对数组元素的间接访问。例如通过C语言编程的方式实现对4*4矩阵的转置操作等。在C语言中可借助二维数组实现对矩阵的存储,并可采用相关算法实现矩阵的转置。使用指针实现对数组元素的引用首先需要将数组和指针之间建立起关联关系。具体程序实现如下所示:
#include
void main(){
void move(int(*q)[3];//对move函数进行定义,并声明其参数类型为数组指针
int i,a[3][3] = {1,2,3,4,5,6,7,8,9};
int (*p)[3] = a;//定义数组类型的指针
move (p);
for(int i=0;i<3;i++)//将转至矩阵输出
printf(“%d %d %d\n”,a[i][0],a[i][1],a[i][2]);
}
void move (int (*q)[3])
{
int j,k,n;
for(j=0;j<3;j++){
for(k=0;k<3;k++){
n = *(*(q+j)+k);
*(*(q+j)+k) = *(*q+k)+j);
*(*q+k)+j) = n;
}
}
}
綜上所述,move函数主要是通过变量n实现矩阵中对角线元素的两两置换,这种置换方式是C语言中经常使用的编程方法,如数组排序中也经常被使用。因篇幅限制,move函数的具 体实现方式不再赘述。指针和数组是C语言学习过程的重中之重,也是C语言学习过程中的难点之一,若不能充分理解数组和指针的相互关系,便无法充分借助C语言便利的编程方法解决实际问题,C语言的实际效能便大打折扣。
4 结论
随着人工智能和计算机技术的飞速发展,各类芯片被不断开发出来,随之嵌入式应用也越来越被广泛应用,C语言作为开发的最基础类语言,引起具有开发简便、编译速度快、入门快且对编译器的存储能力要求不高等问题,也越来越被受到重视。
数组作为C语言中应用最为广泛的数据类型之一,和链表、指针等关系紧密,因其具有数据规律性存储的特点,其在编程中时长被用到。本文总结了C语言数组的各类数据处理方式和C语言中数组和指针的关系,介绍了数组和指针的关系,为C语言学习过程中数组的应用提供了借鉴和指导意义。
参考文献:
[1] 沈逸飞,任春龙,胡云飞,等.浅析C语言、Java、Python的数组合并方法[J].电脑知识与技术,2020,16(3):78-82.
[2] 马振婴. C语言程序设计课程指针的教学设计[J].科教导刊, 2019 (7):111-112.
[3] 常欢,罗奇鸣,李薛剑,等.Alias Analysis Algorithm for C Programs Based on a Stack Memory Model[J].小型微型计算机系统,2019, 40(2):353-358.
[4] 张乐, 杨立. 基于问题引导法的C语言一维数组插入算法教学过程分析[J]. 现代计算机(专业版), 2018, 621(21):64-67+71.
[5] 李凌.C语言的教学设计——基于布卢姆教育目标分类理论视角[J].柳州职业技术学院学报,2018,18(4):76-80.
【通联编辑:李雅琪】