引入
前面,我们介绍了多维数组地址的概念,现在我们就学习如何用指针指向多维数组的元素。
例子
我们看一个例子:
有一个 3X4 的二维数组,要求用指向元素的指针变量输出二维数组各个元素的值。
1 |
|
上面,我们让指针变量 pointer_a 指向了 a[0]的地址,然后通过不断的+1来向后移动指针,输出我们需要的内容,这种顺序输出比较简单。
如果我们需要指定输出某个元素,例如 a[i][j]的值的时候,我们可以利用这个公式:
i X m+j
i 就是目标元素的行数。
j 就是目标元素的列数。
m 是数组定义时的列数。例如上面的例子m就是4。
我们如果要直接输出 a[2][3] 这个元素,可以计算
2X4+3=11
计算出了11之后,就可以将代码改为:
1 |
|
这样我们就可以直接输出需要的元素了。
指向由 m 个元素组成的一维数组的指针变量
例子
输出一个二维数组的任何行列的元素。
1 |
|
上面我们根据公式计算出了 a[0][0] 和 a[i][j] 之间的距离,然后通过移动指针,将指针指向了 a[i][j] 并成功将其输出。
定义指向一维数组指针变量
1 |
|
在第四行,我们定义了一个
1 | int (*p)[4]; |
这表示定义了指针变量 p,并且这个 p 指向一个包含4个数组元素的一维数组。
上面例子中,我们将 a 赋值给 p ,a 是二维数组首行元素地址,此时 p 就是一个二维数组了,因为 p 是一个多维数组首行元素地址,每个地址后又包含了4个元素组成的一维数组。
指针数组和普通数组的区别
上面我们引入了一个指针数组,并且使用了该数组,那么指针数组和普通数组都有什么却别呢?
定义一个普通数组:
1 | a[4]; |
这是一个普通数组,数组名是 a ,里面包含 4 个数组元素。
定义一个指针数组:
1 | (*p)[4]; |
首先,我们先声明 p 是一个指针变量,所以用括号将 和 p 放在了一起,如果写错就会定义成一个数组指针
,例如 `p[4]`。
然后我们给这个指针变量 4 个数组元素,也就是说,这个 p 指向的变量,一定有 4 个一维数组。
p 指向的这个变量,可以是一个以为数组,也
可以是多维数组
。
多维数组就是一开始我们使用的,将一个多维数组的行地址给了 p,此时 p 就不再是一个一维数组了,而是一个多维数组。
举个例子
1 |
|
注意
上面第 5 行,不能写成 p=a,因为 p=a 是 p = &a[0],因为 a=&a[0],所以 p=&a[0],这就不对了,p=&a 是 p 等于 a 这个数组。
我们在区分一下:
p=a;
p=&a;
在前面多维数组的例子中,我们使用的是 p=a,这是为什么?
因为 p=a,在多维数组中,a=a[0]的地址
,我们把 a[0] 这个数组的地址给了 p 。
同样的在下面的一维数组中,我们直接使用&a,也是把数组的地址给 p。
综上,如果使用指针变量数组,给指针变量赋值的时候,无论是一维还是多维,赋值的时候,必须是数组的地址给指针变量。
尾巴
这是我的个人学习笔记,主要是应付考研复习使用,充斥着一些吐槽和个人观点,并不严谨,欢迎大家参考、指正。