GESP4级C++考试语法知识(二、指针与数组(3、二维数组与指针)

第三课 《两层小火车站------二维数组与指针》


🎯 本章学习目标

学完本章,同学们能够:

✅ 理解二维数组为什么也是连续存放

✅ 理解二维数组名字表示什么

✅ 理解为什么 map 表示第一行

✅ 理解 map+1

✅ 理解 *(map+1)

✅ 理解

复制代码
map[i][j]

为什么可以写成

复制代码
*(*(map+i)+j)

并且真正理解整个寻找过程。


第一章 数据王国建了一座火车总站

1、上一章,我们认识的是:

🚂 一列小火车。

复制代码
int train[5];

只有:

一排。


2、今天。

数据王国越来越繁荣。

(1)国王说:

一列火车已经不够用了。


(2)于是。

建了一座:

🚉 火车总站!


3、这里有很多站台。

(1)每个站台。

都停着一列小火车。


(2)例如:

复制代码
int station[2][3]=
{
    {1,2,3},
    {4,5,6}
};

4、汉克老师说:

(1)今天不要看代码。

先看车站。

复制代码
🚉 火车总站

第一站台

🚂  1   2   3

第二站台

🚂  4   5   6

(2)汉克老师问:

有几个站台?

同学们回答:

两个!


(3)每个站台有几节车厢?

三个!


(4)所以:

二维数组。

其实可以理解成:

很多行小火车组成的大车站。


第二章 原来整个车站还是连续的!


1、很多同学第一次都会认为:

第一行放在这里。

第二行放在另外一个地方。

其实不是!


2、汉克老师画出内存的分步。

(1)假设:

复制代码
地址

1000
1004
1008
1012
1016
1020

(2)排列是:

复制代码
地址

1000      1004      1008      1012      1016      1020

┌────┬────┬────┬────┬────┬────┐
│ 1  │ 2  │ 3  │ 4  │ 5  │ 6  │
└────┴────┴────┴────┴────┴────┘

(3)同学们问:

(1)咦?

怎么没有分成两排?


(2)因为:

计算机里面。

根本没有真正的:

第一排。

第二排。


(3)它只有:

一大片连续内存。


(4)只是为了方便阅读。

我们把它画成:

复制代码
第一站台

1   2   3

第二站台

4   5   6

3、汉克老师笑着说:

二维数组在内存里依然是连续存放的!

这是大家需要牢记的事。


第三章 map 到底是谁?

1、汉克老师写:

复制代码
station

问:

它是谁?


2、有的同学说:

整个二维数组。


3、没错。

但是。

对于指针来说。

它还有一个身份。


4、汉克老师重新画图。

复制代码
🚉总站

第一站台

1 2 3

第二站台

4 5 6

5、汉克老师说:

如果邮递员第一次来到车站。

是不是先找到:

第一站台?


(1)所以。

复制代码
station

↓

第一站台

不是:

数字1。

而是:

整整第一行!


(2)汉克老师强调说:

这是二维数组和一维数组最大的区别。


第四章 map+1 到哪里去了?

1、汉克老师继续。

如果:

复制代码
station

表示:

第一站台。


2、那么:

复制代码
station+1

是不是:

第二站台?


3、画图。

复制代码
🚉总站

第一站台

🚂1 2 3

↑

station

然后:

复制代码
station+1

↓

第二站台

🚂4 5 6

是不是和上一章:

复制代码
p+1

完全一样?


4、只不过。

(1)上一章一维数组。

移动的是:

一个元素。


(2)今天二维数组。

移动的是:

一整行。


(3)汉克老师再次强调:

二维数组每移动一次,是跳过一整行。


第五章 为什么不是1004?

1、有的同学这里还是会疑惑。

汉克老师。

第一行不是:

复制代码
1000

吗?

为什么:

复制代码
station+1

不是:

复制代码
1004

2、汉克老师重新画图。

复制代码
第一行

1

2

3

(1)其实占了:

三个int。


(2)也就是:

复制代码
1000

1004

1008

(3)所以:

第二行。


(4)必须从:

复制代码
1012

开始。


(5)于是:

复制代码
station+1

↓

1012

3、汉克老师总结:

(1)一维数组指针

一次走:

一个元素。


(2)二维数组指针

一次走:

一整行。


第六章 第一颗星号出现了

1、汉克老师写:

复制代码
*(station+1)

(1)问:

什么意思?


(2)大家不要急。

先拆开。

第一步。

复制代码
station+1

(3)来到:

第二站台。

复制代码
第二站台

🚂4 5 6

(4)第二步。

前面的:

复制代码
*

(5)表示:

打开。


(6)于是。

得到:

第二行。


也就是:

复制代码
4 5 6

(7)老师说:

注意!

这里。

得到的:

不是数字4。

而是:

第二行。

很多同学都会弄错。


第七章 第二颗星号出现了

1、老师继续。

如果:

复制代码
*(station+1)

到了:

第二行。


2、那么:

如果想找到:

数字5。

怎么办?


3、邮递员继续走。

写:

复制代码
*(station+1)+1

大家分析。

先得到:

第二行。


4、然后:

向后走一格。

于是:

来到:

复制代码
5

但是。

这时候。

还没有打开车厢。


5、所以。

再来一个:

复制代码
*

最终:

复制代码
*(*(station+1)+1)

就是:

复制代码
5

6、老师画完整路线。

复制代码
station

↓

第一站台

↓

+1

↓

第二站台

↓

*

↓

第二行开始

↓

+1

↓

数字5位置

↓

*

↓

5

同学们看到这里。

恍然大悟。


第八章 神奇的公式

1、汉克老师写两句代码。

复制代码
station[1][2]

还有:

复制代码
*(*(station+1)+2)

老师问:

它们一样吗?


答案:

完全一样!


2、我们分析。

复制代码
station

↓

第一行

↓

+1

↓

第二行

↓

*

↓

第二行开始

↓

+2

↓

第三个数字

↓

*

↓

6

所以:

复制代码
station[1][2]  =  6

而:

复制代码
*(*(station+1)+2)  =  6

完全相同!


第九章 一张总图彻底理解

复制代码
         station

         │

         ▼

         第一站台(第一行)

          1   2   3

          ▲

          *

          │

         +1

          ▼

         第二站台(第二行)

          4   5   6

          ▲

          *

                 +2

                  ▼

                  6

1、汉克老师说:

(1)以后。

看到:

两颗星号。

不要害怕。


(2)它们只是:

第一次:

找到这一行。

第二次:

打开这一格。


第十章 一维数组与二维数组到底有什么不同?

给大家一张总结表。

内容 一维数组 二维数组
数组名表示 第一个元素地址 第一行地址
+1 下一个元素 下一行
第一次 * 得到元素 得到一整行
第二次 * 不需要 得到真正元素

汉克老师提醒大家:

很多同学就是因为没有分清"元素"和"一整行",才觉得二维数组指针特别难。


🎮 课堂挑战

已知:

复制代码
int station[2][3] =
{
    {1,2,3},
    {4,5,6}
};

请同学们思考:

第一题

复制代码
station[0][1]

是多少?

答案:

复制代码
2

第二题

复制代码
*(*(station+0)+1)

是多少?

答案:

复制代码
2

第三题

复制代码
station[1][0]

是多少?

答案:

复制代码
4

第四题

复制代码
*(*(station+1)+0)

是多少?

答案:

复制代码
4

你发现了吗?

数组下标和指针写法,只是两种不同的表达方式,访问的始终是同一个元素。


🌟 本章总结

今天,我们走进了火车总站,发现了二维数组与一维数组最大的区别:

  • 一维数组中,数组名表示第一个元素的地址。

  • 二维数组中,数组名表示第一行的地址。

  • 一维数组每次 +1,走到下一个元素。

  • 二维数组每次 +1,走到下一行。

  • 一维数组只需要一次 * 就能取到元素。

  • 二维数组需要两次 *:第一次找到这一行,第二次找到这一行中的具体元素。


🌈 本章口诀

一维火车排成行,

车头一指到首厢。

二维车站分站台,

车头先把首行访。

一次加一换新行,

一次星号到行旁。

再走几步再开门,

真正数据眼前藏!


🎯 下一部分预告------《数组王国指针终极挑战》