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

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,走到下一行。

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

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


🌈 本章口诀

一维火车排成行,

车头一指到首厢。

二维车站分站台,

车头先把首行访。

一次加一换新行,

一次星号到行旁。

再走几步再开门,

真正数据眼前藏!


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