C++/阵列
你可以将阵列想像成是一连串的箱子,里面都放了数字。
简介
[编辑]阵列与一般变数的差别在于,阵列在记忆体中的位置是连续的。
位置 | A0FF10 | A0FF11 | A0FF12 | A0FF13 | A0FF14 |
变数 | a
|
b
|
c
| ||
值 | 0 | 1 | 2 |
位置 | 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,以此类推。
※指派初始值时要用花括号括住,并以逗号分隔。
如果不想要将每个索引指派值可以用, ,
(空)或用NULL
、nullptr
或建构子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};
读写
[编辑]其馀部分皆一样,除了需要注意最右边的是第一个维度。
多维阵列
[编辑]你甚至可以使用更多维的阵列,都与上面的方法相同,最重要的还是最右边的是第一个维度。