假设你要存 5 个学生的成绩,不用数组的话你得写:
int score0, score1, score2, score3, score4;
5 个还好,100 个呢?数组就是解决这个问题的。
声明一个数组
int score[5];
这行代码声明了一个能存 5 个 int 的数组,名字叫 score。
方括号里的数字是元素个数,不是最大下标。这点很多人一开始搞混。
下标从 0 开始
数组的第一个元素是 score[0],最后一个是 score[4],不是 score[5]。
#include <stdio.h>
int main() {
int score[5];
int i;
score[0] = 90;
score[1] = 85;
score[2] = 78;
score[3] = 92;
score[4] = 66;
for (i = 0; i < 5; i++) {
printf("score[%d] = %d\n", i, score[i]);
}
return 0;
}
在 VS2013 里按 F5,输出从 score[0] 到 score[4] 依次打印。
声明时直接赋初值
int score[5] = {90, 85, 78, 92, 66};
花括号里按顺序给值,比一行行赋值省事。
如果花括号里的值比元素个数少,剩下的自动补 0:
int score[5] = {90, 85}; /* score[2]、score[3]、score[4] 都是 0 */
VS2013 的限制:数组长度必须是常量
VS2013 不支持 C99 的可变长数组(VLA),数组长度必须是编译时就确定的常量,不能是变量:
int n = 5;
int score[n]; /* VS2013 报错:error C2057 */
要用固定长度,或者用 #define 定义一个常量:
#define MAX 5
int score[MAX]; /* 正确 */
最容易踩的坑:越界访问
int score[5];
score[5] = 100; /* 越界!合法下标是 0~4 */
score[5] 已经超出数组边界了,VS2013 编译不报错,但运行时行为不确定——可能改掉其他变量的值,可能直接崩溃,也可能"正常运行"但结果是错的。
这是 C 语言里最难调的一类 bug,因为出问题的地方往往不是越界那行,而是后面的某行代码。
自己试一下
声明一个长度为 10 的 int 数组,用 for 循环把 1 到 10 存进去,再用另一个 for 循环打印出来。在 VS2013 里验证输出。

3161

被折叠的 条评论
为什么被折叠?



