在 C 语言中,数组 [2] 属于结构数据类型。一个数组能够合成为多个数组元素,这些数组元素能够是根本数据类型或是构造类型。因而按数组元素的类型不同,数组又可分为数值数组、字符数组、指针数组、构造数组等各种类别。
对于可变长数组(VLA)的问题:原来的 C89 规范中是不容许可变长数组呈现的,然而在 C99 规范中,退出了对 VLA 的反对 [3],然而反对的编译器不多,而且因为栈溢出的平安问题,没有太多的人敢用这个可变长数组,所以在 C11 规范中又把它规定为可选实现的性能了[4]。
如果有过用其它语言编程的经验,那么想必会相熟数组的概念。因为有了数组,能够用雷同名字援用一系列变量,并用数字(索引)来辨认它们。在许多场合,应用数组能够缩短和简化程序,因为能够利用索引值设计一个循环,高效解决多种状况。数组有上界和下界,数组的元素在高低界内是间断的。因为 Visual Basic 对每一个索引值都调配空间,所以不要不切实际申明一个太大的数组。
此处数组是程序中申明的变量数组。它们不同于控件数组,控件数组是在设计时通过设置控件的 Index 属性规定的。变量数组总是间断的;与控件数组不同的是,不能从一个数组的中部加载或卸载数组元素。
一个数组中的所有元素具备雷同的数据类型(在 C、C++、Java、pascal 中都这样。但也并非所有波及数组的中央都这样,比方在 Visual Foxpro 中的数组就并没这样的要求)。当然,当数据类型为 Variant 时,各个元素可能蕴含不同品种的数据(对象、字符串、数值等等)。能够申明任何根本数据类型的数组,包含用户自定义类型和对象变量。
如果要用户输出的是一个数组,个别是用一个循环,然而在输出前也须要固定数组的大小。
compact 跟变长数组没有太大的关系,也应该用不到变长数组。因为个别的传数组到函数中就是传数组的地址和元素的个数的,那只是一个提醒,不是要求。
原型能够这样写(假如数组的元素是 type):
int compact(type *Array,int Count)
数组类型阐明 在 C 语言中应用数组必须先进行类型阐明。
数组阐明的个别模式为:类型说明符 数组名 [常量表达式],……;其中,类型说明符是任一种根本数据类型或结构数据类型。数组名是用户定义的数组标识符。方括号中的常量表达式示意数据元素的个数,也称为数组的长度。
数组就是一次性定义雷同数据类型的一组变量数组定义。
举例
阐明整型数组 a,有 10 个元素。若要示意第 10 个元素,则应用 a[9]。第一个则是 a[0]。
int a[10];
阐明实型数组 b,有 10 个元素,实型数组 c,有 20 个元素。
float b[10],c[20];
阐明字符数组 ch,有 20 个元素。
char ch[20];
特点
1. 数组是雷同数据类型的元素的汇合。
2. 数组中的各元素的存储是有先后顺序的,它们在内存中依照这个先后顺序间断寄存在一起。
3. 数组元素用整个数组的名字和它本人在数组中的程序地位来示意。例如,a[0] 示意名字为 a 的数组中的第一个元素,a[1]代表数组 a 的第二个元素,以此类推。
对于 VB 的数组,示意数组元素时应留神:
1 下标要紧跟在数组名后,而且用圆括号括起来(不能用其余括号)。
2 下标能够是常量,变量,或表达式,但其值必须是整数(如果是小数将四舍五入为整数)。
3 下标必须为一段间断的整数,其最小值成为下界,其最大值成为上界。不加阐明时下界值默认为 1。
数组中的元素
与构造或类中的字段的区别
数组中的所有元素都具备雷同类型(这一点和构造或类中的字段不同,它们能够是不同类型)。数组中的元素存储在一个连续性的内存块中,并通过索引来拜访(这一点也和构造和类中的字段不同,它们通过名称来拜访)。[1]
类型
数组元素并非只能是基元数据类型,还能够是构造、枚举或类。[1]
构造模式
栈内存
在办法中定义的一些根本类型的变量和对象的援用变量都在办法的栈内存中调配,当在一段代码中定义一个变量时,java 就在栈内存中为这个变量分配内存空间,当超出变量的作用域后,java 会主动开释掉为该变量所调配的内存空间。
堆内存
堆内存用来寄存由 new 运算符创立的对象和数组,在堆中调配的内存,由 java 虚拟机的主动垃圾回收器来治理。在堆中创立了一个数组或对象后,同时还在栈内存中定义一个非凡的变量。让栈内存中的这个变量的取值等于数组或者对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的援用变量,援用变量实际上保留的是数组或对象在堆内存中的地址(也称为对象的句柄),当前就能够在程序中应用栈的援用变量来拜访堆中的数组或对象。[5]
与构造或类中的字段的区别
数组中的所有元素都具备雷同类型 (这一点和构造或类中的字段不同,它们能够是不同类型)。数组中的元素存储在一个连续性的内存块中,并通过索引来拜访(这一点也和构造和类中的字段不同,它们通过名称来拜访)。[1]
相干操作
申明固定大小的数组
有三种办法申明固定大小的数组,用哪一种办法取决于数组应有的无效范畴:
(1)建设专用数组,在模块的申明段用 Public 语句申明数组。
(2)建设模块级数组,在模块的申明段用 Private 语句申明数组。
(3)建设部分数组,在过程中用 Private 语句申明数组。
设定上下界
申明数组时,在数组名之后跟一个用括号括起来的上界。
上界不得超过 Long 数据类型的范畴(-2,147,483,648 到 2,147,483,647)。
例如,下列数组申明可呈现、在模块的申明段:
Dim Counters(14)As Integer ’15 个元素。
Dim Sums(20)As Double ’21 个元素。
为建设专用数组,间接用 Public 取代 Dim。
Public Counters(14)As Integer
Public Sums(20)As Double
在过程之中同样的申明应用 Dim:
Dim Counters(14)As Integer
Dim Sums(20)As Double
第一个申明建设了一个有 15 个元素的数组,其索引号从 0 到 14。
第二个申明建设了一个有 21 个元素的数组,其索引号从 0 到 20。缺省的下界为 0。
为了规定下界,用关键字 To 显式提供下界(为 Long 数据类型):
Dim Counters(1 To 15)As Integer
Dim Sums(100 To 120)As String
在前述申明中,Counters 的索引值范畴从 1 到 15,而 Sums 的索引值范畴从 100 到 120。
蕴含其它数组的数组
有可能建设 Variant 数据类型数组,并与不同数据类型的数组共居一处。
以下代码建设两个数组,一个蕴含整数,而另一个蕴含 字符串。而后申明第三个 Variant 数组,并将整数和字符串数组搁置其中:
Private Sub Command1_Click ()
Dim intX As Integer 申明计数器变量。
申明并搁置整数数组。
Dim countersA(5)As Integer
For intX = 0 To 4
countersA (intX) = 5
Next intX
申明并搁置字符串数组。
Dim countersB(5)As String
For intX = 0 To 4
countersB (intX) = “hello”
Next intX
Dim arrX(2)As Variant 申明领有两个成员的新数组。
arrX(1)= countersA () 将其它数组移居到数组。
arrX(2)= countersB ()
MsgBox arrX(1)(2)显示每一个数组的成员。
MsgBox arrX(2)(3)
End Sub
php 数组的定义、调用和批改
array() 创立数组,带有键和值。如果在规定数组时省略了键,则生成一个整数键,这个 key 从 0 开始,而后以 1 进行递增[6]。
要用 array() 创立一个关联数组,可应用 => 来分隔键和值。
语法
array(key => value)
参数 key 可选。规定 key,类型是数值或字符串。如果未设置,则生成整数类型的 key。
value 必须。规定值。
<h3><font color=”#CC6600″> 输入 aaaaaabbbbbb</font></h3>
<?php
$array = array(“key1” => “aaaaaa”, 2 => “bbbbbb”); // 数组的创立
echo $array[“key1”]; // 输入 aaaaaa
echo $array[2]; // 输入 bbbbbb
?>
遍历数组
C# 提供了 foreach 语句来遍历数组的所有元素。[7]
int[] arr = { 1, 2, 4, 5, 9, 7, 13};
foreach(int a in arr)
{
Console.WriteLine(a);
}
数组类型
多维数组
有时须要追踪记录数组中的相干信息。
例如,为了追踪记录计算机屏幕上的每一个像素,须要援用它的 X、Y 坐标。这时应该用多维数组存储值。
可用 Visual Basic 申明多维数组。
例如,上面的语句申明了一个过程内的 10 × 10 的二维数组。
Static MatrixA(9,9)As Double
可用显式下界来申明两个维数或两个维数中的任何一个:
Static MatrixA(1 To 10,1 To 10)As Double
能够将所有这些推广到二维以上的数组。例如:
Dim MultiD(3,1 To 10,1 To 15)
这个申明建设了三维数组,大小为 4 × 10 × 15。元素总数为三个维数的乘积,为 600。
留神
在减少数组的维数时,数组所占的存储空间会大幅度减少,所以要慎用多维数组。应用 Variant 数组时更要分外小心,因为他们须要更大的存储空间。
用循环操作数组
能够用 For 循环嵌套无效的解决多维数组。例如,在 MatrixA 中基于每个元素在数组中的地位为其赋值:
Dim I As Integer,J As Integer
Static MatrixA(1 To 10,1 To 10)As Double
For I = 1 To 10
For J = 1 To 10
MatrixA (I,J) = I * 10 + J
Next J
Next I
一维数组
定义
一维数组是最简略的数组,其逻辑构造是线性表。要应用一维数组,需通过定义、初始化和利用等过程。
数组申明
在数组的申明格局里,“数据类型”是申明数组元素的数据类型,能够是 java 语言中任意的数据类型,包含简略类型和构造类型。“数组名”是用来对立这些雷同数据类型的名称,其命名规定和变量的命名规定雷同。
数组申明之后,接下来便是要调配数组所须要的内存,这时必须用运算符 new,其中“个数”是通知编译器,所申明的数组要寄存多少个元素,所以 new 运算符是告诉编译器依据括号里的个数,在内存中调配一块空间供该数组应用。利用 new 运算符为数组元素分配内存空间的形式称为动态分配形式。
举例:
int[]x; // 申明名称为 x 的 int 型数组
x=new int[10]; // x 数组中蕴含有 10 个元素,并为这 10 个元素分配内存空间
在申明数组时,也能够将两个语句合并成一行,格局如下:
数据类型 [] 数组名 = new 数据类型 [个数];
利用这种格局在申明数组的同时,也调配一块内存供数组应用。如下面的例子能够写成:
int[]x = new int [10];
等号右边的 int[]x 相当于定义了一个非凡的变量 x,x 的数据类型是一个对 int 型数组对象的援用,x 就是一个数组的援用变量,其援用的数组元素个数不定。等号左边的 new int[10]就是在堆内存中创立一个具备 10 个 int 型变量的数组对象。int[]x = new int [10]; 就是将左边的数组对象赋值给右边的数组援用变量。[5]
二维数组
定义
后面介绍的数组只有一个下标,称为一维数组,其数组元素也称为单下标变量。在理论问题中有很多量是二维的或多维的,因而 C 语言容许结构多维数组。多维数组元素有多个下标,以标识它在数组中的地位,所以也称为多下标变量。本大节只介绍二维数组,多维数组可由二维数组类推而失去。二维数组类型阐明的个别模式是:
类型说明符数组名常量表达式 1…;
其中常量表达式 1 示意第一维下标的长度,常量表达式 2 示意第二维下标的长度。例如:
int a3; 阐明了一个三行四列的数组,数组名为 a,其下标变量的类型为整型。该数组的下标变量共有 3×4 个,即:
a0,a0,a0,a0
a1,a1,a1,a1
a2,a2,a2,a2
二维数组在概念上是二维的,即是说其下标在两个方向上变动,下标变量在数组中的地位也处于一个立体之中,而不是象一维数组只是一个向量。然而,理论的硬件存储器却是间断编址的,也就是说存储器单元是按一维线性排列的。如何在一维存储器中寄存二维数组,可有两种形式:一种是按行排列,即放完一行之后依次放入第二行。另一种是按列排列,即放完一列之后再依次放入第二列。在 C 语言中,二维数组是按行排列的。在如上中,按行依次寄存,先寄存 a[0]行,再寄存 a[1]行,最初寄存 a[2]行。每行中有四个元素也是顺次寄存。因为数组 a 阐明为