文章目录
一.认识二维数组
二.二维数组基本操作
三.二维数组操作字符串
前言
二维数组本质上是以数组作为数组元素的数组,即“数组的数组”,类型说明符 数组名[常量表达式][常量表达式]。二维数组又称为矩阵,行列数相等的矩阵称为方阵。对称矩阵a[i][j] = a[j][i],对角矩阵:n阶方阵主对角线外都是零元素。
例如:
float a[3][4],b[5][10];
定义a为3*4(3行4列)的数组,b为5*10(5行10列)的数组。
注意,不能写成
float a[3,4],b[5,10];
一.认识二维数组
- 如何创建二维数组
//NO.1 如何创建二维数组,固定语法: 类型 数组名[数组长度1][数组长度2];
int array[3][2];
//数组长度1: 3-->行
//数组长度2: 2-->列
//总元素个数:数组长度1*数组长度2
//最大下标是: 数组名[数组长度1-1][数组长度2-1] array[2][1]
- 在内存上的长相
二.基本操作
- 数组的初始化
//No.1 完整初始化
int array1[2][2]={1,2,3,4};
//No.2 默认初始化
int array2[2][2]={1,2};
//No.3 带{}默认初始化 ,一个{}代表一行
int array3[3][4]={{1},{2},{3}}; //第一行第一个元素:1,第二个第一个元素:2,第三行第一个元素:3
//No.4 数据完整初始化,数组长度行可以不写
int array[][3]={1,2,3,4,5,6,7,8,9}; //自动推导数组长度行是:3
- 行列数据的操作
- 行求和
- 列求和
#include <stdio.h>
int main()
{
int array[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };
int rowSum[3] = { 0 };
int colsSum[4] = { 0 };
//求一行的和
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 4; j++)
{
rowSum[i] += array[i][j];
}
}
//求一列的和
for (int j = 0; j < 4; j++)
{
for (int i = 0; i < 3; i++)
{
colsSum[j] += array[i][j];
}
}
- 二维数组充当地图
#include<stdio.h>
int main()
{
//特定数组表示特定含义
int map[8][8] =
{
1,1,1,1,1,1,1,1,
1,0,1,1,1,0,1,1,
1,0,1,1,1,0,1,1,
1,0,1,1,1,0,1,1,
1,0,0,0,0,0,1,1,
1,1,1,0,1,1,1,1,
1,1,1,0,1,1,1,1,
1,1,1,1,1,1,1,1
};
for (int i = 0; i < 8; i++)
{
for (int j = 0; j < 8; j++)
{
switch (map[i][j])
{
case 0: //if(map[i][j]==0)
printf("★"); //一个汉子字符占用两个位置
break;
case 1: //if(map[i][j]==1)
printf(" "); //两个空格
break;
}
}
printf("\n");
}
return 0;
}
- 矩阵变化
三.二维数组操作字符串
#include <stdio.h>
#include <string.h>
int main()
{
//No.1 二维字符数组一般是用来存储多个字符串
char str[4][20] = { {"1ILoveyou"},{"3IMiss"},{"2我想吃饭"}, {"8我不知道说什么"} };
// //可以两个下标访问(和数字类的二维数组一样的使用方式),但是很少这样去用
//No.3 排序
char temp[20] = { "" };
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4 - 1 - i; j++)
{
if (strcmp(str[j],str[j+1])>0) //字符串比较也不能直接比较,必须要strcmp
{
//注意点:字符串不能用赋值的方式使用,拷贝操作必须用strcpy
strcpy_s(temp, 20, str[j]);
strcpy_s(str[j], 20, str[j + 1]);
strcpy_s(str[j + 1], 20, temp);
}
}
}
printf("%c\n", str[0][0]);
//No.2 数组名[下标]: 表示每一行的首地址
for (int i = 0; i < 4; i++)
{
puts(str[i]);
}
printf("请输入四个字符串:");
for (int i = 0; i < 4; i++)
{
scanf_s("%s", str[i], 20);
}
for (int i = 0; i < 4; i++)
{
printf("%s\n", str[i]);
}
return 0;
}
总结
- 对二维数组的形象印记,特殊的一维数组;
- 二维数组的定义:数据类型 数组名 参数1参数2;
-
二维数组的传参:回忆一维数组,在写功能函数的时候我们用如下形式
void Fun (int *arr, 其他参数)
在主函数我们给他传递参数的时候我们用如下形式;
Fun(arr,其他参数);
在一维数组中,写他的功能函数时,我们用指针将数组首元素地址的首地址传递给形参。
我们来看二维数组的传参:
在写功能函数的时候,我们用如下形式;
void Fun(int (*brr)[列参数],其它参数)
在主函数调用时,我们用如下形式
Fun(brr,其它参数);
我们发现在调用有二维数组的函数时我们的形式和一维数组看起来是一样的;
我们主要看形参的这一句:(*brr)[列参数],我们上面说吧二维数组看作是列个一维数组,所以这里我们先将数组的第一行这个“一维数组”整体用指针传递,在将列传递,这就完成了二维数组的传参。
-
二维数组的输出:
#include<stdio.h>
int main()
{
int arr[2][3] = {
1,2,3,
4,5,6
};
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 3; j++)
{
printf("%d ", arr[i][j]);
}
}
return 0;
}