
🌊用有趣的言语来阐述苦涩难懂的代码世界,让每一个技术都充满风趣!
🔭个人主页: 散峰而望
🚀学习方向: C/C++等方向
📌专栏系列:
💬人生格言: 冀以尘雾之微,补益山海,荧烛末光,增辉岁月。
🎬博主简介



文章目录
- 前言
- [2. 二维数组](#2. 二维数组)
-
- [2.1 二维数组的概念](#2.1 二维数组的概念)
- [2.2 二维数组的创建](#2.2 二维数组的创建)
- [2.3 二维数组的初始化](#2.3 二维数组的初始化)
- [2.4 二维数组的下标](#2.4 二维数组的下标)
- [2.5 二维数组元素的遍历和打印](#2.5 二维数组元素的遍历和打印)
- [2.6 使用 memset 设置二维数组内容](#2.6 使用 memset 设置二维数组内容)
- [2.7 练习](#2.7 练习)
- 结语
前言
上一篇我们详细的介绍了一维数组 从创建到访问打印,以及一些其他函数的运用。接下来这一篇将会对代码中常用的二维数组一一道来,从而让各位更好的掌握这个知识热点。
2. 二维数组
2.1 二维数组的概念
上一篇我们详细的讲解了一维数组,同时了解到数组的元素都是内置类型的,如果我们把一维数组作为数组的元素,这时候的数组就是二维数组 。同理,以二维数组作为元素的数组为三维数组 ,二维数组以上的数组被称为多维数组。

2.2 二维数组的创建
二维数组的语法形式:
cpp
type arr_name[常量值1][常量值2];
//例如:
int arr1[3][2];
char arr2[4][6];
double arr3[5][5];
解释一下上述代码中的一些关键信息:
- 3 表示数组有 3 行
- 2 表示每行有 2 个元素
- int 表示元素的类型
- arr 是数组名,可以根据需要自己设,没有特别要求
2.3 二维数组的初始化
前面我们已经了解在创建变量或数组时,需要给定一些初始值,被称为初始化。
那么二维数组该如何初始化哩?像一维数组一样,使用**大括号{}**初始化。
cpp
//不完全初始化
int arr1[3][4] = {1,2,3};
int arr2[4][6] = {0};
//完全初始化
int arr3[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};
//按行初始化
int arr4[3][4] = {(1,2),(3,4),(5,6)};
//如果数组初始化了,数组在指定大小的时候可以省略行
//但是不能省略列
int arr5[][5] = {1,2,3};
int arr6[][5] = {1,2,3,4,5,6,7};
int arr7[][5] = {(1,2),(3,4),(5,6)};
如果这一块还是搞的不是太清楚可以跳转:基本魔法语言数组 (二)
2.4 二维数组的下标
当我们掌握了二维数组的创建和初始化,那我们应该如何使用二维数组呢?
与一维数组一样,二维数组的访问也是使用下标的形式。二维数组是有行和列,只要锁定了行和列就能锁定数组唯一的元素。
C/C++ 规定,二维数组的行是从 0 开始的,列也是从 0 开始的,如下所示:
cpp
int arr[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};

cpp
#include <iostream>
using namespace std;
int main()
{
int arr[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};
cout << arr[2][4] << endl;
return 0;
}
演示结果:

2.5 二维数组元素的遍历和打印
二维数组和一维数组一样,想要把所有的元素都打印一遍,需要用到循环,唯一不一样的是二维数组比一维数组多一个循环用来打印列。
cpp
#include<iostream>
using namespace std;
int main()
{
int arr[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};
for(int i = 0; i < 3; i++)
{
for(int j = 0; j < 5; j++)
{
cout << arr[i][j] << " ";
}
cout << endl;
}
return 0;
}
演示结果:

2.6 使用 memset 设置二维数组内容
再回顾一下memset 语法:
cpp
void * memset( void * ptr, int value, size_t num);
简单而言,memset 是用来设置二维数组内存的,将其内存的值以字节为单位设置成自己想要的内容。
同时要注意使用 memset 需要包含头文件,头文件为 < cstring >。
下面演示一个例子:
cpp
//整形形式
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
int a[10][10];
memset(a, 0, sizeof(a));
for(int i = 0; i < 10; i++)
{
for(int j = 0; j < 10; j++)
{
cout << a[i][j] << " ";
}
cout << endl;
}
return 0;
}
//字符形式
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
char a[10][10];
memset(a, 'x', sizeof(a));
for(int i = 0; i < 10; i++)
{
for(int j = 0; j < 10; j++)
{
cout << a[i][j] << " ";
}
cout << endl;
}
return 0;
}
演示结果:


2.7 练习
由题目可知我们需要将杨辉三角按照下面的形式进行输出

这里我们来分析一下这些数的下标:

可以看到在数组的第 0 列输入的为 1 ,即若数组名为 arr ,则 arr[i][0] = 1。同时我们又可以发现当 i == j 时,输入的也为 1 ,则 arr[i][j] = 1,当且仅当 i == j 时成立。边上的数我们已经分析好了,接下来来分析中间的部分。根据图我们可以发现 2 是由它正上面的数和正上面左边的数相加得来。则在 i > 1并且 j >= 1 时的元素满足
arr[i][j] = arr[i-1][j-1] + arr[i-1][j]
计算式。之后就是循环嵌套依次输出。同时我们想输出这种梯形形状的图形我们可以根据下标,让 j <= i 时停止就能得到这种梯形图案。
代码如下:
cpp
#include <iostream>
using namespace std;
const int N = 25;
int arr[N][N];
int main()
{
int n = 0;
cin >> n;
for(int i = 0; i < n; i++)
{
for(int j = 0; j <= i; j++)
{
if(j == 0 || i == j)
arr[i][j] = 1;
if(i >= 2 && j >= 1)
arr[i][j] = arr[i-1][j-1] + arr[i-1][j];
cout << arr[i][j] << " ";
}
cout << endl;
}
return 0;
}
那如果我们想要打印出这种的杨辉三角,我们要怎么搞?

这种居中的杨辉三角我们该怎么搞呢?我们发现外围打印 1 的数组下标没有楼梯的那种简单好辨识,而且中间部分的也不能依靠上面的计算式来搞,怎么办哩?
其实很简单,只用在前面加一下空格就行了,其他都不用管。那么需要多少空格哩,我们可以数一数,第一排和最后一排相差 n-1-i 个空格,之后循环就行了。
代码如下:
cpp
#include <iostream>
using namespace std;
const int N = 25;
int arr[N][N];
int main()
{
int n = 0;
cin >> n;
for(int i = 0; i < n; i++)
{
for(int j = 0; j <= n-1-i; j++)
{
cout << " ";
}
for(int j = 0; j <= i; j++)
{
if(j == 0 || i == j)
arr[i][j] = 1;
if(i >= 2 && j >= 1)
arr[i][j] = arr[i-1][j-1] + arr[i-1][j];
cout << arr[i][j] << " ";
}
cout << endl;
}
return 0;
}
演示结果:

- 矩阵交换行
根据题目我们可以知道,我们可以先输出一趟二维数组,然后交换指定的行数

所以先循环输入题目已经明确规定前五行输出矩阵,然后交换指定行数,再输出。
代码如下:
cpp
#include<iostream>
using namespace std;
const int N = 5;
int arr[N][N];
int r1,r2;
int main()
{
int i = 0;
int j = 0;
//输入
for(i = 0; i < N; i++)
{
for(j = 0; j < N; j++)
{
cin >> arr[i][j];
}
}
//交换
cin >> r1 >> r2;
for(j = 0; j < N; j++)
{
int tmp = arr[r1-1][j];
arr[r1-1][j] = arr[r2-1][j];
arr[r2-1][j] = tmp;
}
//输出
for(i = 0; i < N; i++)
{
for(j = 0; j < N; j++)
{
cout << arr[i][j] << " ";
}
cout << endl;
}
return 0;
}
这些题目可以自己先练练手,从而更好更快的的掌握二维数组。
结语
希望这篇文章能够帮助各位能够更好的了解并掌握二维数组。作为后面码代码最常用的知识点之一,我们一定不能在这里留下疑问。同时,也要多练题巩固所学知识。下一篇我们将会对数组中玩法比较多的字符数组详细的讲解。
往期回顾:C++数组(一)(算法竞赛)
同时愿诸君能一起共渡重重浪,终见缛彩遥分地,繁光远缀天。

