二维数组
数组中的每一个元素又是一个数组, 那么这个数组就称之为二维数组。
元素类型 数组名称[一维数组的个数][每个一维数组的元素个数];
元素类型 数组名称[行数][列数];
元素类型: 说明二维数组中每个一维数组存储什么类型的数据
一维数组的个数: 说明二维数组有多少个元素
每个一维数组的元素个数 : 说明二维数组中每一个一维数组的元素个数
char names[2][3] =
{
// 0 1 2
{'l', 'n', 'j'}, // 0
{'x', 'm', 'g'} // 1
};
如何获取二维数组中的一维数组的元素的值
printf("%c\n", names[0][1]);
如何遍历二维数组
for (int i = 0; i < 2; i++) { // 0 , 1
// 1.取出一维数组
// names[i];
for (int j = 0; j < 3; j++) { // 0 , 1 , 2
printf("name[%i][%i] = %c\n", i, j, names[i][j]);
}
}
注意:二维数组的多种初始化方式(不强记,用到的时候可以去搜)
二维数组与函数
同样的,数组的名称就是数组的地址。
&nums == nums == &nums[0]
char names[2][3] =
{
{'l', 'n', 'j'},
{'x', 'm', 'g'}
};
// &names == names == &names[0] , names就是数组的地址
printf("&names = %p\n", &names);
printf("names = %p\n", names);
printf("&names[0] = %p\n", &names[0]);
二维数组名称作为函数参数传递, 传递的也是地址。
比如,
1、执行如下函数
change2(names);
printf("names[0][0] = %c\n", names[0][1]);
void change2(char values[2][3])
{
values[0][1] = 'w';
printf("我执行了\n");
}
将会输出
我执行了
names[0][1] = w
2、执行
change3(names[0]);
printf("names[0][0] = %c\n", names[0][0]);
void change3(char values[])
{
values[0] = 'Q';
printf("我执行了\n");
}
注意:以后只要看到函数的参数是一个数组, 那么就是地址传递
将会输出:
我执行了
names[0][0] = Q
注意:names[0][0] == 一维数组的一个元素 == 值
names[0] == 一维数组
3、执行
change4(names[0][0]);
printf("names[0][0] = %c\n", names[0][0]);
/ 参数为基本数据类型
void change4(char value)
{
value = 'E';
printf("我执行了\n");
}
输出为:
我执行了
names[0][0] = l
因为change4传入的是基本数据类型,不是数组,所以也不会改变原数组的值。