作者LoganChien (简子翔)
看板b97902HW
标题[计程] 阵列简介
时间Wed Oct 1 18:08:08 2008
前言
为什麽要打这一篇呢?因为我做
单班计程 HW 1-2 的时候想不出
不用阵列的方法,又听说还没有讲过阵列,所以稍微讲解一下阵列
要怎麽用。
阵列简介
我们可以先把阵列想像成表格的储存格,每一个储存格可以存一个
数值/元素。拿 int 为例子,
int array[5];
就是宣告一个有五个储存格的表格,每一个储存格可以存放一个
int。
而每一个储存格都有一个索引,从前面开始,依序为 0, 1, 2, 3,
4。如果我要存取第一个储存格,我就必需要用
array[0]
我们来看下面的表格:
array =
0 1 2 3 4 <= 这就是索引
┌───┬───┬───┬───┬───┐
│7689 │2348 │8608 │90 │1 │<= 这是储存格(元素)
└───┴───┴───┴───┴───┘
如果我 printf("%d", array[0]) 会印出 7689,如果我要印其他的
值,则用法如下:
printf("%d", array[1]); // 2348
printf("%d", array[2]); // 8608
其余请自行类推。
阵列宣告
阵列的宣告,原则上是
元素型别 阵列名称 [ 阵列大小 ] ;
*
元素型别 可以是 char, short, int, long, float, double,
long double 族繁不及备载。
*
阵列名称 必需是
合法的 C 语言变数名称。
也就是满足以下的正
规表达示。/[A-Za-z_]+[A-Za-z0-9_]*/
*
阵列大小 是你想要的大小,也就是有多小储存格。
注意:最大的
索引会比这一个值少 1。
例如:
int a[10];
float b[2];
char c[1234];
还有一些阵列宣告的变化型。我们可以在宣告阵列的时候,同时加上
初始值,方法如下:
元素型别 阵列名称 [ 阵列大小 ] = { 元素0, 元素1, .... };
例如:
int array[5] = {1, 2, 4, 8, 16};
会让我们有:
array =
0 1 2 3 4 <= 这就是索引
┌───┬───┬───┬───┬───┐
│1 │2 │4 │8 │16 │<= 这是储存格(元素)
└───┴───┴───┴───┴───┘
如果你有加上初始值,最左边的维度可以省略(编译器会帮我们算出
来),如下:
int array[] = {1, 2, 4, 8, 16, 32};
等价
int array[6] = {1, 2, 4, 8, 16, 32};
阵列元素的存取
如果要存取单一个元素,你可以用下标运算子(subscript),也就是在
阵列名字之後加上 [],例如:
int array[5] = {1, 2, 4, 8, 16};
array[0] == 1
array[1] == 2
array[2] == 4
array[3] == 8
array[4] == 16
如果要印出来,可以配合 for 来使用。
for (i = 0; i < 5; ++i) {
printf("%d\n", array[i]);
}
如果要当成输入,也是一样,
for (i = 0; i < 5; ++i) {
scanf("%d", &(array[i]));
}
如果我们要改其中的一个值,就像用一般的变数一样。例如
array[3] = 12345;
而如果要 复制 一个阵列,我们必需一个元素一个元素去改,
如下,不可以直接指派:
int array2[5];
int i;
for (i = 0; i < 5; ++i) {
array2[i] = array[i];
}
阵列的常见错误
<错> 阵列指派(Assign)
int array[5] = {1, 2, 4, 8, 16};
int array2[5] = array; /* 错!错!错!错!错!没有这种写法 */
这一个当然也错:
int array[5] = {1, 2, 4, 8, 16};
int array2[5];
array2 = array;
<错> 溢位(通常可以正常编译,不过会「本程式即将要关闭」或 RE)
int array[5] = {1, 2, 4, 8, 16};
int i;
for (i = 1; i <= 5; ++i) {
printf("%d\n", array[i]);
}
<错> 动态的阵列大小
int size;
scanf("%d", &size);
int array[size];
......
结语
这一次阵列暂时介绍到这里,有机会再向大家介绍其他阵列还有
指标的用法。如果这一篇文有错,还请大家指教。
还有,我想问:钢弹在哪里?这不是钢弹,这不是钢弹...
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.112.241.166
※ 编辑: LoganChien 来自: 140.112.241.166 (10/01 18:38)
1F:推 hrs113355:大大风范>///< 10/01 18:40
2F:推 iForests:好文推,没有阵列应该解不了第二题 10/01 20:34
3F:推 enhuang:收精华了啦 10/01 21:37
4F:推 jimmyken793:别急 钢弹蛋蛋快要开拨了 10/01 21:42
5F:推 ming1053:C好像不能compile用变数当大小宣告的array ... 10/01 22:34
※ 编辑: LoganChien 来自: 140.112.241.166 (10/01 22:39)
6F:→ LoganChien:我把它改得明显一点了。 10/01 22:40
7F:→ martinku:可是我编译没问题ㄟXD~到底是怎麽回事..... 10/01 23:25
8F:→ LoganChien:1. 有可能是 编译器 的 bonus, 它会处理 10/01 23:29
9F:→ LoganChien:2. 可能编译器随便代入一个数字 10/01 23:29
10F:推 ming1053:Dev-C++会用g++来compile吧 gcc就不会过了... 10/01 23:29
11F:→ ming1053:因为那在C++里面是可以的 10/01 23:30
12F:→ LoganChien:至於是哪一种,我们需要强者来反组译! 10/01 23:30
13F:推 jimmyken793:Dev C++是看副档名的 你副档名要存成 .c才会用gcc 10/01 23:34
14F:→ martinku:我是这样写然後上传批改娘过了XD 10/01 23:40
15F:→ LoganChien:gcc 也会过,而且我高度怀疑是 gcc 的 extension。 10/01 23:41
16F:推 pangfeng:好文. 10/01 23:42
18F:→ LoganChien:不过我个人不鼓励使用这一种写法,除非你的环境永远是 10/01 23:49
19F:→ LoganChien:GCC or Standard C99 10/01 23:49
20F:→ ming1053:可以补一下归零的方法 10/01 23:53
21F:→ martinku:批改娘能过还奇妙的 10/02 00:04
22F:→ LoganChien:To Ming1053, 我写到下一集好了,字串、多维阵列、秘密 10/02 00:07
23F:→ LoganChien:To Martinku, 批改娘我猜是 GCC,而且也可以用 C99。 10/02 00:08
24F:推 ckclark:/usr/bin/gcc-3.4 -c -std=c99 -Wall -fno-builtin -O1 10/02 00:09
25F:推 hrs113355:归零用memset... 10/02 00:15
26F:推 ming1053:楼上好用的奥步XD 10/02 00:43
27F:推 hrs113355:快又有效XD 10/02 00:49
28F:推 anfranion:memset()用来归零可以 其他的就不一定了XD 10/02 00:51
29F:推 ckclark:还可以归-1 XD 10/02 00:54
30F:推 sa072686:还可以设不小的数(归infinity?XD) 10/02 01:08
31F:推 hrs113355:还可以归心似箭 10/02 01:08
32F:推 averangeall:还可以归苓膏 10/02 01:11
33F:→ LoganChien:我想出 HW 1-2 不用阵列的方法了,现在才想出来,OTZ。 10/03 00:46
34F:推 Poplarysl:我写出来了XD 一千多行囧RZ 10/03 17:31
35F:→ Poplarysl:助教说他写大概一百多行吧~ 10/03 17:32
36F:→ Poplarysl:是顶多啦 实际怎样就不知道了!! 10/03 17:32
37F:→ LoganChien:刚才我试了一下我的想法,没有问题,49 行。 10/03 23:29
38F:→ LoganChien:提示:小於等於 5 的非负有理数是 6 个。另外,会用到 10/03 23:30
39F:→ LoganChien:for, switch, if 10/03 23:31