一维数组只有一个下标,称为一维数组,其数组元素也称为单下标变量。
顾名思义,二维数组有两个下标。
也可以理解为二维数组代表着两个维度,横轴和纵轴,像一个矩阵。
int str[i][j];
i代表行,j代表列
比如说写一个成绩单,就可以使用二维数组。
str [0][0] = 80;
- 类型说明符 数组名 [常量表达式 1] [常量表达式 2];
int a[6][6];// 6*6 6行6列
char b[5][4];// 5*4 5行4列
double c[8][6];// 8*6 8行6列
在 C语言中,二维数组是按行排列的,即按行顺序存放,先存放 a[0] 行,再存放 a[1] 行,接着存放 a[2] 行。每行有 3 个元素,也是其依次存放的。
二维数组元素的引用一般形式如下:
- 数组名[下标][下标];
说明:二维数组的下标可以是 整形常量 或 整形表达式。
a[4][3];//访问的是a数组中5行4列的元素
b[0][0];//访问的是b数组中1行1列的元素
c[2][4];//访问的是a数组中3行5列的元素
这里是引用
注意:不管是 行下标 还是 列下标,其中的索引值都是从 0 开始的。
注意:和一维数组是一样的,我们都需要注意下标越界的问题。
下标变量和数组说明在形式中有些相似,但这两者具有完全不同的含义。数组说明的方括号中给出的是某一维的长度,即可取下标的最大值;而数组元素中的下标是该元素在数组中的位置标识。前者只能是常量,后者可以是常量,变量或表达式。
因为二维数组在内存中的存放是线性的,因此可以将所有数值放入花括号内
例如:
int a[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };
为了更直观表示元素分布,可以用大括号将每一行元素括起来。
int a[3][4] = { {1,2,3,4},
{5,6,7,8},
{9,10,11,12} };
将他形象的打印下来:
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
int main()
{
int a[3][4] = { {1,2,3,4},
{5,6,7,8},
{9,10,11,12} };
int i, j;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 4; j++)
{
printf(" %d ", a[i][j]);
}
putchar('\n');
}
return 0;
}
运行如下
注:在 putchar(‘\n’)和printf(“\n”)的效果是一样的。但一个是单引号,一个是双引号
二维数组也可以对部分元素初始化。
未赋值的元素自动取"0"值。
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
int main()
{
int a[3][4] = { {1},{5},{9} };
int i, j;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 4; j++)
{
printf(" %d", a[i][j]);
}
putchar('\n');
}
return 0;
}
如果希望整个二维数组初始化为0,在大括号内写一个0即可。
int a[3][4] = {0};
C99也增加了一种新的特性:指定初始化 的元素。这样就可以对某个指定元素进行初识化赋值,而未被初始化的元素依旧是0
int a[3][3] = {[0][0] = 1,[1][1] = 2,[2][2] = 3}
如果对全部元素赋值,那么第一维的长度可以不给出。例如:
int arr[][3] = {{1,2,3},{2,3,4},{3,4,5}};
注意:行 是可以进行省略的,但是 列 不能进行省略。
这里是引用
#define _CRT_SECURE_NO_WARNINGS
#include
int main()
{
int i, j; //二维数组下标
int sum = 0; //当前科目的总成绩
int average; //总平均分
int v[3]; //各科平均分
int a[3][5]; //用来保存每个同学各科成绩的二维数组,三门学科,五个同学。
printf("请输入各科学生的成绩:\n");
for (i = 0; i < 3; i++)
{
printf("\n一门学科输入5次成绩\n");
if (i == 0)
printf("数学学科:");
if (i == 1)
printf("语文学科:");
if (i == 2)
printf("英语学科:");
for (j = 0; j < 5; j++)
{
scanf("%d", &a[i][j]); //输入每个同学的各科成绩
sum += a[i][j]; //计算当前科目的总成绩(sum)
}
v[i] = sum / 5; // 当前科目的平均分,用总的成绩除以5
sum = 0; // 把当前科目总成绩清0,为下一次计算做准备
}
average = (v[0] + v[1] + v[2]) / 3;
printf("\n数学平均分: % d\n语文平均分 : % d\n英语平均分 : % d\n", v[0], v[1], v[2]);
printf("平均分: %d\n", average);
return 0;
}
运行如下
想把平均分打印在学科分的下面,但是运行起来有问题。大佬们帮忙改改。
#define _CRT_SECURE_NO_WARNINGS
#include
int main()
{
int i, j;
int ayerage;
int sum = 0;
int a[3][5];
int v[3];
for (i = 0; i < 3; i++)
{
printf("请输入学科成绩5次\n");
if (i == 0)
printf("数学成绩:");
if (i == 1)
printf("语文成绩:");
if (i == 2)
printf("英语成绩:");
for (j = 0; j < 5; j++)
{
scanf("%d", a[i][j]);
sum += a[i][j];
v[i] = sum / 5;
if (i == 0)
printf("\n数学平均分:%d\n",v[i]);
if (i == 1)
printf("\n语文平均分:%d\n", v[i]);
if (i == 2)
printf("\n英语平均分:%d\n", v[i]);
}
sum = 0;
}
sum += v[i];
average = sum / 3;
printf("\n总平均分为:%d", average);
return 0;
}