极客大学小马哥的项目实战训练营

在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必需。规定值。
  

输出aaaaaabbbbbb


    $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说明为

你可能感兴趣的:(架构)