APP下载

浅析C++中获取数组长度的若干方法

2018-11-01刘昊方欢袁水莲

电脑知识与技术 2018年19期
关键词:数组语言

刘昊 方欢 袁水莲

摘要:数组是编程语言中应用最为广泛、功能强大的一种数据结构。该文分析和探讨了C++语言中常见的不同类型数组长度的获取方法与机理,将数组分为静态数组和动态数组,从两种不同的构造结构出发,结合程序实例,分别阐释了其中数值型、字符型和一维及多维数组长度的获取方法,并进行了具体方法的原理探究。其次,对所总结的几种方法进行了比较,给出操作过程中常见的出错及解决方案,以便于掌握数组长度应用中的操作技巧。

关键词:数组;长度获取;C++语言;错误处理

中图分类号:G642.0 文献标识码:A 文章编号:1009-3044(2018)19-0089-04

Abstract: Array is the most powerful data structure and widely used in programming languages. This paper analyzes and discusses the methods and mechanisms for the acquisition of different types of array lengths commonly found in the C++ language. The arrays are divided into static arrays and dynamic ones. Starting from two different structural structures, combined program examples, the methods for obtaining lengths of numeric, character, one-dimensional and multi-dimensional arrays are respectively illustrated. And this paper carries out the principle of the specific method. Then, the methods summarized in the paper are compared, and the common mistakes and solutions are given in order to grasp the operating skills in array length applications.

Key words: Array; Length acquisition; C++ language; Error handling

1 背景

在C++程序设计中,为了可以高效处理大量数据,同时缩短和简化程序,将具有相同类型的若干元素按照有序的形式组织起来,这些按序排列的同类数据元素的集合即可称为数组[1]。经过C和C++语言的学习,笔者发现书中仅对数组的定义和相关基本操作进行了简单概述,没有对获取数组长度的方法等数组应用细节进行深入阐释。数组的实际应用范围十分广泛,在对指针、字符串、循环语句等操作过程中,程序设计人员常常需要获取数组长度来解决相关程序问题[2]。在相关程序设计语言中,如Java语言中给出了.length作为数组属性来直接获取数组长度,Python中给出了len函数来获取长度,而C++中并未定义相关可直接获取数组长度的属性和函数。鲜少有文献全面总结了C++语言中获取不同类型数组的不同方法,因此该文首先阐述了常见的不同类型数组长度的获取方法和机理,在ANSI C2.0环境下分析了操作过程中可能出现的数组越界等出错情况,并进行相关对比和区分,该文所给代码均经过DEV-C++5.4.0编译通过。

2 常见的不同类型数组及其长度获取方法

在C++中,静态数组是指在声明数组时,就用常量表达式明确指定数组的大小,且运行時的长度不可改变,数组只在定义它的块语句内存在。静态数组中常见的有静态字符型数组和静态数值型数组,利用sizeof()运算符返回类型或数据对象的长度(单位为字节)可以间接获取数组的长度,同时C++中还给出了strlen()函数来计算给定静态字符型数组的长度。动态数组则是在运行时动态分配数组空间,虽然数组长度是固定的,但不必在定义时确定其长度,且动态数组在程序中会一直存在,直到显式将其释放。C++中创建动态数组可以采取用new来申请空间和利用vector模板来创建。因此下面从静态数组的不同类型和动态数组的不同创建方法,分别阐述数组长度的获取方法和机理。

2.1 静态数组

2.1.1 静态数值型数组

C++中未提供可以直接获取静态数值型数组长度的函数和相关数组属性,利用sizeof()操作符可以间接解决该类数组的长度获取问题。sizeof()是一个可以返回操作数所占的内存字节数的操作符,sizeof(a)/sizeof(a[0])可以获取一维静态数值型数组的长度。对于二维静态数值型数组,可利用sizeof(a),sizeof(a[0]),sizeof(int)进行组合来表示二维数组的行数列数以及总元素的数目。由静态一维和二维数组的获取数组长度方法可延伸至静态多维数组获取数组长度的方法。

1)一维静态数值型数组

[分析] sizeof()可以返回操作数所占的内存字节数,因此sizeof(a)返回的是一维数组a所占的总内存,sizeof(a[0])返回的是数组第一个元素即该数组每个元素所占的内存,因此sizeof(a)/sizeof(a[0])则表示的是数组a的元素个数即数组长度。在C++语言中,习惯上在程序的开头将sizeof(a)/sizeof(a[0])定义成一个宏,之后在程序中可直接调用。

2)二维静态数值型数组

[分析] 对于图3程序中的二维数组int a[2][4],sizeof(a)表示二维数组中所有元素所占的字节数,由于a[0]指向首行地址,因此sizeof(a[0])表示该二维数组中每行元素所占字节数,sizeof(int)则表示该数组元素类型(int)所占的字节数,在ANSI C2.0环境下每个int类型元素所占字节为6。因此可利用sizeof(a)/sizeof(int)来求二维数组中数组元素的总数,数组列数可用sizeof(a[0])/sizeof(int)来获得,数组行数可表示为(sizeof(a)/sizeof(int))/( sizeof(a[0])/sizeof(int)),其中sizeof(int)也可以用表示数组中首个元素所占字节的sizeof(a[0][0])替换。

2.1.2 静态字符型数组

字符型数组是指用来存放字符或字符串的数组。在C++中,给出了strlen()函数来计算给定字符串的长度。该函数定义在头文件cstring.h中,参数为C风格字符串的头指针,返回值是不包含空字符‘\0的字符串长度,它的计算原理是顺着头指针向后扫描,直到碰到第一个字符串结束符‘\0。字符数组除了可以使用strlen()函数外,还可以使用sizeof()操作符获取数组长度。

1)字符串数组

[分析]若数组为存储字符串的字符数组,即以双引号括起来的字符串整体初始化的字符数组。在使用时可以事先定义一个比较大的数组,再用strlen()函数返回实际用到的数组元素个数。通过图1,可以发现当定义一个长度为10,但实际长度为6的字符串数组,strlen()函数返回的是字符串数组的实际长度。原因是编译器自动地以‘\0来填补字符串数组后面的空白处。

2)字符数组

[分析] 通过对两道程序的对比,事先定义的字符数组长度不同,所产生的结果不同。char a[5]={‘1, ‘2, ‘3, ‘4, ‘5}在内存的某处存在结束符‘\0,strlen()函数遇‘\0停止计算长度,因此算出来的长度并不是字符数组的真实长度,且值是随机的。而char a[6]={‘1, ‘2, ‘3, ‘4, ‘5}可以输出正确的实际长度的原因同字符串数组中叙述的相同,编译器会自动以‘\0来填补字符串数组后面的空白处,我们也可以写成char a[6]={‘1, ‘2, ‘3, ‘4, ‘5, ‘\0}。

2.2 动态数组

在C++中,动态创建数组的方法主要有两种,一种是使用new运算符在程序运行阶段创建数组,还有一种是利用vector模板创建动态数组。其中若使用new运算符创建动态数组,需要首先将数组的元素类型和元素数目告诉new,此种情况下讨论获取数组长度就没有了意义。vector是C++中STL容器中的一个模板类,它相当于一个动态的数组,当程序设计人员无法知道自己需要的数组规模是多大时,可以利用vector来解决以达到最大节约空间目的。所有的STL容器都提供了一些基本方法,其中就包括size()——返回当前vector所容纳元素的数目。

2.2.1 一维动态数组

[分析]在图7程序中,首先建立了一个未声明确定长度的double类型的一维动态数组,利用push_back()向数组末尾添加元素,最后利用.size()返回数组中元素个数即此一维动态数组的长度。

2.2.2 二维动态数组

[分析]由图8中程序可以看出,创建一个二维动态数组b,则该数组行数可用b.size()表示,列数可用b[0].size()表示,即:

vector > b;

int rowCount=b.size() //行数

int colCount=b[0].size() //列数

3 有关的获取数组长度方法比较

4 常见的出错及解决方案

4.1 sizeof()与strlen()处理字符数组的边界问题

[分析]对于字符串数组a,sizeof()运算符返回的是操作数所占的内存字节数,包括字符串结束符‘\0‘,因此结果为6,而strlen()遇到结尾的结束符便返回,因此结果为5;字符数组b,声明数组的长度为6,故sizeof()返回的便是声明中的内存空间,而strlen()统计的是“\0”之前的字符数,返回字符数组的实际长度;对于常量字符数组c,sizeof()返回所有字符实际所占的内存空间,而strlen()同上所述遇‘\0‘便返回。

[解决方案]在获取字符型数组长度的过程中,程序设计人员应明确strlen()与sizeof()对于字符型数组的结束符的边界问题。其本质不同在于sizeof()忽略结束符的影响,将其看作一个普通字符所占字节数,计算的是变量的大小,而strlen()则是将字符数组中的结束符作为长度判定的依据,遇‘\0‘便返回当前结果。

4.2 数组名称传参问题

[分析] 通过传递数组名称参数到子函数来求数组长度的办法不可行,该数组会退化为一个指针,获取到的是一个指针的长度。

[解决方案]如果想多次获取不同数组的长度,为了避免重复写代码,可利用C++中的template关键词定义一个求数组长度的模板。程序代码如图10所示。

5 结束语

该文总结了C++中获取不同类型数组长度方式,并利用程序实例进行了较为详细的说明,有助于在以后的程序设计过程中熟练地使用数组解决相关问题。C++语言编程技术作为C语言编程的延伸和发展,能够更好地为计算机编程服务,更好地满足现代化发展需求。在程序设计过程中,利用数组可以实现许多其他高级语言难以实现的功能,其中数组长度更是一大灵活使用点。该文通过实例进行分析与总结,有助于为以后编程打下坚实基础。

参考文献:

[1] 许淑华. C语言中数组应用总结[J]. 科技广场, 2011, 12(3): 254-256.

[2] 沈慧娟, 吴晓英. C++中指针与数组间关系探秘[J]. 信息技术与信息化, 2017, 12(4): 131-133.

[3] 郑莉. C++语言程序设计[M]. 北京: 清华大学出版社, 2010.

[4] 李文明, 陳哲, 李绪蓉. C程序数组越界的运行时验证技术研究与实现[J]. 计算机工程与应用, 2015, 5(11): 190-195.

[5] 王文龙. JAVA和C++实现面向对象方法的分析研究[J]. 喀什大学学报, 2017, 5(7): 56-59.

猜你喜欢

数组语言
JAVA稀疏矩阵算法
JAVA玩转数学之二维数组排序
让语言描写摇曳多姿
多向度交往对语言磨蚀的补正之道
辨析指针数组与数组指针
Excel数组公式在林业多条件求和中的应用
累积动态分析下的同声传译语言压缩
寻找勾股数组的历程
论语言的“得体”