跳转到内容

C++/阵列

维基教科书,自由的教学读本
< C++

你可以将阵列想像成是一连串的箱子,里面都放了数字。

简介

[编辑]

阵列与一般变数的差别在于,阵列在记忆体中的位置是连续的。

记忆体 int a = 0, b = 1, c = 2;
位置 A0FF10 A0FF11 A0FF12 A0FF13 A0FF14
变数 a b c
0 1 2
记忆体 int i = {0, 1, 2, 3, 4};
位置 A0FF10 A0FF11 A0FF12 A0FF13 A0FF14
变数 i[0] i[1] i[2] i[3] i[4]
0 1 2 3 4

使用

[编辑]

建立

[编辑]
int i[5];

这表示建立一个叫做i且长度5的整数(一维)阵列。另外,阵列也可以使用各种修饰词,例如const(常数),参见下面的〈指派初始值〉。

※在建立阵列时,必须设定其长度,换言之,不能使用int i[];,否则电脑将不知道要分配多少空间。

初始化

[编辑]
int i[5] = {0, 1, 2, 3, 4};

这样可以指派第一个位置为0,第二个为1,以此类推。

※指派初始值时要用花括号括住,并以逗号分隔。


如果不想要将每个索引指派值可以用, ,(空)或用NULLnullptr建构子int()

int i[5] = {0, 1, , 3, 4};
int i[5] = {0, 1, NULL, 3, 4};
int i[5] = {0, 1, nullptr, 3, 4};
int i[5] = {0, 1, int(), 3, 4};

char ch[5] = {'a', 'b', char(), 'd', 'e'};

可以看到,字元类别也可以使用建构子char(),每种型别都有他的建构子,如double()

读写

[编辑]

写入

[编辑]
// 每一段程式碼都是一樣的
int i[5] = {0, 1, 2, 3, 4};

i[0] = 0;
i[1] = 1;
i[2] = 2;
i[3] = 3;
i[4] = 4;

i = {0, 1, 2, 3, 4};

可以看到阵列写入值与一般变数更改值并无差别。值得注意的是,当你使用中间的方法时要使用的运算子是[](阵列存取运算子),并在里面置入索引值。

读取

[编辑]
int i[5] = {0, 1, 2, 3, 4};
int a = i[0];

读取时,并没有差别,因为它都代表同一个位置,只是它是在赋值运算子左边,代表得到值的对象(写入);或是在右边,代表给出值的对象(读取)差别而已。

※第一个索引值是0。

[编辑]

这是有原因的,毕竟“第零个”本来就很怪,发明C++的人也不想这样。

底下是记忆体空间的一部分,在执行了一段程式码后。

int i[5] = {0, 1, 2, 3, 4};
记忆体
位置 A0FF10 A0FF14 A0FF18 A0FF22 A0FF26
0 1 2 3 4
表示(使用[] i[0] i[1] i[2] i[3] i[4]
表示(实际上) *(i+0) *(i+1) *(i+2) *(i+3) *(i+4)

所以,会有[0]就是因为它是加0个位置,[1]就是后面1个位置,以此类推。

复制

[编辑]

如果要将一阵列复制给另一个阵列,不能像下面这样直接指派,这是一般变数的作法。

copy = i;

所以必须把它当做一般循环变数处理,像这样:

for(int j=0; j<sizeof(i)/sizeof(int); j++) {
    copy[j] = i[j];
}

进阶

[编辑]

二维阵列

[编辑]

前面的一维阵列是一条直线,二维阵列则可以想像成是一个矩形。

一维阵列
[0] [1] [2] [3] [4]
二维阵列
[0][0] [0][1] [0][2] [0][3] [0][4]
[1][0] [1][1] [1][2] [1][3] [1][4]
[2][0] [2][1] [2][2] [2][3] [2][4]
[3][0] [3][1] [3][2] [3][3] [3][4]
[4][0] [4][1] [4][2] [4][3] [4][4]

建立

[编辑]
int i[5][5];

这样可以建立一个5×5的二维阵列,与一维阵列一样,它也可以使用修饰词。

※最右边的是第一个维度。

初始化
[编辑]
int i[5][5] = {{0, 1, 2, 3, 4},
               {5, 6, 7, 8, 7},
               {10, 11, 12, 13, 14},
               {15, 16, 17, 18, 19},
               {20, 21, 22, 23, 24}};

这里的其中一对花括号其实可以不用,但是为了可读性通常还是会加上,下面两段程式是一样的。

int i[3][5] = {{0, 1, 2, 3, 4},
               {5, 6, 7, 8, 9},
               {10, 11, 12, 13, 14}};

int i[3][5] = {0, 1, 2, 3, 4,
               5, 6, 7, 8, 9,
               10, 11, 12, 13, 14};

读写

[编辑]

其余部分皆一样,除了需要注意最右边的是第一个维度

多维阵列

[编辑]

你甚至可以使用更多维的阵列,都与上面的方法相同,最重要的还是最右边的是第一个维度